StableElementReferenceException:在缓存中找不到元素 - 可能是页面自查找以来已更改

时间:2016-03-25 06:32:03

标签: java selenium selenium-webdriver

我的代码如下所示,代码是通过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

在这种情况下有人可以提供帮助吗?谢谢!

3 个答案:

答案 0 :(得分:3)

我看到了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;

答案 1 :(得分:2)

好的,这就是诀窍。
1.使用elements.size();获取您想要的元素列表的大小 2.接下来写下一个动态XPath,这样只有XPATH中的索引才能改变,并且应该为你提供单独的元素 3.启动For循环,其中i = 0到i <1。 elements.size和for循环中使用带索引的动态XPath逐个检索单个元素,然后逐个检索它们的文本并将它们添加到列表中 其他方法可以明确地等待页面完全加载使用WebDriverWait或其他在selenium中等待的方法

答案 2 :(得分:0)

尝试getAttribute(&#34; innerText&#34;)或getAttribute(&#34; value&#34;)

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;
 }