La raison pour laquelle cela se produit est que le pilote Web Selenium doit télécharger la page Web et terminer le rendu de la page avant que vous puissiez faire quoi que ce soit dessus. Dans le passé, le serveur Web générait le contenu d'un site Web et le navigateur le téléchargeait et le rendait. De nos jours, nous avons de nombreuses applications Web à page unique qui fonctionnent un peu différemment. Dans les applications Web à page unique (SPA), le serveur Web ne sert que les codes frontaux. Une fois le code frontal rendu sur le navigateur, le code frontal utilise AJAX pour demander des données API au serveur Web. Une fois que le frontend reçoit les données de l'API, il les rend sur le navigateur. Ainsi, même si le navigateur a terminé le téléchargement et le rendu de la page Web, la page Web n'est toujours pas prête. Vous devez attendre qu'il reçoive les données de l'API et les restitue également. Donc, la solution à ce problème est d'attendre que les données soient disponibles avant de faire quoi que ce soit avec Selenium.
Dans Selenium, il existe 2 types d'attentes :
1) Attente implicite
2) Attente explicite
1) Attente implicite : C'est le plus simple à mettre en œuvre. Une attente implicite indique au pilote Web Selenium d'attendre plusieurs secondes que le DOM (modèle objet de document) soit prêt (la page Web soit prête).
2) Attente explicite : C'est un peu complexe que l'attente implicite. En attente explicite, vous indiquez au pilote Web Selenium ce qu'il doit attendre. Selenium attend que cette condition spécifique soit remplie. Une fois celui-ci rempli, le pilote Web Selenium sera prêt à prendre d'autres commandes. Habituellement, le temps d'attente explicite est variable. Cela dépend de la rapidité avec laquelle les conditions sont remplies. Dans le pire des cas, l'attente explicite attendra aussi longtemps que l'attente implicite.
Dans cet article, je vais vous montrer comment attendre (implicite et explicite) qu'une page se charge avec Selenium. Alors, commençons.
Conditions préalables:
Pour essayer les commandes et exemples de cet article, vous devez avoir,
1) Une distribution Linux (de préférence Ubuntu) installée sur votre ordinateur.
2) Python 3 installé sur votre ordinateur.
3) PIP 3 installé sur votre ordinateur.
4) Python virtualenv package installé sur votre ordinateur.
5) Navigateurs Web Mozilla Firefox ou Google Chrome installés sur votre ordinateur.
6) Doit savoir comment installer le pilote Firefox Gecko ou le pilote Web Chrome.
Pour remplir les conditions 4, 5 et 6, lisez mon article Introduction à Selenium avec Python 3 sur Linuxhint.com.
Vous pouvez trouver de nombreux articles sur les autres sujets sur LinuxHint.com . Assurez-vous de les consulter si vous avez besoin d'aide.
Configuration d'un répertoire de projet :
Pour que tout reste organisé, créez un nouveau répertoire de projet sélénium-attente/ comme suit:$mkdir -pvsélénium-attendre/Conducteurs
Naviguez vers le sélénium-attente/ répertoire du projet comme suit :$CDsélénium-attendre/
Créez un environnement virtuel Python dans le répertoire du projet comme suit :$virtualenv .venv
Activez l'environnement virtuel comme suit :$la source.venv/un m/Activer
Installez Selenium à l'aide de PIP3 comme suit :$ pip3 installer le sélénium
Téléchargez et installez tous les pilotes Web requis dans le Conducteurs/ répertoire du projet. J'ai expliqué le processus de téléchargement et d'installation des pilotes Web dans mon article Introduction à Selenium avec Python 3 . Si vous avez besoin d'aide, recherchez sur LinuxHint.com pour cet article.
J'utiliserai le navigateur Web Google Chrome pour la démonstration de cet article. Je vais donc utiliser le Chromedriver binaire de la Conducteurs/ annuaire.
Pour expérimenter l'attente implicite, créez un nouveau script Python ex01.py dans votre répertoire de projet et tapez les lignes de codes suivantes dans ce fichier.deséléniumimporterWebdriver
desélénium.Webdriver.commun.clés importerClés
options=pilote Web.Options Chrome()
option.sans tête = Vrai
navigateur=pilote Web.Chrome(chemin_exécutable='./drivers/chromedriver',options=options)
navigateur.implicitement_attendre(dix)
navigateur.avoir('https://www.unixtimestamp.com/')
horodatage=navigateur.find_element_by_xpath('//h3[@][1]')
imprimer('Horodatage actuel : %s'%(horodatage.texte.diviser('')[0]))
navigateur.proche()
Une fois que vous avez terminé, enregistrez le ex01.py Script Python.
Les lignes 1 et 2 importent tous les composants Selenium requis.
La ligne 4 crée un objet Options Chrome.
La ligne 5 active le mode sans tête pour le pilote Web Chrome.
La ligne 7 crée un objet de navigateur Chrome à l'aide de la Chromedriver binaire de la Conducteurs/ annuaire.
La ligne 8 est utilisée pour dire à Selenium d'attendre implicitement pendant 10 secondes en utilisant le implicitement_wait() méthode du navigateur.
La ligne 10 charge le www.unixtimestamp.com dans le navigateur.
La ligne 12 trouve l'élément d'horodatage à l'aide du sélecteur XPath //h3[@class='text-danger'][1] et le stocke dans le horodatage variable.
J'ai obtenu le sélecteur XPath de l'outil de développement Chrome. Comme vous pouvez le voir, l'horodatage est dans le premier h3 élément avec le nom de la classe texte-danger . Il ya deux h3 éléments avec la classe texte-danger .
La ligne 13 n'imprime que l'horodatage de l'élément que j'ai sélectionné à l'aide du sélecteur XPath et stocké dans le horodatage variable.
La ligne 14 ferme le navigateur.
Une fois que vous avez terminé, exécutez le script Python ex01.py comme suit:$ python3 ex01.py
Comme vous pouvez le voir, l'horodatage actuel est extrait de unixtimestamp.com et imprimé sur la console.
Utilisation de l'attente explicite :
Pour expérimenter l'attente explicite, créez un nouveau script Python ex02.py dans votre répertoire de projet et tapez les lignes de codes suivantes dans ce fichier.deséléniumimporterWebdriver
desélénium.Webdriver.commun.clés importerClés
desélénium.Webdriver.commun.par importerPar
desélénium.Webdriver.Support.oignon importerWebDriverAttendez
desélénium.Webdriver.Support importerconditions_attendues
options=pilote Web.Options Chrome()
option.sans tête = Vrai
navigateur=pilote Web.Chrome(chemin_exécutable='./drivers/chromedriver',options=options)
navigateur.avoir('https://www.unixtimestamp.com/')
essayer:
horodatage=WebDriverAttendez(navigateur, dix).jusqu'à(
conditions_attendues.présence_de_élément_localisé((Par.XPATH, '
//h3[@][1]'))
)
imprimer('Horodatage actuel : %s'%(horodatage.texte.diviser('')[0]))
finalement:
navigateur.proche()
Une fois que vous avez terminé, enregistrez le ex02.py Script Python.
La ligne 1-5 importe tous les composants requis de la bibliothèque Selenium.
La ligne 7 crée un objet Options Chrome.
La ligne 8 active le mode sans tête pour le pilote Web Chrome.
La ligne 10 crée un objet de navigateur Chrome à l'aide du Chromedriver binaire de la Conducteurs/ annuaire.
La ligne 12 charge le www.unixtimestamp.com dans le navigateur.
L'attente explicite est implémentée dans le bloc try-finally (de la ligne 14-20)
La ligne 15-17 utilise crée WebDriverWait() objet. Le premier argument de WebDriverWait() est l'objet navigateur, et le deuxième argument est le temps maximum autorisé (scénario le plus défavorable) pour remplir la condition, qui est de 10 secondes dans ce cas.
Dans le jusqu'à() bloquer, expect_conditions.presence_of_element_located() La méthode est utilisée pour s'assurer que l'élément est présent avant d'essayer de sélectionner l'élément. Ici, Par.XPATH est utilisé pour dire au présence_de_élément_localisé() méthode que nous avons utilisé un sélecteur XPath pour sélectionner l'élément. Le sélecteur XPath est //h3[@class='text-danger'][1] .
Une fois l'élément trouvé, il est stocké dans le horodatage variable.
La ligne 18 imprime uniquement l'horodatage de l'élément sélectionné.
Enfin, la ligne 19-20 ferme le navigateur.
Une fois que vous avez terminé, exécutez le ex02.py Script Python comme suit :$ python3 ex02.py
Comme vous pouvez le voir, l'horodatage actuel de unixtimestamp.com est imprimé sur la console.
Sélection d'éléments dans les attentes explicites :
Dans la section précédente, j'ai utilisé Par.XPATH pour sélectionner l'élément à l'aide du sélecteur XPath. Vous pouvez également sélectionner les éléments à l'aide de l'ID, du nom de la balise, du nom de la classe CSS, du sélecteur CSS, etc.
Les méthodes de sélection prises en charge sont indiquées ci-dessous :
Par.XPATH – Sélectionne l'élément/les éléments à l'aide du sélecteur XPath.
Par.CLASS_NAME – Sélectionne l'élément/les éléments à l'aide du nom de classe CSS.
Par.CSS_SELECTOR – Sélectionne l'élément/les éléments à l'aide du sélecteur CSS.
Par.ID – Sélectionne l'élément par ID
De nom – Sélectionne l'élément/les éléments par nom.
Par.TAG_NAME – Sélectionne l'élément/les éléments par nom de balise HTML.
Par.LINK_TEXT – Sélectionne l'élément/les éléments par le texte du lien de à (ancre) balise HTML.
Par.PARTIAL_LINK_TEXT – Sélectionne l'élément/les éléments par le texte de lien partiel de à (ancre) balise HTML.
Pour plus d'informations à ce sujet, visitez le Page de documentation de l'API Python Selenium .
Conditions attendues dans les attentes explicites :
Dans l'exemple d'attente explicite précédent, j'ai utilisé le présence_de_élément_localisé() méthode de conditions_attendues comme condition d'attente explicite pour m'assurer que l'élément que je cherchais existe avant de le sélectionner.
Il y a d'autres conditions_attendues vous pouvez utiliser comme condition d'attente explicite. Certains d'entre eux sont:
title_is(titre) – vérifie si le titre de la page est Titre .
title_contains(partial_title) – vérifie si le titre de la page contient une partie du titre titre_partiel .
visibilité_de(élément) – vérifie si le élément est visible sur la page où l'élément a une largeur et une hauteur supérieures à 0.
visibilité_de_élément_localisé(localisateur) -
présence_de_élément_localisé(localisateur) – Assurez-vous que l'élément situé (par le localisateur ) est présent sur la page. Les localisateur est un tuple de (Par, sélecteur), comme je l'ai montré dans l'exemple d'attente explicite.
presence_of_all_element_located() – S'assure que tous les éléments auxquels correspond le localisateur est présent sur la page. Les localisateur est un (Par, sélecteur) tuple.
text_to_be_present_in_element(localisateur, texte) – Vérifie si le texte est présent dans l'élément situé par le localisateur . Les localisateur est un (Par, sélecteur) tuple.
element_to_be_clickable(localisateur) – Vérifie si l'élément localisé par le localisateur est visible et cliquable. Les localisateur est un (Par, sélecteur) tuple.
element_to_be_selected(localisateur) – Vérifie si l'élément localisé par le localisateur est sélectionné. Les localisateur est un (Par, sélecteur) tuple.
alert_is_present() – attendez-vous à ce qu'une boîte de dialogue d'alerte soit présente sur la page.
Il y en a beaucoup plus conditions_attendues à votre disposition. Pour plus d'informations à ce sujet, visitez le Page de documentation de l'API Python Selenium .
Conclusion:
Dans cet article, j'ai discuté des attentes implicites et explicites de Selenium. Je vous ai également montré comment travailler avec une attente implicite et explicite. Vous devriez toujours essayer d'utiliser une attente explicite dans vos projets Selenium, car Selenium essaiera de réduire le temps d'attente autant que possible. De cette façon, vous n'aurez pas à attendre un certain nombre de secondes à chaque fois que vous exécuterez vos projets Selenium. L'attente explicite devrait faire gagner beaucoup de secondes.
Pour plus d'informations sur les attentes de Selenium, visitez la bibliothèque officielle Selenium Python attend la page de documentation .