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
错误
答案 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"));
...
无论如何,我必须在删除用户后刷新页面。 希望这可以帮助解决类似问题的人。 谢谢你的回答! ;)