57

「HTML」Selenium テスト (Selenium IDE または手動で作成) では、 やなどの非常に便利なコマンドを使用できます。WaitForElementPresentWaitForVisible

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

Java で Selenium テストをコーディングする場合 (Webdriver / Selenium RC — ここでの用語はよくわかりません)、同様のビルトイン機能はありますか?

たとえば、ダイアログ(開くのに時間がかかる)が表示されていることを確認するには...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

そのようなチェックをコーディングする最もクリーンで堅牢な方法は何ですか?

あちこちに呼び出しを追加するThread.sleep()のは醜くて壊れやすく、独自の while ループを展開するのもかなり不器用に思えます...

4

5 に答える 5

112

暗黙的および明示的な待機

暗黙の待機

暗黙の待機とは、要素がすぐに利用できない場合に要素を見つけようとするときに、WebDriver に一定時間 DOM をポーリングするように指示することです。デフォルト設定は 0 です。一度設定すると、暗黙的な待機が WebDriver オブジェクト インスタンスの存続期間にわたって設定されます。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

明示的な待機 +予想される条件

明示的な待機は、コード内で先に進む前に、特定の条件が発生するのを待機するように定義するコードです。これの最悪のケースは Thread.sleep() で、条件を正確な待機時間に設定します。必要な時間だけ待機するコードを作成するのに役立ついくつかの便利なメソッドが提供されています。WebDriverWait と ExpectedCondition の組み合わせは、これを実現する 1 つの方法です。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
于 2012-06-08T14:35:27.927 に答える
10
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

これは、TimeoutException をスローする前に最大 10 秒待機するか、要素が見つかった場合は 0 から 10 秒でそれを返します。デフォルトでは、WebDriverWait は正常に返されるまで 500 ミリ秒ごとに ExpectedCondition を呼び出します。成功した戻り値は、ExpectedCondition の型であり、他のすべての ExpectedCondition 型のブール型の戻り値は true または null ではありません。


WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

要素はクリック可能です - 表示され、有効になっています。

WebDriver ドキュメントから: 明示的および暗黙的な待機

于 2014-02-16T05:27:14.310 に答える
0

問題は、実際にはテストを無期限に実行したくないということです。ライブラリが要素が存在しないと判断するまで、より長い時間待ちたいだけです。その場合、最も洗練された解決策は、そのために設計された暗黙の待機を使用することです。

driver.manage().timeouts().implicitlyWait( ... )
于 2012-06-07T23:24:44.050 に答える
-4

個々の要素には、以下のコードを使用できます。

private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
for (int second = 0;; second++) {
            if (second >= 60){
                fail("timeout");
            }
            try {
                if (isElementPresent(By.id("someid"))){
                    break;
                }
                }
            catch (Exception e) {

            }
            Thread.sleep(1000);
        }
于 2012-11-16T07:54:07.113 に答える