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
});
}
});
これは最初のいくつかの行では機能しますが、多くの行では特定の時点で失敗します。
私の理論: findElement
for ループ内の呼び出しがマネージャーに渡され、for ループが終了します。次に、ガベージ コレクターが行配列を削除します。マネージャーがfindElement
呼び出しを実行すると、配列とその要素は存在しなくなり、失敗します。私が得るエラーは次のとおりです。
StaleElementReferenceException : The Element is not Attached to the DOM
配列は実行の早い段階でまだ存在するため、最初の行で機能します。
私の質問:
私は何を間違っていますか?
私の理論は正しいですか?
row[i]
参照を findElement 呼び出しにバインドして、元の配列よりも長く保持するにはどうすればよいですか?
- - 編集 - -
内部の findElement 呼び出しの 1 つを削除し、行ごとに 1 つのセルのみを検索すると、より多くの行をカバーできます。これにより、この実装では時間が役割を果たすと思いました。これは当てはまらないので、おそらく何か間違ったことをしています。
forEach
Seleniumに関数のようなものはありますか?