2

元素的等待可以编码为

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 表达式,函数式接口。但我并没有完全明白这张照片。

4

2 回答 2

2

WebDriverWait

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

构造函数是:


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讨论中找到FluentWait的工作示例:Selenium 显示 FluentWait 类的错误

于 2019-02-06T14:58:14.400 回答
0

您上面提到的两种方法之间的区别在于,第二种方法将在内存中创建一个额外的类(也称为匿名内部类),而第一种方法不会做这样的事情。如果真的需要“函数”接口的实现,创建一个 lambda 和上面提到的那样,你会看到相同的效果,在这种情况下它不会创建一个新的内部类实例。相反,将通过“InvokeDynamic”调用接口方法。

于 2021-08-16T17:49:29.140 回答