为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 WebElement.isDisplayed() 给我一个

为什么 WebElement.isDisplayed() 给我一个

牧羊人nacy 2023-09-06 15:02:09
我需要检查页面上元素的可见性。我正在使用 (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 中修复。

查看完整回答
反对 回复 2023-09-06
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信