【问题标题】:StableElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked upStableElementReferenceException:在缓存中找不到元素 - 页面可能在查找后已更改
【发布时间】:2016-03-25 06:32:03
【问题描述】:

我的代码如下,代码是通过xpath获取元素集,并生成一个list<String>,其中包含元素集中每个元素的文本。但是在将每个元素的文本添加到新的List<String>的过程中总是会抛出异常。

protected List<String> getHeaders(String path){
    List<String> headers = new ArrayList<String>();
    int count = 0;
    List<WebElement> elements = findAllByXpath(path);
    LOG.info("The length is : " + String.valueOf(elements.size()));

    for (WebElement c: elements) {
        LOG.info("->> " + String.valueOf(count));
        count++;
        headers.add(c.getText());
    }
    return headers;
}

结果是:

INFO com.xxx.test - The length is: 13
INFO com.xxx.test ->> 0
INFO com.xxx.test ->> 1
INFO com.xxx.test ->> 2
INFO com.xxx.test ->> 3
INFO com.xxx.test ->> 4
INFO com.xxx.test ->> 5

com.xxx.test -> getHeaders FAILED org.openqa.selenium.StableElementReferenceException:Element not found in the cache - perhaps the page has changed since it was looked up

在这种情况下有人可以帮忙吗?谢谢!

【问题讨论】:

  • 在将元素的文本添加到新列表时,您能否确保“在缓存中找不到元素 - 页面可能在查找后发生了变化”,您的网页在这两者之间没有刷新?跨度>
  • 嗨,Mrunal,感谢您的评论,实际上我猜页面在添加时会刷新。在这种情况下,您是否知道要获取 headers(List) ?我想在一个一个添加元素的文本时,我无法通过 xpath 重新获取所有元素,所以这是与其他问题相比的区别,例如“在缓存中找不到元素 - 也许......”

标签: java selenium selenium-webdriver


【解决方案1】:

我看到了 3 种方法来处理您的问题。

第一个解决方案可能也是最可靠的解决方案是在页面达到稳定状态后查找元素。它可以通过等待元素的存在或等待元素的计数来完成。

第二种解决方案是在引发 StableElementReferenceException 时再次列出元素:

List<String> headers = new ArrayList<String>();
List<WebElement> elements = findAllByXpath(path);
for(int i = 0; i < elements.size(); ) {
  try {
    headers.add(elements.get(i).getText());
    i++;
  } catch (StableElementReferenceException ex) {
    elements = findAllByXpath(path);
  }
}
return headers;

第三种解决方案是使用一段 Javascript 获取所有元素的文本:

List<WebElement> elements = findAllByXpath(path);

ArrayList headers = (ArrayList)((JavascriptExecutor)driver).executeScript(
    "var arr = [], elements = arguments[0];" +
    "for(var i=0; i<elements.length; i++)" +
    "  arr.push(elements[i].textContent);" +
    "return arr;", elements);

return headers;

【讨论】:

    【解决方案2】:

    好的,这就是诀窍。
    1. 使用 elements.size();
    获取您想要的元素列表的大小 2. 接下来写下一个动态 XPath,这样只有 XPATH 中的索引应该改变,并且应该给你单个元素。
    3. 使用 i=0 到 i 其他方法可以是使用 WebDriverWait 或其他在 selenium 中等待的方法显式等待页面完全加载

    【讨论】:

      【解决方案3】:

      试试 getAttribute("innerText") 或 getAttribute("value")

      protected List<String> getHeaders(String path){
          List<String> headers = new ArrayList<String>();
          int count = 0;
          List<WebElement> elements = findAllByXpath(path);
          LOG.info("The length is : " + String.valueOf(elements.size()));
      
          for (WebElement c: elements) {
              LOG.info("->> " + String.valueOf(count));
              count++;
              headers.add(c.getAttribute("innerText"));
          }
          return headers;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        相关资源
        最近更新 更多