我试图让Selenium等待页面加载后动态添加到DOM的元素。试过这个:
fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));
如果有帮助,这里是fluentWait:
fluentWait
FluentWait fluentWait = new FluentWait<>(webDriver) { .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(200, TimeUnit.MILLISECONDS); }
但是它抛出一个NoSuchElementException-看起来像presenceOfElement期望元素存在,所以这是有缺陷的。这一定是Selenium的面包和黄油,不想重新发明轮子……有人能建议一种替代方法Predicate吗,理想情况下不用自己动手做?
NoSuchElementException
presenceOfElement
Predicate
需要等待ignoring时,您需要异常调用以忽略WebDriver。
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);
等待的基本教程可以在这里找到。