我有一个页面,其中有一个动态表,它会定期更新新数据。我想做的是点击一个按钮并重新加载页面,比如说每3秒加载一次,直到该表中的元素出现。我知道我想要显示的元素的xpath,但我就是无法使用FluentWait使其工作。我试着按照下面的代码进行配置,但当我调用该方法时,它会非常快速地点击按钮,而不考虑pollingEvery配置,也没有给页面足够的时间来完全重新加载它自己。代码可以在下面签出。
我不确定的是退货声明。如果我只需要点击一个按钮,直到那个元素出现,我就不能完全理解它应该是什么。
我错过了什么?
public void clickButtonUntilElementIsDisplayed(WebElement elementToBeClicked, String xPathOfElementToBeDisplayed){
FluentWait<WebDriver> wait = new FluentWait<>(getDriver());
wait.pollingEvery(Duration.ofSeconds(5));
wait.withTimeout(Duration.ofSeconds(200));
wait.ignoring(NoSuchElementException.class);
Function<WebDriver,WebElement> clickUntilAppearance = webDriver -> {
while(webDriver.findElements(By.xpath(xPathOfElementToBeDisplayed)).isEmpty())
click(elementToBeClicked);
return webDriver.findElement(By.xpath(xPathOfElementToBeDisplayed));
};
wait.until(clickUntilAppearance);
}
可以在其中找到此方法的类扩展了Page
函数接口的返回类型需要更改。有两种情况下,功能接口将保持循环。
- 返回的值为null
- 它抛出了一个异常,作为忽略的一部分
不要使用while。如果条件允许,请使用。对于每次轮询,将执行每个此函数接口。
Function<WebDriver,WebElement> clickUntilAppearance = webDriver -> {
List<WebElement> tableElements = webDriver.findElements(By.xpath(xPathOfElementToBeDisplayed));
if(tableElements.isEmpty()) {
click(elementToBeClicked);
return null;
} else {
return tableElements.get(0);
}
};
WebDriverWait w=新的WebDriverWait(驱动程序,5(;//5秒w.until(ExpectedConditions.visibilityOfElementLocated(By.csSelector("element_location"((;