gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:09:08 25 4
gpt4 key购买 nike

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

我正在使用 (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 秒才能显示元素,因此我有足够的时间查看,是的,该元素似乎确实显示了。

如果我们删除 catch block ,NullPointerException 的堆栈跟踪如下(只有最后一行,因为其他所有内容都是公司特定的,我的老板不希望我分享它):

java.lang.NullPointerException
at org.openqa.selenium.remote.RemoteWebElement.isDisplayed(RemoteWebElement.java:323)

该跟踪导致:

public boolean isDisplayed() {
Object value = execute(DriverCommand.IS_ELEMENT_DISPLAYED, ImmutableMap.of("id", id))
.getValue();
try {
return (Boolean) value;
} catch (ClassCastException ex) {
throw new WebDriverException("Returned value cannot be converted to Boolean: " + value, ex);
}
}

错误是由 return 语句引发的,因此无论出于何种原因,执行命令都会返回 null。

我相信这些是 pom 文件的相关部分:

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>3.6.2</version>
</dependency>

如果您能在调试此问题时获得任何帮助,我们将不胜感激。

最佳答案

根本问题似乎是 ChromeDriver 版本 77 中的错误。

我正在运行的 Salesforce 正在修改内置 AsyncFunction 对象的构造函数,这导致所有 Selenium 的 Javascript 调用失败,而不仅仅是 isDisplayed。

它应该在 Chrome/ChromeDriver 版本 78 中得到修复。

引用错误和答案: https://bugs.chromium.org/p/chromedriver/issues/detail?id=3103#c6

关于java - 为什么 WebElement.isDisplayed() 给我一个 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com