I know that in terms of waiting for web element that isn't in the DOM
yet, the most efficient is a fluent wait. So my question is:
Is there a way to handle and catch the NoSuchElementException
or any exception that fluent wait might throw because the element is not existing?
I need to have a boolean method wherein it will give me result whether the element is found or not.
This method is quite popular on the web.
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);
}
});
}
What I need is, **.ignoring(NoSuchElementException.class);**
will not be ignored. And once the exception is caught, it will return FALSE. On the other hand, when an element is found, it will return TRUE.
As an alternative as you have wanted to see the implementation of WebDriverWait
with polling, here are the constructor details :
WebDriverWait(WebDriver driver, long timeOutInSeconds)
: Wait will ignore instances of NotFoundException that are encountered (thrown) by default in the 'until' condition, and immediately propagate all others.WebDriverWait wait1 = new WebDriverWait(driver, 10);
WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
: Wait will ignore instances of NotFoundException that are encountered (thrown) by default in the 'until' condition, and immediately propagate all others.WebDriverWait wait2 = new WebDriverWait(driver, 10, 500);
Update :
To answer to your comment, we have just defined the WebDriverWait
instance here. Next we have to implement the WebDriverWait
instance i.e. wait1
/wait2
within our code through proper ExpectedCondition
clauses. The JavaDocs
for ExpectedCondition
is here.
You can use WebDriverWait
with polling
and ignoring
Example:
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;
}
}
Methods ignoring
and pollingEvery
return instance of FluentWait<WebDriver>
Here it is:
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;
}
}
I integrated the fluent wait with the explicit wait. :D Thank you guys! :)
you can try with this below code snippet
/*
* 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;
}
来源:https://stackoverflow.com/questions/47575339/handle-the-nosuchelementexception-in-fluent-wait