一尘不染

如何等待selenium中是否存在元素?

selenium

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

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吗,理想情况下不用自己动手做?


阅读 270

收藏
2020-06-26

共1个答案

一尘不染

需要等待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);

等待的基本教程可以在这里找到。

2020-06-26