- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要检查页面上元素的可见性。
我正在使用 (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。我在其他答案中看到,如果该元素不在页面上,那么就会发生这种情况。但在这种情况下,我知道该元素存在。
我添加的日志告诉我:
此外,由于它等待 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/
ArrayList corousalItems= new ArrayList<>(); List listText= driver.findElements(By.cssSelector("Cor
我正在学习 Selenium,我有一个问题,假设我们有以下内容: 我可以使用带有 的 Css 选择器来选择包装元素列表.wrapper .所以,假设我有这些元素,我该如何选
我正在使用 Selenium WebDriver 和 Java。我正在尝试创建一个循环访问 WebElements 列表的方法,以返回包含文本“Ooga Booga”的第一个 WebElement,或
我正在尝试使用 Selenium 获取另一个提取元素内的元素。但我得到了意想不到的结果。例如,下面的代码在循环中返回相同的“数据时间”和推文时间。请注意“data-item-id”如何不同,但“dat
对源代码进行了简短的扫描,不确定最佳做法是什么。 例如,假设我有一个页面对象“DummyPage”,它有两个面板元素TopPanel 和BottomPanel。每个面板都有一些元素,这些元素由 Top
List fields = (List) driver.findElement(By.xpath("//input[@type='text']")); System.out.println(field
我想在 List 中找到 WebElement通过文本。我的方法有这样的参数:List webElements, String text .对于匹配文本,我更喜欢使用 javaslang图书馆。所以,
如何比较两个 selenium WebElements 看它们是否相同? 首先,我检索了 input_fields 和 first_input 元素的列表: self.input_fields = d
我正在使用 Appium,我想打印列表中元素的名称。我正在使用以下代码 List list = getDriver().findElementsByXPath(getLocator(Locators.
任何人都可以帮助我了解如何使用这两个函数来获取任何 CSS 属性的值。 最佳答案 如果有特定的标签如下 driver.getElement(By.tagName("img")).getAttribu
我正在从 facebook 获取日期网络元素,并使用下面的代码循环它。 public class select_facebook { public static void main(Strin
所以我尝试使用 XPath 从一个 webelement 到另一个 webelement。这就是 webelement 所在的路径,我通过使用“findElementsByClassName”找到它。
我想在 YouTube 评论页面上按此顺序单击这三个不同的网络元素 showmorebutton、viewrepliesbutton、readmorebutton(例如 https://www.you
如何在webelement列表中存储webelement?我已经为 webelement 创建列表并在 add 方法中传递 webelement obj,但系统显示空异常。Java代码:List el
我已经弄清楚如何使用这篇 Stack overflow 帖子在 python 中使用 Selenium 查找元素的子元素。 Selenium Get WebElement inside a WebEl
我创建了这个测试脚本来测试网站。问题是,有时我可以单击编辑按钮,但有时我会收到同一按钮的 NoElementFoundException 异常。我在论坛上搜索了相同类型的问题,并按照建议更改了代码,但
我有个问题。 是什么让 FirefoxDriver 能够找到 WebElements 并在 java 代码中单击它们,但是当使用 HtmlUnitDriver 运行相同的代码时,找不到相同的 WebE
我编写了一个java类(CustomerHistoryMapping),其中包含一个HashMap(String,WebElement),如下面的代码(代码的第一部分)我的总体目标是能够使用给定的 W
我对 Selenium 测试还很陌生,所以如果我的问题听起来很简单,我提前道歉。 我正在使用 Java 和 Selenium 编写测试。有时我需要单击 WebElement(例如按钮)。如果我使用 e
Page page = new Page(); page.populateProductList( driver.findElement( By.xpath("//div[@id='my_25_pro
我是一名优秀的程序员,十分优秀!