我在 SO 上遇到了一个答案,其中共享了两种 Fluent 等待方法,其中只有 1 种轮询其他方法不这样做。
第一:
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)));
第二个1先轮询不。还在控制台中打印它尝试了30秒,间隔为5秒。
我不担心为什么它不在控制台打印,我的问题是
现在我两者都用,有时是1号,有时是2号。
没有偏好,我只是期望,因为它是流畅的,等待它应该这样表现。
我做错了什么?
在第一个场景中,轮询没有发生,因为您返回的是非空值,这是因为
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;
}
}
});
在second scna Rio:for expected conditions . presenceofallementslocatedby(By locator)中,用于检查网页上是否至少存在一个元素的预期值。