我使用 Java 在 Selenium WebDriver 中编写了一些测试用例,并在网格(集线器和多个节点)上执行它们。我注意到一些测试用例由于 NoSuchElementException
而失败。避免 NoSuchElementException
并确保始终找到该元素的最佳和可靠方法是什么?
原文由 Parminder Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议
我使用 Java 在 Selenium WebDriver 中编写了一些测试用例,并在网格(集线器和多个节点)上执行它们。我注意到一些测试用例由于 NoSuchElementException
而失败。避免 NoSuchElementException
并确保始终找到该元素的最佳和可靠方法是什么?
原文由 Parminder Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议
我完全同意上面的 Petr Mensik。你永远不能说元素是否存在的问题。您应该清楚地了解为什么会发生。根据我的经验,我应该说它的发生是由于以下原因:
NoSuchElementException
因此,恕我直言,使用一个函数调用来处理所有这三种情况的最可靠方法是使用 fluentWait
正如 Amith003 所建议的那样。
所以代码如下:
让你的元素有定位器:
String elLocXpath= "..blablabla";
WebElement myButton= fluentWait(By.xpath(elLocXpath));
myButton.click();
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(org.openqa.selenium.NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo;
};
此外,如果您的目的是使用 try{} catch{}
块进行健壮的代码包装 fluentWait()
。
也不要忘记
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
这也很有用。
因此,总结所有提到的内容,如果您想避免 NoElement
异常,只需正确处理它,因为没有人可以确保页面上的元素存在。
希望现在你更清楚了。问候
原文由 eugene.polschikov 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
2 回答777 阅读✓ 已解决
2 回答757 阅读✓ 已解决
2 回答644 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
1 回答1.3k 阅读
您永远无法确定会找到该元素,实际上这是功能测试的目的 - 告诉您页面上是否有任何更改。但是绝对有帮助的一件事是添加等待经常导致
NoSuchElementException
的元素—