1

在 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,因为我想控制轮询超时。

4

2 回答 2

2

一点背景:

流利的等待

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

WebDriverWait

WebDriverWait是使用 WebDriver 实例的定制版FluentWait 。

您可以在这些QAWebDriverWait和.FluentWaitImplicit vs Explicit vs Fluent WaitDifferences 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并且仍然可以控制轮询间隔。

注意:为了使您的程序逻辑简单易懂,除非绝对必要,否则不要使用直到WebDriverWaitFluent Wait

琐事:

为了进一步了解Fluent Wait您可以关注讨论Selenium Webdriver 3.0.1-[Eclipse-Java-Chrome]: Selenium showing error for FluentWait Class

于 2018-01-19T09:18:53.563 回答
0

是的,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")));
于 2018-01-19T09:08:44.930 回答