我正在尝试根据列数据访问某一行,然后单击该行中的链接。我如何实现这一点?我已经坚持了 5 天了。
我是Selenium的新手,但我尝试遍历元素列表,但随后会得到一个StaleElementReferenceException:过时的元素没有附加到DOM。
我在 selenium 网站上看到其他一些与此类似的问题,这意味着元素或页面已更新,因此对该元素的引用可能不正确,所以我尝试了一些事情:
我尝试使用预期条件刷新,然后重新初始化元素,但这仅在有时有效,我仍然会收到错误 我尝试添加尝试和捕获,但这似乎不起作用,我也没有完全显示我是否正确。
我还想看看我是否可以一起抛弃 for 循环,并在列表中找到一个元素,该元素具有我需要的 3 个属性,使用 Selenium 的"包含",但我不确定这是否是它可以做的事情
表的结构如下:
<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>
给我问题的函数 - 伪代码
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.StaleElementReference异常:过时的元素引用:元素未附加到页面文档
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;
}
});
}
这可能与您尝试覆盖已存储的WebElement有关。但是,查看您的代码,您似乎正在尝试用相同的列表替换WebElement列表,并且实际上并没有遍历其中的元素。试试这个:
List<WebElement> rows = driver.findElements(By.xpath("//*[@id='SummaryList']//*[@class='row']"));
for(int i=1; i<rows.size(); i++) {
String rowText = driver.findElement(By.xpath("//*[@id='SummaryList']//*[@class='row'][" + i + "]")).getText();
if (rowText.contains(val1) && rowText.contains(val2) && rowText.contains(val3)) {
driver.findElement(By.xpath("//*[@id='SummaryList']//*[@class='row'][" + i + "]//a")).click();
break;
}
}
这应该遍历表中的所有行,一旦找到包含您提供的值的行,它将单击链接并中断循环