我知道在等待DOM
中尚未包含的网络元素方面,效率最高的是流畅的等待。所以我的问题是:
有没有办法处理和捕获NoSuchElementException
或任何流利的等待可能抛出的异常,因为该元素不存在?
我需要一个布尔方法,它会给我结果是否找到元素。
这种方法在网上很受欢迎。
public void waitForElement(WebDriver driver, final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
});
}
我需要的是,**.ignoring(NoSuchElementException.class);**
不会被忽视。一旦捕获到异常,它将返回FALSE。另一方面,当找到元素时,它将返回TRUE。
答案 0 :(得分:5)
作为替代方案,您希望通过轮询查看WebDriverWait
的实现,以下是构造函数的详细信息:
WebDriverWait(WebDriver driver, long timeOutInSeconds)
:Wait会忽略在'until'条件下默认遇到(抛出)的NotFoundException实例,并立即传播所有其他实例。
WebDriverWait wait1 = new WebDriverWait(driver, 10);
WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
:Wait会忽略在'until'条件下默认遇到(抛出)的NotFoundException实例,并立即传播所有其他实例。
WebDriverWait wait2 = new WebDriverWait(driver, 10, 500);
要回答您的评论,我们刚刚在此处定义了 WebDriverWait
实例。接下来,我们必须在代码中通过适当的方式实现 WebDriverWait
实例,即 wait1
/ wait2
ExpectedCondition
条款。 ExpectedCondition
的JavaDocs
就在这里。
答案 1 :(得分:2)
您可以将WebDriverWait
与polling
和ignoring
示例:
public boolean isElementPresentWithWait(WebDriver driver, WebElement element) {
try {
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.pollingEvery(3, TimeUnit.SECONDS).ignoring(NoSuchElementException.class).until(ExpectedConditions.visibilityOf(element);
return true;
} catch (TimeoutException e) {
return false;
}
}
方法ignoring
和pollingEvery
返回FluentWait<WebDriver>
答案 2 :(得分:2)
这是:
public boolean waitForElementBoolean(WebDriver driver, By object){
try {
WebDriverWait wait = new WebDriverWait(driver,60);
wait.pollingEvery(2, TimeUnit.SECONDS);
wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(object));
return true;
} catch (Exception e) {
System.out.println(e.getMessage());
return false;
}
}
我将流利的等待与明确的等待结合起来。 :D谢谢你们! :)
答案 3 :(得分:1)
您可以尝试使用以下代码段
/*
* wait until expected element is visible
*/
public boolean waitForElement(WebDriver driver, By expectedElement) {
boolean isFound = true;
try {
WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds , 300);
wait.until(ExpectedConditions.visibilityOfElementLocated(expectedElement));
makeWait(1);
} catch (Exception e) {
//System.out.println(e.getMessage());
isFound = false;
}
return isFound;
}