ページの読み込み後に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
を転がすことなく、誰かが代替案を提案できますか?
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")));
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);
待機の基本的なチュートリアルは こちら にあります。
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));
ページコード全体の読み込みが実行され、スローおよびエラーが発生する前に、これを使用できます。時間は秒です
Selenide ライブラリの使用をお勧めします。より簡潔で読みやすいテストを書くことができます。はるかに短い構文で要素の存在を待つことができます:
$("#elementId").shouldBe(visible);
Google検索をテストするためのサンプルプロジェクトを次に示します。 https://github.com/selenide-examples/google
FluentWaitがNoSuchElementExceptionをスローするのは、混乱の場合です
org.openqa.Selenium.NoSuchElementException;
と
Java.util.NoSuchElementException
に
.ignoring(NoSuchElementException.class)
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;
}