私はSelenium WebDriverが初めてで、要素が存在するのを「待つ」正しい方法を理解しようとしています。
ラジオボタンの回答を持つ一連の質問でページをテストしています。回答を選択すると、Javascript によって、ページ上のいくつかの質問が有効または無効になる場合があります。
問題は、Selenium の「クリックが速すぎる」ことであり、Javascript が終了するのを待っていないようです。私はこの問題を 2 つの方法で解決しようとしました - 明示的な待機が問題を解決しました。具体的には、これは機能し、私の問題を解決します:
private static WebElement findElement(final WebDriver driver, final By locator, final int timeoutSeconds) {
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(timeoutSeconds, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
return wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver webDriver) {
return driver.findElement(locator);
}
});
}
ただし、これの代わりに暗黙の待機を使用することをお勧めします。Web ドライバーを次のように構成しました。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
これで問題は解決せず、NoSuchElementException が発生します。さらに、10 秒間の一時停止に気付かず、ただちにエラーになります。コードのこの行がデバッガーでヒットしていることを確認しました。私は何を間違っていますか?要素が表示されるのを暗黙的に待機しないのに、FluentWait が待機するのはなぜですか?
注: 前述したように、既に回避策がありますが、Implicit wait で問題が解決しない理由を知りたいだけです。ありがとう。