StaleElementReferenceException

StaleElementReferenceException

我正在尝试根据列数据访问某个行,然后单击该行中的链接。我该如何实现?我已经坚持了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;
                }
            });
}

08-26 09:50