Quelqu'un peut-il me dire comment puis-je faire attendre le sélénium jusqu'à ce que la page se charge complètement? Je veux quelque chose de générique, je sais que je peux configurer WebDriverWait et appeler quelque chose comme «trouver» pour le faire attendre mais je ne vais pas aussi loin. J'ai juste besoin de tester que la page se charge correctement et de passer à la page suivante pour tester.
J'ai trouvé quelque chose dans .net mais je n'ai pas pu le faire fonctionner en java ...
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Des pensées quelqu'un?
Réponses:
Essayez ce code:
Le code ci-dessus attendra jusqu'à 10 secondes pour le chargement de la page. Si le chargement de la page dépasse le temps, le fichier
TimeoutException
. Vous attrapez l'exception et faites vos besoins. Je ne sais pas si cela arrête le chargement de la page après l'exception levée. je n'ai pas encore essayé ce code. Je veux juste l'essayer.C'est une attente implicite. Si vous le définissez une fois, il aura l'étendue jusqu'à ce que l'instance du pilote Web soit détruite.
Consultez la documentation
WebDriver.Timeouts
pour plus d'informations.la source
La solution que vous suggérez n'attend que le signal du DOM
readyState
complete
. Mais Selenium essaie par défaut d'attendre ceux (et un peu plus) lors des chargements de page via les méthodesdriver.get()
etelement.click()
. Ils bloquent déjà, ils attendent que la page se charge complètement et ceux-ci devraient fonctionner correctement.Le problème, évidemment, sont les redirections via des requêtes AJAX et des scripts en cours d'exécution - ceux-ci ne peuvent pas être capturés par Selenium, il n'attend pas qu'ils se terminent. De plus, vous ne pouvez pas les attraper de manière fiable via
readyState
- cela attend un peu, ce qui peut être utile, mais cela signaleracomplete
longtemps avant que tout le contenu AJAX ne soit téléchargé.Il n'y a pas de solution générale qui fonctionnerait partout et pour tout le monde, c'est pourquoi c'est difficile et tout le monde utilise quelque chose d'un peu différent.
La règle générale est de s'appuyer sur WebDriver pour faire sa part, puis d'utiliser des attentes implicites, puis d'utiliser des attentes explicites pour les éléments que vous souhaitez affirmer sur la page, mais il y a beaucoup plus de techniques qui peuvent être faites. Vous devez choisir celui (ou une combinaison de plusieurs d'entre eux) qui fonctionne le mieux dans votre cas, sur votre page testée.
Voir mes deux réponses à ce sujet pour plus d'informations:
la source
element.click()
appels.Ceci est une version Java fonctionnelle de l'exemple que vous avez donné:
Exemple pour c #:
la source
import com.google.common.base.Predicate
Voici ma tentative d'une solution complètement générique, en Python:
Tout d'abord, une fonction générique "wait" (utilisez un WebDriverWait si vous le souhaitez, je les trouve moche):
Ensuite, la solution repose sur le fait que le sélénium enregistre un numéro d'identification (interne) pour tous les éléments d'une page, y compris l'
<html>
élément de niveau supérieur . Lorsqu'une page s'actualise ou se charge, elle obtient un nouvel élément html avec un nouvel ID.Donc, en supposant que vous vouliez cliquer sur un lien avec le texte "mon lien" par exemple:
Pour plus d'aide pythonique, réutilisable et générique, vous pouvez créer un gestionnaire de contexte:
Et puis vous pouvez l'utiliser sur à peu près n'importe quelle interaction de sélénium:
Je pense que c'est à l'épreuve des balles! Qu'est-ce que tu penses?
Plus d'informations dans un article de blog à ce sujet ici
la source
J'avais un problème similaire. J'avais besoin d'attendre que mon document soit prêt mais aussi que tous les appels Ajax soient terminés. La deuxième condition s'est avérée difficile à détecter. En fin de compte, j'ai vérifié les appels Ajax actifs et cela a fonctionné.
Javascript:
Méthode C # complète:
la source
document.readyState == 'complete' && jQuery.active == 0
pour React?la source
Pour C # NUnit, vous devez convertir WebDriver en JSExecuter, puis exécuter le script pour vérifier si l'état de document.ready est complet ou non. Vérifiez le code ci-dessous pour référence:
Cela attendra que la condition soit satisfaite ou que le délai expire.
la source
Pour le chargement initial de la page, j'ai remarqué que "Maximiser" la fenêtre du navigateur attend pratiquement que le chargement de la page soit terminé (y compris les sources)
Remplacer:
Avec:
que d'utiliser:
Cela chargera la page, attendra qu'elle soit terminée, l'agrandira et se concentrera dessus. Je ne sais pas pourquoi c'est comme ça mais ça marche.
Si vous voulez attendre le chargement de la page après avoir cliqué sur suivant ou sur tout autre déclencheur de navigation de page autre que "Naviguer ()", la réponse de Ben Dyer (dans ce fil) fera le travail.
la source
Jetez un œil au framework web tapestry . Vous pouvez y télécharger le code source .
L'idée est de signaler que la page est prête par l'attribut html du corps. Vous pouvez utiliser cette idée pour ignorer les cas de poursuites compliqués.
Et puis créer une extension de Selenium webdriver (selon le framework tapestry)
Utilisez l'extension ElementIsDisplayed écrite par Alister Scott .
Et enfin créer un test:
la source
La réponse de Ben Dryer n'a pas été compilée sur ma machine (
"The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait"
).Version de travail de Java 8:
Version Java 7:
la source
J'ai essayé ce code et cela fonctionne pour moi. J'appelle cette fonction chaque fois que je passe à une autre page
la source
Dans Nodejs, vous pouvez l'obtenir via des promesses ...
Si vous écrivez ce code, vous pouvez être sûr que la page est complètement chargée lorsque vous arrivez à alors ...
Si vous écrivez ce code, vous naviguerez, et le sélénium attendra 3 secondes ...
À partir de la documentation Selenium:
this.get (url) → Thenable
Planifie une commande pour accéder à l'URL donnée.
Renvoie une promesse qui sera résolue une fois le chargement du document terminé .
Documentation Selenium (Nodejs)
la source
L'attente de l'événement document.ready n'est pas la solution complète à ce problème, car ce code est toujours dans une condition de concurrence: parfois, ce code est déclenché avant le traitement de l'événement de clic, donc cela retourne directement, car le navigateur n'a pas démarré chargement de la nouvelle page pour le moment.
Après quelques recherches, j'ai trouvé un article sur Obay, la chèvre de test , qui a une solution à ce problème. Le code c # pour cette solution est quelque chose comme ceci:
`Je lance cette méthode directement après le driver.navigate.gotourl, afin qu'il obtienne une référence de la page dès que possible. Aie du plaisir avec ça!
la source
Normalement, lorsque le sélénium ouvre une nouvelle page à partir d'un clic ou soumet ou récupère des méthodes, il attendra que la page soit chargée, mais le problème est que lorsque la page a un appel xhr (ajax), il n'attendra jamais que le xhr soit chargé, donc créer une nouvelle méthode pour surveiller un xhr et les attendre, ce sera le bien.
if $.active == 0
il n'y a donc pas d'appel xhrs actif (qui ne fonctionne qu'avec jQuery). pour l'appel javascript ajax, vous devez créer une variable dans votre projet et la simuler.la source
Vous pouvez écrire une logique pour gérer cela. J'ai écrit une méthode qui renverra le
WebElement
et cette méthode sera appelée trois fois ou vous pouvez augmenter le temps et ajouter une vérification nulle pourWebElement
Voici un exemplela source
J'ai exécuté un code javascript pour vérifier si le document est prêt. Cela m'a fait gagner beaucoup de temps en déboguant les tests de sélénium pour les sites qui ont un rendu côté client.
}
la source
la source
Comme Rubanov a écrit pour C #, je l'écris pour Java, et c'est:
la source
En Java, ce sera comme ci-dessous: -
la source
return document.readyState == 'loaded' || return document.readyState == 'complete'
Le code suivant devrait probablement fonctionner:
la source
Si votre page ou votre connexion réseau est lente, il est probable qu'aucune des solutions ci-dessus ne fonctionnera. Je les ai tous essayés et la seule chose qui a fonctionné pour moi est d'attendre le dernier élément visible sur cette page. Prenons par exemple la page Web Bing. Ils ont placé une icône CAMERA (bouton de recherche par image) à côté du bouton de recherche principal qui n'est visible qu'après le chargement de la page complète. Si tout le monde a fait cela, alors tout ce que nous avons à faire est d'utiliser une attente explicite comme dans les exemples ci-dessus.
la source
la source
Voici quelque chose de similaire, dans Ruby:
la source
Vous pouvez faire dormir le fil jusqu'à ce que la page soit rechargée. Ce n'est pas la meilleure solution, car vous devez avoir une estimation du temps de chargement de la page.
la source
J'ai vérifié que le chargement de la page était terminé, je travaille dans Selenium 3.14.0
la source
Pour les personnes qui ont besoin d'attendre qu'un élément spécifique apparaisse. (utilisé c #)
Ensuite, si vous voulez attendre par exemple si un class = "error-message" existe dans le DOM, vous faites simplement:
Pour id, ce sera alors
WaitForElement(driver, By.Id("yourid"));
la source
Utilisez-vous Angular? Si c'est le cas, il est possible que le pilote Web ne reconnaisse pas que les appels asynchrones sont terminés.
Je recommande de regarder Paul Hammants ngWebDriver . La méthode waitForAngularRequestsToFinish () pourrait être utile.
la source