web-dev-qa-db-ja.com

Seleniumに要素が現れるまで待つ方法は?

ページの読み込み後にDOMに動的に追加される要素をSeleniumに待機させようとしています。これを試しました:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

それが役立つ場合、ここにfluentWait

FluentWait fluentWait = new FluentWait<>(webDriver) {
    .withTimeout(30, TimeUnit.SECONDS)
    .pollingEvery(200, TimeUnit.MILLISECONDS);
}

しかし、それはNoSuchElementExceptionをスローします-presenceOfElementが要素があることを期待しているように見えるので、これは欠陥があります。これは、Seleniumのパンとバターでなければならず、車輪を再発明したくありません...理想的には、自分のPredicateを転がすことなく、誰かが代替案を提案できますか?

50
Steve Chambers

ignoringが待機している間に無視するには、例外を使用してWebDriverを呼び出す必要があります。

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(200, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);

詳細については、 FluentWait のドキュメントを参照してください。ただし、この条件は ExpectedConditions で既に実装されていることに注意してください。

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

* Seleniumの新しいバージョンの更新:

withTimeout(long, TimeUnit) has become withTimeout(Duration)
pollingEvery(long, TimeUnit) has become pollingEvery(Duration)

したがって、コードは次のようになります。

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(Duration.ofSeconds(30)
        .pollingEvery(Duration.ofMillis(200)
        .ignoring(NoSuchElementException.class);

待機の基本的なチュートリアルは こちら にあります。

63
Petr Mensik
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));

ページコード全体の読み込みが実行され、スローおよびエラーが発生する前に、これを使用できます。時間は秒です

8
bhupendra

Selenide ライブラリの使用をお勧めします。より簡潔で読みやすいテストを書くことができます。はるかに短い構文で要素の存在を待つことができます:

$("#elementId").shouldBe(visible);

Google検索をテストするためのサンプルプロジェクトを次に示します。 https://github.com/selenide-examples/google

1
Andrei Solntsev

FluentWaitがNoSuchElementExceptionをスローするのは、混乱の場合です

org.openqa.Selenium.NoSuchElementException;     

Java.util.NoSuchElementException

.ignoring(NoSuchElementException.class)
0
palandlom
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {

    FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
        .pollingEvery(pollingSec, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);

    for (int i = 0; i < 2; i++) {
        try {
            //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
        fWait.until(ExpectedConditions.visibilityOf(element));
        fWait.until(ExpectedConditions.elementToBeClickable(element));
        } catch (Exception e) {

        System.out.println("Element Not found trying again - " + element.toString().substring(70));
        e.printStackTrace();

        }
    }

    return element;

    }
0
Ashwini