Prendre la réponse de Nilesh une étape supplémentaire, vous pouvez également permettre des recherches à l'écoute plus fines (par exemple, dans le cadre d'un WebElement) en utilisant l'interface SearchContext:
Function<SearchContext, WebElement> elementLocated(final By by) {
return new Function<SearchContext, WebElement>() {
public WebElement apply(SearchContext context) {
return context.findElement(by);
}
};
}
L'exécution est effectuée par un FluentWait <SearchContext> instance (au lieu de WebDriverWait). Offrez-vous une interface de programmation agréable en enveloppant son exécution et la gestion des exceptions nécessaires dans une méthode utilitaire (la racine de votre hiérarchie de type PageObject est un bon endroit):
/**
* @return The element if found before timeout, otherwise null
*/
protected WebElement findElement(SearchContext context, By by,
long timeoutSeconds, long sleepMilliseconds) {
@SuppressWarnings("unchecked")
FluentWait<SearchContext> wait = new FluentWait<SearchContext>(context)
.withTimeout(timeoutSeconds, TimeUnit.SECONDS)
.pollingEvery(sleepMilliseconds, TimeUnit.MILLISECONDS)
.ignoring(NotFoundException.class);
WebElement element = null;
try {
element = wait.until(elementLocated(by));
}
catch (TimeoutException te) {
element = null;
}
return element;
}
/**
* overloaded with defaults for convenience
*/
protected WebElement findElement(SearchContext context, By by) {
return findElement(context, by, DEFAULT_TIMEOUT, DEFAULT_POLL_SLEEP);
}
static long DEFAULT_TIMEOUT = 3; // seconds
static long DEFAULT_POLL_SLEEP = 500; // milliseconds
Exemple d'utilisation:
WebElement div = this.findElement(driver, By.id("resultsContainer"));
if (div != null) {
asyncSubmit.click();
WebElement results = this.findElement(div, By.id("results"), 30, 500);
if (results == null) {
// handle timeout
}
}
Pouvez-vous expliquer "Function"? Il n'y a pas un tel objet appelé "Fonction" et se demandait si vous pouviez mieux le mettre en contexte? – djangofan