Selenium Webdriver。错误'org.openqa.selenium.StaleElementReferenceException:元素不再有效'

时间:2014-01-31 14:02:56

标签: java selenium selenium-webdriver

Selenium Webdriver + java。 我的代码:

public List<UserData> getUsers() {
        List<UserData> users = new ArrayList<UserData>();
        WebElement userList = driver.findElement(By.id("Users"));
        isElementDisplayed(By.xpath("//table[@id='Users']/*/tr[position() > 1]"), 10);
        List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]"));
        for (WebElement tableRow : tableRows) {     
            List<WebElement> cells  = tableRow.findElements(By.tagName("td"));
            UserData user = new UserData();
            user.fio = cells.get(2).getText();
            user.login = cells.get(3).getText();
            user.rank = cells.get(4).getText();
            user.cabinet = cells.get(5).getText();
            users.add(user);
            }       
        return users;

}

从表中删除用户后,方法抛出:

  

org.openqa.selenium.StaleElementReferenceException:元素为否   更长的有效期

这里:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]"));

如何在不刷新页面的情况下修复此错误?

请注意! 这不是

Element is no longer attached to the DOM

错误

2 个答案:

答案 0 :(得分:0)

我在想删除用户通过JavaScript重建部分DOM。因此,虽然页面没有重新加载,但html已经改变,导致Selenium抛出过时元素。如果重建了html,Selenium说所有以前发现的元素现在都已过时,必须重新构建。

即使原始元素仍在新刷新的DOM中,也会发生这种情况。如果它已被重建,Selenium认为最好是安全,然后抱歉,因此使一切无效。

答案 1 :(得分:0)

我可以部分解决这个问题。 在线:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]"));

我使用了我的方法waitForStableElements

...
List<WebElement> tableRows = waitForStableElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]"));
...
        public List<WebElement> waitForStableElements(final By locator) {
            return new WebDriverWait(driver, 10).until(new ExpectedCondition<List<WebElement>>(){
              public List<WebElement> apply(WebDriver d) {
                try {
                  return d.findElements(locator);
                } catch (StaleElementReferenceException ex) {
                  return null;
                }
              }
            });
          }

工作正常。 但是,无论如何都会抛出'StaleElementReferenceException'错误:

...
List<WebElement> cells  = tableRow.findElements(By.tagName("td"));
... 

无论如何,我必须在删除用户后刷新页面。 希望这可以帮助解决类似问题的人。 谢谢你的回答! ;)