如何等到硒中存在元素?

我试图让Selenium等待在页面加载后动态添加到DOM中的元素。试过这个:

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

如果它有帮助,这里是流利的等待

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

但是它抛出了一个 - 看起来像期望元素在那里,所以这是有缺陷的。这一定是硒的面包和黄油,不想重新发明轮子......任何人都可以提出一个替代方案,理想情况下不滚动我自己的?NoSuchElementExceptionpresenceOfElementPredicate


答案 1

您需要在等待时调用异常以忽略。ignoringWebDriver

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

有关详细信息,请参阅 FluentWait 的文档。但请注意,此条件已在预期条件中实现,因此您应该使用

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);

等待的基础知识可以在这里找到。


答案 2
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));

您可以使用它作为加载整个页面代码执行并抛出和错误之前的一段时间。时间以秒为单位


推荐