有人可以解释这个“流利的”是如何运作的,以及它的结构吗?
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;
}
});
答案 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);