「HTML」Seleniumテスト(Selenium IDEまたは手動で作成)では、いくつかの 非常に便利なコマンド likeWaitForElementPresent
またはWaitForVisible
。
<tr>
<td>waitForElementPresent</td>
<td>id=saveButton</td>
<td></td>
</tr>
SeleniumテストをJava(Webdriver/Selenium RC-ここでは用語がわかりません)でコーディングする場合、同様のビルトイン?
たとえば、ダイアログ(開くのに時間がかかる)が表示されていることを確認するには...
WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed()); // often fails as it isn't visible *yet*
そのようなチェックをコーディングする最もクリーンな堅牢な方法は何ですか?
Thread.sleep()
呼び出しをすべての場所に追加するのは見苦しくて壊れやすく、また、whileループを独自にローリングすることも非常に不格好です...
暗黙の待機
暗黙的な待機とは、1つまたは複数の要素がすぐに利用できない場合にそれらを見つけようとするときに、一定時間DOMをポーリングするようにWebDriverに指示することです。デフォルト設定は0です。一度設定されると、WebDriverオブジェクトインスタンスが存続する間、暗黙の待機が設定されます。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
明示的な待機+ 予想される条件
明示的な待機とは、コードをさらに進める前に特定の条件が発生するのを待つために定義するコードです。これの最悪のケースはThread.sleep()で、これは条件を正確な待機時間に設定します。必要な時間だけ待機するコードを作成するのに役立つ便利なメソッドがいくつか用意されています。 ExpectedConditionと組み合わせたWebDriverWaitは、これを実現する1つの方法です。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
これは、TimeoutExceptionをスローする前に最大10秒待機するか、要素が見つかった場合に0〜10秒でそれを返します。 WebDriverWaitはデフォルトで、正常に戻るまで500ミリ秒ごとにExpectedConditionを呼び出します。 ExpectedCondition型の戻り値が成功した場合は、ブール値がtrueであるか、他のすべてのExpectedCondition型の戻り値がnullではありません。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
要素はクリック可能-表示および有効化されています。
実は、おそらく実際にテストを無期限に実行したくないということです。ライブラリが要素が存在しないと判断するまで、より長い時間待つだけです。その場合、最もエレガントな解決策は暗黙的な待機を使用することです。これはまさにそのために設計されています。
driver.manage().timeouts().implicitlyWait( ... )
次のように、要素が表示されるまで最大10秒の一定量を待つ別の方法:
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.findElement(By.id("<name>")).isDisplayed();
}
});