我正在尝试根据列数据访问某个行,然后单击该行中的链接。我该如何实现?我已经坚持了5天。
我是Selenium的新手,但是我尝试遍历元素列表,但随后会得到StaleElementReferenceException:stale元素未附加到DOM。
我在硒网站上看到了一些与此类似的问题,这意味着元素或页面已更新,因此对该元素的引用可能不正确,因此我尝试了一些操作:
我尝试使用“预期条件”刷新,然后重新初始化该元素,但这仅在某些时候有效,并且我仍然会收到错误消息
我尝试添加尝试并捕获功能,但这似乎不起作用,并且我也不能完全表明我是否正确执行了操作。
我也想看看是否可以抛弃for循环,而只是在列表中找到一个元素,该元素具有使用硒的“ contain”所需的3个属性,但是我不确定这是否可以做到
该表的结构如下:
<div _ngcontent-c9 class="no-wrap" id="SummaryList">
<div class="row">
<div class="col">
<a>Some Text</a>
</div>
<div class="col">
Value1
</div>
<div class="col">
Value2
</div>
<div class="col">
Value3
</div>
</div>
<div class="row">
<div class="col">
<a>Some Text</a>
</div>
<div class="col">
Value1A
</div>
<div class="col">
Value2B
</div>
<div class="col">
Value3C
</div>
</div>
</div>
给我问题的函数-pseudocode
public void validateInfo(String val1, String val2, String val3){
List<WebElement> rowDetail = driver.findElements(By.xpath("//*[@id=\"SummaryList\"]/div/div"));
int rowSize = rowDetail.size();
for(int i = 0; i<rowSize; i++){
rowDetail = driver.findElements(By.xpath("//*[@id=\"SummaryList\"]/div/div"));
//if row values equal to val1,val2&val3
//then click the a tag in that row and break
}
}
我希望找到传入3个参数的正确行,然后单击该行中的a标签以继续进行下一步。
错误:org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档
最佳答案
StaleElementReferenceException意味着您的DOM树已更改,并且找到的元素已过期。
尝试以下代码,它将重试单击,直到成功或超时:
public void validateInfo(String val1, String val2, String val3){
new WebDriverWait(driver, timeout)
.ignoring(StaleElementReferenceException.class)
.until(new Predicate<WebDriver>() {
@Override
public boolean apply(@Nullable WebDriver driver) {
List<WebElement> rowDetail = driver.findElements(By.xpath("//*[@id=\"SummaryList\"]/div/div"));
int rowSize = rowDetail.size();
for(int i = 0; i<rowSize; i++){
WebElement element = rowDetail.get(i);
if (element.getAttribute("value").startWith(val)) {
rowDetail.get(i).click();
}
// rowDetail = driver.findElements(By.xpath("//*[@id=\"SummaryList\"]/div/div"));
//if row values equal to val1,val2&val3
//then click the a tag in that row and break
}
return true;
}
});
}