在 Fluent Wait 中处理 NoSuchElementException
Handle the NoSuchElementException in Fluent Wait
我知道就等待 DOM
中不存在的 Web 元素而言,最有效的是流畅的等待。所以我的问题是:
有没有办法处理和捕获 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);**
不会被忽略。一旦捕获到异常,它将 return FALSE。另一方面,当找到一个元素时,它将 return TRUE。
您可以尝试使用下面的代码片段
/*
* 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;
}
作为替代方案,因为您希望通过轮询查看 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 实例。接下来我们必须实现 instance i.e. wait1 / wait2 within your code through proper ExpectedConditions 子句。
您可以将 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
return FluentWait<WebDriver>
的实例
这里是:
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 谢谢你们! :)
我知道就等待 DOM
中不存在的 Web 元素而言,最有效的是流畅的等待。所以我的问题是:
有没有办法处理和捕获 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);**
不会被忽略。一旦捕获到异常,它将 return FALSE。另一方面,当找到一个元素时,它将 return TRUE。
您可以尝试使用下面的代码片段
/*
* 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;
}
作为替代方案,因为您希望通过轮询查看 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
与 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
return FluentWait<WebDriver>
这里是:
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 谢谢你们! :)