在Selenium Java中流行

时间:2016-06-28 04:58:21

标签: java selenium selenium-webdriver automation

有人可以解释这个“流利的”是如何运作的,以及它的结构吗?

Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);

wait.until(new com.google.common.base.Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
    return null;
}
});

5 个答案:

答案 0 :(得分:1)

FluentWait实例定义等待条件的最长时间。代码中的以下语句定义了等待时间。

.withTimeout(60, SECONDS)

以及用于检查条件的频率。以下定义了频率

.pollingEvery(5, TimeUnit.SECONDS)

此外,用户可以在等待时将等待配置为忽略特定类型的异常,例如在搜索页面上的元素时使用NoSuchElementExceptions。以下是忽略&#34; NoSuchElementExceptions&#34;

.ignoring(NoSuchElementException.class);

何时使用FluentWait:当您尝试测试每x秒/分钟后可能出现的元素时

答案 1 :(得分:1)

这里详细解释了您想要理解的内容

http://toolsqa.com/selenium-webdriver/advance-webdriver-waits/

http://toolsqa.com/selenium-webdriver/wait-commands/

更多解释:

com.google.common.base.Function是一个通用界面。您已经学习了Java泛型,以了解here

中的通用接口/类

从您的代码中,当我们说com.google.common.base.Function时,这意味着此函数的实现将接受WebDriver作为输入参数并返回一个布尔值。

WebDriverWait.Until方法将一次又一次地调用您的Function.apply方法,直到您应用方法返回true。一旦它返回true,WebDriverWait将假定您的等待结束逻辑已经成功并且它将等待。

目前你的等待函数没有做任何事情,只是等待超时发生。这必须在最后抛出一个TimeOutException。

你必须编写的等待逻辑应该写在.apply方法中。一旦条件满足或不满足,则返回true或false表示布尔值或非null值以及引用类型的空值。

答案 2 :(得分:0)

我在单击一个按钮的程序中使用了流畅的等待,然后会出现一个特定的Web元素。仅在刷新页面后才能显示该网络元素,并且不确定何时显示该网络元素。因此,在下面的代码中,我正在使用Fluent等待。在这里pollingEvery意味着我的代码将每10秒检查一次元素的存在,直到360秒(6分钟)。元素可能会在100秒后出现,然后在100秒后,代码将移至下一个执行步骤。有关更多详细信息,请参阅-https://configureselenium.blogspot.com/2019/12/what-is-fluent-wait-in-selenium.html

等待等待=新FluentWait(driver).withTimeout(Duration.ofSeconds(360)) .pollingEvery(Duration.ofSeconds(10))。ignoring(NoSuchElementException.class);

    WebElement LinkAlert= wait.until(new Function<WebDriver, WebElement>() {

        public WebElement apply(WebDriver driver) {
            driver.navigate().refresh();
            System.out.println("Page is refreshed");
            WebElement LinkAlert= driver
                    .findElement(By.xpath("//span[contains(text(),'alert-visibility')]"));
            return LinkAlert;
        }
    });
    Alert1 = LinkAlert.isDisplayed();
    Assert.assertTrue(Alert1);

}

答案 3 :(得分:0)

一个比较老的问题,但是:

Wait<WebDriver> wait = new FluentWait<>(driver) // <-- Setting object of WebDriver type
.withTimeout(60, TimeUnit.SECONDS) // <-- configuring waiter properties
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);

wait.until(new com.google.common.base.Function<WebDriver, Boolean>() { // <-- configuring conditional function
@Override
public Boolean apply(WebDriver driver) { // <-- it works with object of WebDriver type because we specified that in the very first line of the snippet
    return null;
}
});

Wait<WebDriver> wait = new FluentWait<>(driver)意味着您将创建一个将使用WebDriver对象的服务员,该对象将在传递给其until方法的条件函数中使用。

有关how FluentWait works and how to use it with any type of event (not only Selenium events)

的更多详细信息

答案 4 :(得分:0)

只是添加一些更改,因为 withTimeout(int, TimeUnit)pollingEvery(int, TimeUnit) 已弃用:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(Duration.ofSeconds(waitTimeout))
            .pollingEvery(Duration.ofSeconds(pollingEvery))
            .ignoring(NoSuchElementException.class);