使用selenium / webdriverjs遍历表

时间:2014-11-05 17:21:08

标签: arrays node.js selenium webdriver ui-testing

我想使用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

它适用于第一行,因为数组在执行的早期仍然存在。

我的问题:

  1. 我做错了什么?

  2. 我的理论是否正确?

  3. 如何将row[i]对findElement调用的引用绑定到比原始数组更长的持续时间?

  4. ----编辑----

    当我删除其中一个内部findElement调用并且每行只查找一个单元格时,我可以覆盖更多行。这使我认为,通过这种实施,时间起着作用。情况应该不是这样,所以我可能做错了。

    1. Selenium中有forEach函数吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题:

我使用的是使用Sencha EXTjs实现的网站。

该表是在数据存储的基础上创建的:显然,存储被调用两次,整个表在调用之间重新创建。

所以我不得不等到桌子第二次加载......

这将是下一个挑战。