问题
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.
回答1:
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.
回答2:
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>
回答3:
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! :)
回答4:
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