1

我正在尝试根据列数据访问某一行,然后单击该行中的链接。我如何实现这一目标?我已经坚持了5天。

我是 Selenium 的新手,但我尝试遍历元素列表,但随后会得到一个 StaleElementReferenceException: stale element is not attach to the DOM。

我在 selenium 网站上看到了一些与此类似的其他问题,这意味着元素或页面已更新,因此对该元素的引用可能不正确,因此我尝试了一些方法:

我尝试使用预期条件刷新,然后重新初始化元素,但这只有时有效,我仍然会收到错误我尝试添加尝试和捕获,但这似乎不起作用,如果我也没有完全显示做对了。

我还想看看我是否可以完全放弃 for 循环,只在列表中找到一个元素,该元素具有我需要使用 selenium 的“包含”的 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>

给我问题的功能-伪代码

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:过时的元素引用:元素未附加到页面文档

4

2 回答 2

0

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;
                }
            });
}
于 2019-09-10T14:14:28.397 回答
0

这可能与您尝试覆盖已存储的 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;
        }
    }

这应该遍历表中的所有行,一旦找到包含您提供的值的行,它将单击链接并中断循环

于 2019-09-10T15:08:53.647 回答