我的代码如下所示,代码是通过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
在这种情况下有人可以提供帮助吗?谢谢!
答案 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;
}