Java 为什么WebElement.isDisplayed()会给我一个NullPointerException
我需要检查页面上某个元素的可见性 我正在使用(psuedocode)wait.until(ExpectedCondition.visibilityOfElement(locator)) 但是,默认的ExpectedCondition只检查DOM中与定位器匹配的第一个元素 我的定位器不可能精确到只匹配一个元素(这是我被要求自动化的一个限制,无法更改)。但,在所发现的元素中,任何展示出来的元素都是公平的 因此,我使用一个定制的ExpectedCondition,遍历找到的元素,查找显示的任何元素,并返回找到的第一个元素 代码如下:Java 为什么WebElement.isDisplayed()会给我一个NullPointerException,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我需要检查页面上某个元素的可见性 我正在使用(psuedocode)wait.until(ExpectedCondition.visibilityOfElement(locator)) 但是,默认的ExpectedCondition只检查DOM中与定位器匹配的第一个元素 我的定位器不可能精确到只匹配一个元素(这是我被要求自动化的一个限制,无法更改)。但,在所发现的元素中,任何展示出来的元素都是公平的 因此,我使用一个定制的ExpectedCondition,遍历找到的元素,查找显示的任何元素,并
公共WebElement WaitForElementToBeviible(WebDriver-Driver,按定位器){
返回新的WebDriverWait(驱动程序,标准等待时间)
.轮询间隔(1,时间单位。秒)
.带超时(5,时间单位为秒)
.忽略(NoSuchElementException.class)
.直到((预期条件)驾驶员->{
列表els=驱动程序findElements(定位器);
对于(WebElement el:els){
试一试{
if(el.isDisplayed()){
返回el;
}
}捕获(StaleElementReferenceException e){
/*忽略异常*/
}捕获(NullPointerException e){
System.out.println(“引发NullPointerException”);
}
}
返回null;
});
}
但是,在某些情况下,调用el.isDisplayed会引发NullPointerException。我在其他答案中看到,如果元素不在页面上,则会发生这种情况。但在这种情况下,我知道元素是存在的
我添加的日志告诉我:
java.lang.NullPointerException
在org.openqa.selenium.remote.RemoteWebElement.isDisplayed上(RemoteWebElement.java:323)
这一线索导致:
public boolean显示(){
Object value=execute(DriverCommand.IS_元素_显示,ImmutableMap.of(“id”,id))
.getValue();
试一试{
返回(布尔)值;
}捕获(ClassCastException例外){
抛出新的WebDriverException(“返回值不能转换为布尔值:”+值,ex);
}
}
该错误由return语句引发,因此无论出于何种原因,execute命令都返回null
我相信以下是pom文件的相关部分:
org.seleniumhq.selenium
硒爪哇
3.10.0
io.github.bonigarcia
webdrivermanager
3.6.2
如果您能协助调试此问题,我们将不胜感激。潜在问题似乎是ChromeDriver 77版中的一个bug Salesforce正在修改内置AsyncFunction对象的构造函数,这导致Selenium的所有Javascript调用失败,而不仅仅是isDisplayed 应在Chrome/ChromeDriver的78版中进行固定 参考错误和答案:
是否存在对您有用的“Allelements Slocatedby的可见性”预期条件?不幸的是,该条件不起作用。它等待每个匹配元素都可见,但在我的例子中,问题是我知道其中一些元素可能不可见。您是否尝试过Java
流
和过滤器
?例如。我现在没有IDE,但您应该能够执行类似于List els=driver.findElements(locator.stream().filter(e->e.isDisplayed()).collect(Collectors.toList())的操作代码><然后,“代码>els
将包含显示的与定位器匹配的任何web元素。从那里,您可以使用els.get(0)
获取第一个显示的元素。@JeffC刚刚尝试了它,但不幸的是问题仍然存在。筛选器调用isDisplay后,仍然会抛出NullPointerException。