我需要检查页面上元素的可见性。我正在使用 (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 秒才能显示该元素,因此我有足够的时间查看,是的,该元素似乎确实已显示。
1 回答
幕布斯6054654
TA贡献1876条经验 获得超7个赞
根本问题似乎是 ChromeDriver 版本 77 中的错误。
我正在运行的 Salesforce 正在修改内置 AsyncFunction 对象的构造函数,这导致所有 Selenium 的 Javascript 调用失败,而不仅仅是 isDisplayed。
它应该在 Chrome/ChromeDriver 版本 78 中修复。
添加回答
举报
0/150
提交
取消