我需要检查页面上元素的可见性。
我正在使用 (psuedocode) wait.until(ExpectedCondition.visibilityOfElement(locator));
但是,默认的 ExpectedCondition 仅检查 DOM 中与定位器匹配的第一个元素。
我的定位器无法足够具体以仅匹配一个元素(这是我被要求自动化的限制,并且无法更改)。但是,在发现的元素中,任何显示的元素都是公平的游戏。
因此,我使用自定义 ExpectedCondition,循环查找到的元素,查找显示的任何元素,然后返回找到的第一个元素。
代码如下:
public WebElement WaitForElementToBeVisible(WebDriver theDriver, By locator) {
return new WebDriverWait(theDriver, STANDARD_WAIT_TIME)
.pollingEvery(1, TimeUnit.SECONDS)
.withTimeout(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class)
.until((ExpectedCondition<WebElement>) driver -> {
List<WebElement> els = driver.findElements(locator);
for (WebElement el : els) {
try {
if (el.isDisplayed()) {
return el;
}
} catch (StaleElementReferenceException e) {
/* Ignore Exception */
} catch (NullPointerException e) {
System.out.println("NullPointerException thrown");
}
}
return null;
});
}
但是,在某些情况下,对 el.isDisplayed 的调用会引发 NullPointerException。我在其他答案中看到,如果该元素不在页面上,那么就会发生这种情况。但在这种情况下,我知道该元素存在。
我添加了日志,告诉我:
该元素存在(实际上是三个)
isDisplayed 在所有三个元素上调用
所有三个元素都会抛出 NullPointerException
另外,由于它等待 5 秒才能显示该元素,因此我有足够的时间查看,是的,该元素似乎确实已显示。
幕布斯6054654
相关分类