Selenium WebDriver: Couramment attendre fonctionne comme prévu, mais implicite d'attente ne sont pas
Je suis nouveau sur le Selenium WebDriver et essaie de comprendre la bonne façon "d'attendre" pour éléments à présenter.
Je suis en train de tester une page avec un tas de questions qui ont un bouton radio réponses. À mesure que vous sélectionnez des réponses, Javascript peut activer/désactiver certaines de vos questions sur la page.
Le problème semble être que le Sélénium est "en cliquant sur trop rapide" et de ne pas attendre pour le Javascript à la fin. J'ai essayé de résoudre ce problème de deux manières explicites attend résolu le problème. Plus précisément, cela fonctionne, et résout mon problème:
private static WebElement findElement(final WebDriver driver, final By locator, final int timeoutSeconds) {
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(timeoutSeconds, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
return wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver webDriver) {
return driver.findElement(locator);
}
});
}
Cependant, je tiens à préfèrent à l'utilisation implicite de l'attendre au lieu de cela. J'ai mes pilotes web configuré comme ceci:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Cela ne résout pas le problème et je reçois un NoSuchElementException. En outre, je ne suis pas d'avis à 10 secondes de pause: il suffit d'erreurs immédiatement. J'ai vérifié cette ligne dans le code est frappé avec un débogueur. Ce que je fais mal? Pourquoi ne implicitlyWait pas attendre que l'élément d'apparaître, mais FluentWait n'?
Remarque: Comme je l'ai mentionné, j'ai déjà un travail autour de, vraiment, je veux juste savoir pourquoi Implicite d'attente n'est pas la résolution de mon problème. Merci.
- double possible de selenium webdriver - explicite attendre vs implicite d'attente
Vous devez vous connecter pour publier un commentaire.
Rappelez-vous qu'il existe une différence entre plusieurs scénarios:
Ma conjecture est que si une partie de la page est affichée avec le javascript, les éléments sont déjà présents dans le navigateur DOM, mais ne sont pas visibles. L'implicite attendre attend pour un élément d'apparaître dans les DOM, elle retourne immédiatement, mais lorsque vous essayez d'interagir avec l'élément vous obtenez un NoSuchElementException. Vous pouvez tester cette hypothèse par l'écriture d'une méthode d'assistance que explicits attend pour un élément à être visible ou cliquable.
Quelques exemples (en Java):
idée de base est le suivant:
Explicite attendre
Implicite attendre
En d'autres termes, explicite est associée à un certain état d'être jugé, alors qu'implicite avec un peu de temps à attendre quelque chose.
voir ce lien
À rendre le travail fluentWait correctement, essayez ceci:
Espère que cette aide)
.withTimeout(Duration.ofSeconds(20)
si.withTimeout(30, TimeUnit.SECONDS)
est d'apparence obsolète.Mot d'avertissement pour une erreur commune:
Une fois que vous définissez implicite d'attente, vous ne pouvez pas utiliser explicite - ou fluide attendre jusqu'à ce que la réinitialisation de l'implicite en attente de nouveau. Cela signifie que
ExpectedConditions
, qui contiennentdriver.findElement
appels ne fonctionne pas comme prévu avec les attendre! Vous allez souvent rencontrer des cas où vous souhaitez vérifier un élément ou sa non-existence instantanément, mais vous ne pouvez pas le faire.Après ~2 ans d'expérience et des problèmes avec cela, je recommande fortement contre l'utilisation implicite d'attente.
Un kotlin version de la https://stackoverflow.com/users/503060/hedley réponse:
via
J'ai écrit une petite méthode en C# à l'aide de la WebDriverWait classe. Fonctionne très bien pour moi.
À l'aide de:
Espère que cela aide.
De Seleniumhq.com:
Si vous postez votre code de test que vous voulez vraiment faire, je peux fournir plus d'informations.
J'ai une autre solution pour résoudre ce problème (seulement pour IE, je n'ai jamais essayer d'autres navigateurs):
1) après avoir créer le Sélénium instance de pilote, vous pouvez obtenir son ie COM instance
2) après chaque appel GotoURL ou cliquez sur action, vérifiez $ieShell.Le statut occupé, il va attendre jusqu'à ce que la page est chargée.
utiliser de cette façon, vous n'avez pas besoin de définir de chargement de la page et findElement délai d'attente pour le Sélénium
Ci-dessous est le code equivalet code pour fluient attendre dans c#.Net à l'aide de DefaultWait.