1

Selenium Webdriverを使用していますが、テスト中のアプリで次の問題が発生しました。

アプリには複数のページがあり、それぞれにページの名前を含む適切な「.page-title」要素があります(「その他のドキュメント」など)。テストがアプリ内を移動すると、他の操作を行う前に、これらの要素を使用してブラウザーが期待されるページにあると主張します。

問題は、アクションを実行するアプリのボタンをクリックしてから、正しいページにいることを確認すると(たとえば、page-title要素が正しいテキストを表示することを確認する)、Webdriverはアクションが実行されるのを待たないことです。 (例:新しいページの読み込み)、すぐに戻り、テストは失敗します。

アクションの実行と正しいページにいることの確認の間に短いスレッドスリープ(500ms)を追加すると、StaleElementReferenceExceptionが発生し(場合によっては)、大きなスレッドスリープを追加すると、テストに合格します(すべてではありません)時間)。

私の目的はテストの不安定さを減らすことですが、Thread.sleepなしでこれを行う方法について誰かが提案を持っていますか?

4

4 に答える 4

0

fluentWait メカニズムを使用します。堅牢なアプローチと見なされます。流暢な待機に関するドキュメントが提供するように: タイムアウトとポーリング間隔をその場で構成できる待機インターフェイスの実装。各 FluentWait インスタンスは、条件を待機する最大時間と、条件をチェックする頻度を定義します。さらに、ユーザーは、ページ上の要素を検索するときの NoSuchElementExceptions など、待機中に特定の種類の例外を無視するように待機を構成できます。ここで 取得できる詳細 は、私が使用するメソッドのコードです。

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

String xPathElement="...blablabla...";
fluentWait(By.xpath(xPathElement)).click();
//fluentWait(By.xpath(xPathElement)).getText();

それがうまくいくことを願っています。

于 2012-11-21T07:58:41.957 に答える
0

Selenium のExpectedCondition. 以下のコード (JAVA で記述) は、inTimeout表示したい要素を最大数秒間待機します。要素が先に表示されると、待機が終了します。

public static void wait(WebDriver b,long inTimeout) {
    final SlnDriver browser=b;
    final long NO_LOADING_TIMEOUT = inTimeout;

    class HasCondition implements ExpectedCondition<Boolean> {

        @Override
        public Boolean apply(WebDriver d) {
            Boolean expected=false;
            WebElement e = browser.findElement(By.xpath("blabla"));
                if (e.getText().contains("TextYouWant")) {
                    expected= true;
                    break;
                }
            }
            return expected;
        }

    }
    }
    for (;;) {
        try {
            new WebDriverWait(browser, NO_LOADING_TIMEOUT).until(new HasCondition());
        } catch (TimeoutException e) {
            return;
        }
    }
}
于 2012-11-21T07:54:24.730 に答える