我需要比较几个子页面上显示的表格中的元素(仅来自第一列的值)。
使用列表我创建了一个大列表(其中包含前95个元素)。不幸的是,当我开始比较它们时,我的测试结束时出现错误消息“org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档”
当我的元素少于10个(一页上只有一个表)时,一切正常。
有人知道我的代码应该更改什么吗?
List<WebElement> pagesList = webDriver.findElements(By.cssSelector("#div_table > ul > li"));
if (pagesList.size() > 0) {
boolean nextPagePresent = true;
List<String> documentsList = webDriver.findElements(By.cssSelector("#table > tbody > tr > td:nth-child(1)"));
while (nextPagePresent == true) {
try {
nextPagePresent = webDriver.findElements(By.cssSelector("#div_table > ul > li.nextLink")).size() > 0;
documentsList += webDriver.findElements(By.cssSelector("#table > tbody > tr > td:nth-child(1)"));
if(nextPagePresent == true) {
webDriver.findElement(By.cssSelector("#div_table > ul > li.nextLink")).click();
}
} catch (org.openqa.selenium.NoSuchElementException ex) {
throw new Exception('Page not found');
}
}
documentsList.removeRange(0, 10);
for (int i = 0; i < documentsList.size(); i++) {
for (int k = i + 1; k < documentsList.size(); k++) {
if (documentsList.get(i).getText().equals(documentsList.get(k).getText())) {
log.info(documentsList.get(i).getText())
assert false;
}
}
}
} else {
List<String> documentsList = webDriver.findElements(By.cssSelector("#table > tbody > tr > td:nth-child(1)"));
for (int i = 0; i < documentsList.size(); i++) {
for (int k = i + 1; k < documentsList.size(); k++) {
if (documentsList.get(i).getText().equals(documentsList.get(k).getText())) {
assert false;
}
}
}
}
答案 0 :(得分:1)
由于您的元素位于多个页面上并且您实际在它们之间切换,因此您预期会遇到例外情况。
基本上,您获得的异常表示,即它表示无法从WebElement检索文本,这在逻辑上是正确的,因为该元素不再附加到DOM模型。
您可以做的是从页面上当前可见的元素中提取文本,并在您从可以比较它的所有页面中的所有元素中提取文本后将其放入单独的List<String>,
。
因此,行动顺序应如下所示:
有关例外的更详细信息,请访问:https://www.seleniumhq.org/exceptions/stale_element_reference.jsp
P.S。应该避免使用内置断言,考虑使用测试java测试库(如jUnit或TestNg)或断言特定库(如assert4j),它会为您提供更大的灵活性。