更新
我在Firefox和IE11上使用Selenium 2.53.1。
我一直在尝试使用相同的选择器点击所有元素,例如,我想点击所有标题为"我想要的":
<div id="first_question">
<a class="gibberish1" title="What I Want"></a>
<a class="gibberish2" title="What I Want"></a>
<a class="gibberish3" title="What I Want"></a>
</div>
这是我到目前为止所做的工作:
browser.findElements(by.xpath("//a[@title='What I Want']")).then(function(all_tests){
for (var i = 0; i < all_tests.length; i++) {
console.log(all_tests.length);
all_tests[i].click();
}
});
它能够识别出我有三个元素,如果我直接给每个人打电话,那么我可以看到它点击按钮。但是,当我想循环以便点击每个按钮时,我得到一个&#34; StaleElementReferenceError:元素不再附加到DOM。&#34;我还加了5秒的等待,但这并没有阻止弹出相同的问题。
我做错了什么?我是Selenium的新手,我试图用Javascript来解决这个问题,而不是Java,这就是我找到这种情况的例子。
帮助:(
答案 0 :(得分:0)
你需要逐个找到它们,在页面上重新加载你的对象会丢失,你会得到过时的元素异常。
1)找到所有链接
2)在列表/数组中保存属性/属性,可以帮助您识别每个链接
3)创建一个循环,对于要搜索元素的每个属性,然后单击它
答案 1 :(得分:0)
将我的评论移至答案......
for
循环并访问循环内的各个元素,例如all_tests[i].click();
。陈旧元素的第二个问题是因为通过刷新页面或导航到新页面来更改DOM。如果问题是单击导致导航,则可以遍历所有A
标记并将href
存储在字符串数组中。然后,您可以遍历该字符串数组并导航到每个存储的href
等
处理此问题的另一种方法是使用索引来刮取页面,而不是将集合存储在循环外部。一个简单的例子就是
这是Java /伪代码,您必须将其翻译成您正在使用的任何语言,但该概念应该有效。
for (int i = 0; i < driver.findElements(locator).length; i++)
{
// scrapes the page each iteration to avoid the stale element exception
driver.findElements(locator)[i].click();
// do stuff and get back to the original page, if navigated
}
答案 2 :(得分:0)
我认为首先打印all_tests,检查输出和更改 for循环可以工作
对于all_tests中的元素:element.click()
要处理StaleElementReferenceError,可以在此处进行检查:
StaleElementReferenceException on Python Selenium
注意:未经测试,但处理了相同的问题。