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

我需要检查页面上元素的可见性。


我正在使用 (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。我在其他答案中看到,如果该元素不在页面上,那么就会发生这种情况。但在这种情况下,我知道该元素存在。

我添加了日志,告诉我:

  1. 该元素存在(实际上是三个)

  2. isDisplayed 在所有三个元素上调用

  3. 所有三个元素都会抛出 NullPointerException

另外,由于它等待 5 秒才能显示该元素,因此我有足够的时间查看,是的,该元素似乎确实已显示。


牧羊人nacy
浏览 109回答 1
1回答

幕布斯6054654

根本问题似乎是 ChromeDriver 版本 77 中的错误。我正在运行的 Salesforce 正在修改内置 AsyncFunction 对象的构造函数,这导致所有 Selenium 的 Javascript 调用失败,而不仅仅是 isDisplayed。它应该在 Chrome/ChromeDriver 版本 78 中修复。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java