0

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

});

これは最初のいくつかの行では機能しますが、多くの行では特定の時点で失敗します。

私の理論: findElementfor ループ内の呼び出しがマネージャーに渡され、for ループが終了します。次に、ガベージ コレクターが行配列を削除します。マネージャーがfindElement呼び出しを実行すると、配列とその要素は存在しなくなり、失敗します。私が得るエラーは次のとおりです。

StaleElementReferenceException : The Element is not Attached to the DOM

配列は実行の早い段階でまだ存在するため、最初の行で機能します。

私の質問:

  1. 私は何を間違っていますか?

  2. 私の理論は正しいですか?

  3. row[i]参照を findElement 呼び出しにバインドして、元の配列よりも長く保持するにはどうすればよいですか?

- - 編集 - -

内部の findElement 呼び出しの 1 つを削除し、行ごとに 1 つのセルのみを検索すると、より多くの行をカバーできます。これにより、この実装では時間が役割を果たすと思いました。これは当てはまらないので、おそらく何か間違ったことをしています。

  1. forEachSeleniumに関数のようなものはありますか?
4

1 に答える 1

0

私は問題を見つけました:

Sencha EXTjs で実装された Web サイトを使用しています。

テーブルはデータ ストアの上に作成されます。明らかに、ストアは 2 回呼び出され、呼び出しの間にテーブル全体が再作成されます。

そのため、テーブルが2回目にロードされるまで何とか待たなければなりません...

これが次の課題になります。

于 2014-11-07T09:38:59.650 に答える