我在SO上遇到了一个答案,其中只有一种会轮询,而另一种不会。
第一
List<WebElement> eList = null;
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5)).ignoring(NoSuchElementException.class);
eList = (List<WebElement>) wait.until(new Function<WebDriver, List<WebElement>>() {
public List<WebElement> apply(WebDriver driver) {
return driver.findElements(By.xpath(xpathExpression)));
}
});
第二:
只需更改#1中的内容
eList = (List<WebElement>) wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xpathExpression)));
第二个不会先进行轮询。还会在尝试以30秒为间隔5秒的控制台中打印
我不担心为什么不能在控制台中打印,我的问题是
现在我最终会同时使用#1和#2。
我没有期望,因为它很流畅,所以它应该表现得如此。
我在做什么错了?
答案 0 :(得分:0)
在第一种情况下,由于返回的是非null值,所以没有进行轮询,这是因为
1. findElements()方法返回所有WebElement的列表,如果没有匹配项,则返回一个空列表,并且
2. until()方法将等待,直到条件计算得出的值既不为null也不为false。
因此,由于首先,您可以返回null以保持轮询,直到找到所需的元素为止(这是当列表大小大于零时) 您可以尝试以下代码
eList = (List<WebElement>) wait.until(new Function<WebDriver, List<WebElement>>() {
public List<WebElement> apply(WebDriver driver) {
List<WebElement> list=driver.findElements(By.xpath(xpathExpression));
if(list.size()==0){
return null;
}else{
return list;
}
}
});
在第二个方案中:对于ExpectedConditions.presenceOfAllElementsLocatedBy(By locator),期望检查网页上是否存在至少一个元素。