58

使ってます:

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

しかし、それでも以下の要素では継続的に失敗します

    driver.findElement(By.id("name")).clear();
    driver.findElement(By.id("name")).sendKeys("Create_title_01");

待機コードを追加しました:

for (int second = 0;; second++) {
        if (second >= 120) fail("timeout");
        try { if (isElementPresent(By.id("name"))) break; } catch (Exception e) {}
        Thread.sleep(1000);
    }

暗黙の待機は、要素が見つかるまで待機することを処理するべきではありませんか?また、追加したコードの代わりに明示的な待機を使用した方がよいでしょうThread.sleep()か?

4

8 に答える 8

4

Implicit wait -すべての要素に適用可能なグローバル設定であり、要素が指定された時間よりも前に表示された場合、スクリプトの実行が開始されます。それ以外の場合、スクリプトは をスローしNoSuchElementExceptionます。セットアップ方法で使用する最良の方法。にのみ影響しBy.findelement()ます。

Thread.sleep()- スクリプトのスリープ時間になります。無条件でスリープするため、スクリプトでの使用には適していません。5% のケースで 2 秒では不十分な場合はどうすればよいでしょうか?

明示的待機: 指定の内容/属性変更を待機します。アプリケーションがシステムにAJAX呼び出しを与え、動的データを取得して UI にレンダリングする場合に、より多く使用されます。この場合WebDriverWaitに適しています。

于 2013-03-12T16:54:55.920 に答える
4

fluentWait を試しましたか? タイムアウトとポーリング間隔をその場で構成できる Wait インターフェイスの実装。各 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;          
};

お気づきのように、流暢な待機は見つかった Web 要素を返します。そのため、ロケーターを By タイプで渡すだけで、見つかった Web 要素に対して任意のアクションを実行できます。

fluentWait(By.id("name")).clear();

これがお役に立てば幸いです)

于 2012-09-03T13:24:21.340 に答える
2

「 WebDriverWait 」を使ってみましたか? あなたが望むのはこれだと思います:

WebDriverWait _wait = new WebDriverWait(driver, new TimeSpan(0, 0, 2)); //waits 2 secs max
_wait.Until(d => d.FindElement(By.Id("name")));
//do your business on the element here :)

これは、私の理解では、現在のコードとほとんど同じです。渡されたタイムスパンのタイムアウトに達し、3 番目のパラメーターを入力してスリープをミリ秒単位で指定できるようになるまで、(見つからない例外を無視しながら) 常にメソッドを試行します。これが暗黙的にWaitも行うことである場合は申し訳ありません!

編集:私は今日いくつか読んで、あなたの質問をよりよく理解し、これが暗黙の待機の設定が行うべきことを正確に行うことに気付きました。コード自体が他の誰かを助けることができる場合に備えて、ここに残します。

于 2012-05-01T21:56:15.077 に答える
0

暗黙の待機:

  1. すべての driver.findelement コマンドに適用可能
  2. 要素の存在のみを考慮します。要素が不可視または相互作用できない場合、それは気にしません。

明示的な待機

  1. 存在、可視性、対話性、および他の多くのことを確認できます-これらを動的に待ちます

    WebDriverWait 待機 = 新しい WebDriverWait(driver,Duration.ofSeconds(20)); wait.until(ExpectedConditions.presenceOfElementLocatedBy(By.id("xcxcxc"));

于 2020-08-18T11:17:26.680 に答える