Selenium 用の FireFox WebDriver を使用しています。AJAX 経由で読み込まれるウィンドウがあり、これが原因でテストに一貫性がありません。
スレッドに 3 秒の遅延を設定すると、毎回動作します。私がしているのは、行の存在を確認することだけです。
これを行う最善の方法は何ですか?
Selenium 用の FireFox WebDriver を使用しています。AJAX 経由で読み込まれるウィンドウがあり、これが原因でテストに一貫性がありません。
スレッドに 3 秒の遅延を設定すると、毎回動作します。私がしているのは、行の存在を確認することだけです。
これを行う最善の方法は何ですか?
最善の方法(私見)は流暢な待機を使用することです。とにかく、必要な要素 (xpaths、または css セレクターなど) のロケーターがあり、ロケーターを fluentWait 関数に渡すと、対話するために必要な Web 要素を取得できます。
fluentWait
以下に提供される機能コード:
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo; } ;
各 FluentWait インスタンスは、条件をチェックする頻度だけでなく、条件を待機する最大時間も定義することに注意してください。さらに、ユーザーは、ページ上の要素を検索するときの NoSuchElementExceptions など、待機中に特定の種類の例外を無視するように待機を構成できます。(c)selenium API ドキュメント
したがって
、.pollingEvery(1, TimeUnit.SECONDS)
を設定すると、この間隔中に AJAX が返されたかどうかが検証されます。
ここで読むことができる流暢な待機に関する情報を追加する人もいます
推定
String cssLocator=...blablabla.. // is the css of the table row
関数に渡します:
WebElement firstRow= fluentWait(By.cssSelector(cssLocator));
このようにして、テーブルの最初の行を取得します。
これがあなたに明らかになることを願っています)
おそらく、Selenium テストはサイトを使用する人をシミュレートすることになっているため、人間が行うこと (座って待つこと) を回避するために行うことは、誤った結果につながる可能性があります。このような状況では、AJAX のロード (または失敗) 中に遅延を追加して、それを報告しても問題はないと思います。