1

リストビュー、特にリストビューからアイテムを検証して選択するためのJava Seleniumテストを書いています。

ただし、テストは半分の時間は正常に実行されますが、残りの半分は StaleElementReference または同様のエラーが発生し、毎回異なる段階で発生することが多いため、私は気が狂います。これは、同じ条件で実行した場合です。

リストビュー ページが変更されるたびに WebElement 変数を再割り当てしますが、これが問題である可能性がありますが、それでも発生します。次に、ページが完全に読み込まれるのを待つ必要があることに関係しているのではないかと考えましたが、他の人が提案している WebDriverWait などを利用する方法が完全にはわかりません。ただし、既存の基本ページ オブジェクト クラスには待機用のものが既に含まれていることはわかっているので、これについては既に説明されていると思います。

    public abstract class PageObject {

protected WebDriver driver;
protected WebDriverWait wait;
    ...
    public PageObject(WebDriver driver, String relativePath) {
            ...
            this.driver = driver;
            this.wait = new WebDriverWait(driver, 8);
            ...

それで十分ですか、それともこの問題に対してより具体的な「待機」形式が必要ですか?

それとは別に、これを引き起こしている可能性のある一般的な問題を考えられる人はいますか?

どうもありがとう

4

1 に答える 1

2

へー、同様の問題に出くわします。問題は、ページに大量の AJAX がある場合、それを処理するための最良の方法 (imho) であり、私が最も気に入っている待機時間は次のとおりです。fluentWait()

 public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(1, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
                new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                    }
                }
        );
        return  foo;              
     };

そのため、実際には Web 要素 (xpath、または css セレクター) のロケーターを見つけて、それを流暢な待機に渡す必要があります。そして流暢な待機は、見つかった Web 要素を返します。ドキュメントから: タイムアウトとポーリング間隔をオンザフライで構成できる Wait インターフェイスの実装。各 FluentWait インスタンスは、条件を待機する最大時間と、条件をチェックする頻度を定義します。さらに、ユーザーは、ページ上の要素を検索するときの NoSuchElementExceptions など、待機中に特定の種類の例外を無視するように待機を構成できます。 利用方法:

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

ここで詳細を確認できます

この種の問題を引き起こす問題には、(私の経験から) 2 つのタイプがあります。1) 最初のもの

ページのレンダリングやその他の「遅い」操作を引き起こす要素と対話します。Selenium テストは続行されますが、ページは実際にはレンダリングされません >> staleElement.

2) 2 つ目。1 つの要素と対話します。次に、別のユーザーとやり取りして、多くの AJAX を引き起こします (完全なページのリロードではなく、最初の要素の更新)。すぐに前のものに戻ります(たとえば、getTextまたはクリックしたい)>> staleElement

だから私はいつも流暢な待機を使用します。任意の例外を無視して設定できる点で快適です。これがうまくいくことを願っています。

于 2012-10-10T15:40:24.477 に答える