我想使用Node和webdriverJS遍历Selenium表:
<table>
<tr>
<td class="name">Peter</td>
<td class="count">1</td>
</tr>
<tr>
<td class="name">John</td>
<td class="count">3</td>
</tr>
</table>
我希望每一行都能看到名称和行单元格。
我有什么:
driver.findElements(By.tagName('tr')).then(function(rows){
// for every row
for (var i = 0; i< rows.length; i++){
// check the name cell
rows[i].findElement(By.class('name')).getInnerHtml().then(function(name){
// do some stuff
});
// check the count cell
rows[i].findElement(By.class('count')).getInnerHtml().then(function(count){
// do some stuff
});
}
});
这适用于前几行,但有许多行,它在某一点失败。
我的理论:for循环中的findElement
调用被传递给管理器,然后for循环完成。然后垃圾收集器删除行数组。一旦管理器执行findElement
调用,该数组及其元素就不再存在并失败。我得到的错误是:
StaleElementReferenceException : The Element is not Attached to the DOM
它适用于第一行,因为数组在执行的早期仍然存在。
我的问题:
我做错了什么?
我的理论是否正确?
如何将row[i]
对findElement调用的引用绑定到比原始数组更长的持续时间?
----编辑----
当我删除其中一个内部findElement调用并且每行只查找一个单元格时,我可以覆盖更多行。这使我认为,通过这种实施,时间起着作用。情况应该不是这样,所以我可能做错了。
forEach
函数吗?答案 0 :(得分:0)
我发现了问题:
我使用的是使用Sencha EXTjs实现的网站。
该表是在数据存储的基础上创建的:显然,存储被调用两次,整个表在调用之间重新创建。
所以我不得不等到桌子第二次加载......
这将是下一个挑战。