等待元素可以被编码为

WebElement foo = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("foo")));


在FluentWait的文档中,下面给出了一个示例,其中不包括超时,轮询间隔和异常忽略的定义。

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
 public WebElement apply(WebDriver driver) {
   return driver.findElement(By.id("foo"));
 }
});


两者有什么区别?任何额外的好处?

我搜索了lambda表达式,功能接口。但是我不太了解图片。

最佳答案

WebDriverWait

WebDriverWait是使用WebDriver实例的FluentWait的特殊化。

构造函数是:


WebDriverWait(WebDriver driver, java.time.Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
WebDriverWait(WebDriver driver, long timeOutInSeconds):引发此Wait将忽略默认情况下在“直到”条件下遇到(抛出)的NotFoundException实例,并立即传播所有其他实例。
WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis):引发此Wait将忽略默认情况下在“直到”条件下遇到(抛出)的NotFoundException实例,并立即传播所有其他实例。




WebDriverWait的Lambda实现

范例A:

(new WebDriverWait(driver(), 5))
    .until(new ExpectedCondition<WebElement>() {
        public WebElement apply(WebDriver d) {
            return d.findElement(By.linkText(""));
        }
    });


范例B:

WebElement wer = new WebDriverWait(driver, 5).until((WebDriver dr1) -> dr1.findElement(By.id("q")));


范例C:

(new WebDriverWait(driver(), 5)).until((driver) -> driver.findElement(By.linkText("Google")));




流利的等待

FluentWaitWait接口的实现,可以动态配置其超时和轮询间隔。

每个FluentWait实例都定义了等待条件的最长时间,以及检查条件的频率。此外,用户可以配置等待以在等待时忽略特定类型的异常,例如在搜索页面上的元素时的NoSuchElementExceptions

用法示例:

// Waiting 30 seconds for an element to be present on the page, checking for its presence once every 500 milliseconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(By.name("q"));
    }
});



  注意:此类不提供线程安全保证。


您可以在讨论Selenium Webdriver 3.0.1: Selenium showing error for FluentWait Class中找到FluentWait的工作示例。

10-06 07:16