Comment faire attendre Selenium 2.0 pour que la page se charge?
java
selenium
webdriver
selenium-webdriver
karthick kumar
la source
la source
Réponses:
Vous pouvez également vérifier pageloaded en utilisant le code suivant
la source
Utiliser la classe WebDriverWait
Voir aussi ici
Vous pouvez vous attendre à montrer un élément. quelque chose comme en C #:
la source
Si vous définissez l'attente implicite du pilote, puis appelez la
findElement
méthode sur un élément que vous attendez sur la page chargée, le WebDriver interrogera cet élément jusqu'à ce qu'il trouve l'élément ou atteigne la valeur de délai d'expiration.source: implicit-waits
la source
En général, avec Selenium 2.0, le pilote Web ne doit retourner le contrôle du code appelant qu'après avoir déterminé que la page a été chargée. Si ce n'est pas le cas, vous pouvez appeler
waitforelemement
, qui fait un cycle d'appelfindelement
jusqu'à ce qu'il soit trouvé ou expire (le délai peut être défini).la source
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
, en attendant que document.readyState soit "complet". En raison de l'aller-retour du sélénium au navigateur, les conditions de concurrence sont atténuées, je suppose, et cela "toujours" fonctionne pour moi. Après "click ()" quand je m'attends à ce qu'une page se charge, j'attends explicitement (en utilisant WebDriverWait) le readystate. ]Implémentation de Ruby:
la source
Vous pouvez supprimer la
System.out
ligne. Il est ajouté à des fins de débogage.la source
Toutes ces solutions conviennent à des cas spécifiques, mais elles souffrent d'au moins l'un des deux problèmes possibles:
Ils ne sont pas assez génériques - ils veulent que vous sachiez, à l'avance, qu'une condition spécifique sera vraie pour la page que vous allez visiter (par exemple, un élément sera affiché)
Ils sont ouverts à une condition de concurrence où vous utilisez un élément qui est réellement présent sur l'ancienne page ainsi que sur la nouvelle page.
Voici ma tentative d'une solution générique qui évite ce problème (en Python):
Tout d'abord, une fonction générique "wait" (utilisez un WebDriverWait si vous le souhaitez, je les trouve moches):
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 est actualisée ou chargée, 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 générique Pythonique, réutilisable, vous pouvez créer un gestionnaire de contexte:
Et puis vous pouvez l'utiliser sur à peu près n'importe quelle interaction au sélénium:
Je pense que c'est pare-balles! Qu'est-ce que tu penses?
Plus d'informations dans un blog à ce sujet ici
la source
Vous pouvez également utiliser la classe:
ExpectedConditions
pour attendre explicitement qu'un élément apparaisse sur la page Web avant de pouvoir entreprendre toute autre actionVous pouvez utiliser la
ExpectedConditions
classe pour déterminer si un élément est visible:Voir
ExpectedConditions class Javadoc
pour la liste de toutes les conditions que vous pouvez vérifier.la source
La réponse d'Imran retravaillée pour Java 7:
la source
Cela semble être une sérieuse limitation de WebDriver. Évidemment, attendre un élément n'impliquera pas le chargement de la page, en particulier le DOM peut être entièrement construit (état déjà prêt) par lequel JS est toujours en cours d'exécution et CSS et les images sont toujours en cours de chargement.
Je crois que la solution la plus simple consiste à définir une variable JS lors de l'événement onload après que tout est initialisé et à vérifier et attendre cette variable JS dans Selenium.
la source
Si vous souhaitez attendre le chargement d'un élément spécifique, vous pouvez utiliser la
isDisplayed()
méthode surRenderedWebElement
:(Exemple tiré du Guide de démarrage en 5 minutes )
la source
RenderedWebElement
en a pas dans l'API. Cependant, laisDisplayed()
méthode est désormais disponible directement surWebElement
.Attendez explicitement ou attendez conditionnellement dans cette attente jusqu'à ce que cette condition soit donnée.
Cela attendra chaque élément Web pendant 60 secondes.
Utilisez attendre implicitement l'attente de chaque élément de la page jusqu'à ce moment donné.
Cela attendra chaque élément Web pendant 60 secondes.
la source
Utilisez implicitement l'attente de chaque élément de la page jusqu'à l'heure donnée.
cette attente pour chaque élément sur la page pendant 30 secondes.
Une autre attente est Attendre explicitement ou attendre conditionnellement dans cette attente jusqu'à la condition donnée.
Dans id, donnez l'ID d'élément statique qui s'affiche différemment sur la page, dès que la page est chargée.
la source
Je suis surpris que les prédicats ne soient pas le premier choix, car vous savez généralement avec quels éléments vous allez ensuite interagir sur la page que vous attendez pour charger. Mon approche a toujours été de créer des prédicats / fonctions comme
waitForElementByID(String id)
etwaitForElemetVisibleByClass(String className)
, etc., puis de les utiliser et de les réutiliser là où j'en ai besoin, que ce soit pour un chargement de page ou un changement de contenu de page que j'attends.Par exemple,
Dans ma classe de test:
Dans mon parent de classe de test:
Bien que cela semble beaucoup, il prend soin de vérifier à plusieurs reprises pour vous et l'intervalle de fréquence de vérification peut être défini avec le temps d'attente ultime avant la fin du délai. De plus, vous réutiliserez ces méthodes.
Dans cet exemple, la classe parente a défini et lancé le
WebDriver driver
et leWebDriverWait driverWait
.J'espère que ça aide.
la source
La meilleure façon d'attendre le chargement des pages lors de l'utilisation des liaisons Java pour WebDriver est d'utiliser le modèle de conception d'objet de page avec PageFactory. Cela vous permet d'utiliser le
AjaxElementLocatorFactory
qui pour le mettre agit simplement comme une attente globale pour tous vos éléments. Il a des limites sur des éléments tels que des boîtes de dépôt ou des transitions javascript complexes, mais il réduira considérablement la quantité de code nécessaire et accélérera les temps de test. Un bon exemple peut être trouvé dans ce blog. Une compréhension de base de Core Java est supposée.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
la source
Solution NodeJS:
Dans Nodejs, vous pouvez l'obtenir via des promesses ...
Si vous écrivez ce code, vous pouvez être sûr que la page est entièrement chargée lorsque vous arrivez à la ...
Si vous écrivez ce code, vous naviguerez et le sélénium attendra 3 secondes ...
De la documentation Selenium:
this.get (url) → Thénable
Planifie une commande pour naviguer vers l'URL donnée.
Renvoie une promesse qui sera résolue une fois le chargement du document terminé .
Documentation sur le sélénium (Nodejs)
la source
Voici une version Java 8 de la réponse actuellement la plus appréciée :
Où
myDriver
est unWebDriver
objet (déclaré plus tôt).Remarque : sachez que cette méthode (
document.readyState
) vérifie uniquement le DOM.la source
Appelez ci-dessous Fonction dans votre script, cela attendra que la page ne soit pas chargée en utilisant javascript
la source
Vous pouvez passer du document à un élément, dans le cas où seule une partie d'un document est modifiée.
Cette technique a été inspirée par la réponse de Sincebasic.
la source
SeleniumWaiter :
Et pour vous l' utiliser :
la source
Vous pouvez utiliser la méthode existante ci-dessous pour définir le temps de pageeLoadTimeout dans l'exemple ci-dessous si la page prend plus de 20 secondes à charger, alors il lèvera une exception de rechargement de page
la source
Vous pouvez explicitement attendre qu'un élément apparaisse sur la page Web avant de pouvoir entreprendre une action (comme element.click ())
C'est ce que j'ai utilisé pour un scénario similaire et cela fonctionne très bien.
la source
Ma façon simple:
la source
La meilleure façon que j'ai vue est d'utiliser le
stalenessOf
attendue, d'attendre que l'ancienne page devienne périmée.Exemple:
Il faudra attendre dix secondes pour que l'ancienne balise HTML devienne périmée, puis lèvera une exception si cela ne se produit pas.
la source
J'utilise node + selenium-webdriver (dont la version est maintenant 3.5.0). ce que je fais pour cela est:
la source
Vous pouvez utiliser l'attente. il y a essentiellement 2 types d'attente dans le sélénium
- Attente implicite
C'est très simple, veuillez consulter la syntaxe ci-dessous:
- Attente explicite
Attendez explicitement ou attendez conditionnellement dans cette attente jusqu'à ce qu'une condition donnée se produise.
Vous pouvez utiliser d'autres propriétés comme
visblityOf()
,visblityOfElement()
la source
Si quelqu'un utilise du séléniure:
Plus de conditions peuvent être trouvées ici: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
la source
Dans mon cas, j'ai utilisé ce qui suit pour connaître l'état de chargement de la page. Dans notre application, des gifs de chargement sont présents et je les écoute comme suit pour éliminer les temps d'attente indésirables dans le script.
Où le xpath localise le gif dans le DOM HTML. Après cela, vous pouvez également implémenter vos méthodes d'action Cliquez sur.
la source
Man toutes ces réponses nécessitent trop de code. Cela devrait être une chose simple car c'est assez courant.
Pourquoi ne pas simplement injecter du javascript simple avec le pilote Web et vérifier. C'est la méthode que j'utilise dans ma classe Webscraper. Le javascript est assez basique même si vous ne connaissez pas js.
la source
Comment faire pour que Selenium attende le chargement de la page après un clic fournit l'approche intéressante suivante:
WebElement
de l'ancienne page.WebElement
jusqu'à ce queStaleElementReferenceException
soit lancé.Exemple de code:
la source
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.