Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么WebElement.isDisplayed()会给我一个NullPointerException_Java_Selenium_Selenium Webdriver - Fatal编程技术网

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

Java 为什么WebElement.isDisplayed()会给我一个NullPointerException,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我需要检查页面上某个元素的可见性 我正在使用(psuedocode)wait.until(ExpectedCondition.visibilityOfElement(locator)) 但是,默认的ExpectedCondition只检查DOM中与定位器匹配的第一个元素 我的定位器不可能精确到只匹配一个元素(这是我被要求自动化的一个限制,无法更改)。但,在所发现的元素中,任何展示出来的元素都是公平的 因此,我使用一个定制的ExpectedCondition,遍历找到的元素,查找显示的任何元素,并

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

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

我添加的日志告诉我:

  • 元素存在(事实上,有三个元素)
  • isDisplayed在所有三个元素上都被调用
  • 这三个元素都抛出NullPointerException
  • 此外,由于它要等待5秒钟才能显示元素,因此我有足够的时间查看并看到,是的,元素似乎确实显示出来了

    如果我们删除catch块,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。