有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    这是由动态DOM引起的
    启动 List<WebElement> resultList = results.findElements(By.tagName("tr"));命令时,它会根据您提供的标记名返回一些元素列表。但是,这发生在DOM构建过程中,因此当您尝试迭代这些元素时,其中的一部分可能会消失/更改,因此您所引用的元素不再存在
    处理动态DOM页面最简单的方法是,每次重新加载/重建DOM/页面时,都要提供足够的延迟时间,并且只有在这之后才能处理它的元素