如何将内置的 ExpectedConditions 与 FluentWait 一起使用?

How to use built-in ExpectedConditions with FluentWait?

在 Selenium (Java) 中,我想将 ExpectedConditions 与 FluentWait 一起使用。我正在尝试以下不起作用的代码。它不是在等待元素出现在 DOM.

有人可以帮忙吗?

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                    .withTimeout(10, TimeUnit.SECONDS)
                    .pollingEvery(1, TimeUnit.SECONDS);

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("mybutton")));

注意:我已经用 WebDriverWait 试过了,它是工作文件。我正在尝试使用 FluentWait,因为我想控制轮询超时。

是的,NarendraR 说的是正确的。当您为 FluentWait 创建对象时,使用相同的对象来写入 ExpectedConditions。

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(10, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);
wait.unitl(ExpectedConditions.presenceOfElementLocated(By.id("mybutton")));

一些背景知识:

流畅等待

Fluent Wait is the implementation of the Wait 界面,用户可以动态配置其超时和轮询间隔。 FluentWait 实例定义等待条件的最长时间以及检查条件的频率。用户还可以配置等待在等待时忽略特定类型的异常,例如在页面上搜索元素时NoSuchElementExceptions

WebDriverWait

WebDriverWait is the tailor-made version of FluentWait 使用 WebDriver 实例。

您可以在这两个 QA Implicit vs Explicit vs Fluent Wait and Differences between impilicit, explicit and fluentwait.

预期条件

ExpectedConditions 是定制的固定条件,通常在 webdriver 测试中很有用。


根据你的问题,你是 trying with FluentWait since you want to control polling timeout,你仍然可以通过 WebDriverWait 实现相同的效果,如下所示:

  • WebDriverWait 有 3 个 构造函数 其中之一是 :

    WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
    
  • 详情:

    public WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
    
    This wait will ignore instances of NotFoundException that are encountered by default in the `until` condition, and immediately propagate all others. You can also add more to the ignore list by calling ignoring(exceptions to add).
    
    Parameters:
    driver - The WebDriver instance to pass to the expected conditions
    timeOutInSeconds - The timeout in seconds when an expectation is called
    sleepInMillis - The duration in milliseconds to sleep between polls (polling interval).
    

解决方案:

可以使用上面提到的WebDriverWait构造函数,仍然可以控制轮询间隔。

Note : To keep your program logic simple and understandable use WebDriverWait instead of Fluent Wait untill and unless absolute necessary.

琐事:

进一步了解Fluent Wait可以关注讨论