Selenium,带PageFactory的Java stale元素引用
大家好,我最近开始学习selenium,我刚刚做了第一次测试。遗憾的是,该测试非常脆弱,大约30%的时间由于以下原因而失败:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
我想用PageFactory。这是一种对付这种情况的方法。然而,它似乎不起作用。下面是我如何实现它的
public class PageObject {
public PageObject() {
final WebDriver webDriver = WebDriverManager.getDriverFromPool();
PageFactory.initElements(new AjaxElementLocatorFactory(webDriver, 10), this);
}
}
class Frontpage extends PageObject {
@FindBy(id="search-results")
private WebElement results;
@FindBy(id="search")
private WebElement searchBox;
public Frontpage() {
super();
}
public void resultPrinter() {
List<WebElement> resultList = results.findElements(By.tagName("tr"));
for(WebElement element : resultList) {
System.out.println(element.getAttribute("id")); //this part is flaky
}
}
public void searchForUser(String user) {
searchBox.click();
searchBox.clear();
searchBox.sendKeys(user);
}
}
下面是它的使用方法:
public void userSearchTest() {
Frontpage fp = new Frontpage();
fp.searchForUser("Adam");
}
public void validateUserResult() {
Frontpage fp = new Frontpage();
fp.resultPrinter(); //fails here sometimes
}
# 1 楼答案
这是由动态DOM引起的
启动
List<WebElement> resultList = results.findElements(By.tagName("tr"));
命令时,它会根据您提供的标记名返回一些元素列表。但是,这发生在DOM构建过程中,因此当您尝试迭代这些元素时,其中的一部分可能会消失/更改,因此您所引用的元素不再存在处理动态DOM页面最简单的方法是,每次重新加载/重建DOM/页面时,都要提供足够的延迟时间,并且只有在这之后才能处理它的元素