Comment attendre qu'une page se charge avec le sélénium

Comment attendre qu'une page se charge avec le sélénium
Alors que l'automatisation Web ou le grattage Web avec le pilote Web Selenium, vous pouvez faire face à des problèmes comme l'élément que vous souhaitez sélectionner n'est pas disponible ou le bouton que vous souhaitez appuyer n'est pas prêt à être cliqué et ainsi.

La raison pour laquelle cela se produit est que le pilote Web Selenium doit télécharger la page Web et finir de rendre la page avant de pouvoir faire quoi que ce soit dessus. Dans le passé, le serveur Web a généré le contenu d'un site Web, et le navigateur vient de le télécharger et l'a rendu. Ces jours-ci, nous avons de nombreuses applications Web d'une seule page qui fonctionnent un peu différemment. Dans les applications Web (SPAS) à une seule page, le serveur Web ne sert que les codes de frontend. Une fois que le code frontal est rendu sur le navigateur, le code frontend utilise Ajax pour demander des données API au serveur Web. Une fois que le frontend a reçu les données de l'API, elle les rend sur le navigateur. Donc, même si le navigateur a fini de télécharger et de rendre 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 rendre également. Ainsi, la solution à ce problème est d'attendre que les données soient disponibles avant de faire quoi que ce soit avec le sélénium.

Dans le sélénium, il existe 2 types d'attentions:
1) attente implicite
2) attente explicite

1) Attente implicite: C'est le plus facile à mettre en œuvre. Une attente implicite indique au pilote Web Selenium d'attendre plusieurs secondes pour que le DOM (modèle de document d'objet) soit prêt (la page Web est prête).

2) attente explicite: C'est un peu complexe que l'attente implicite. Dans une attente explicite, vous dites au pilote Web de Selenium quoi attendre. Selenium attend que cette condition spécifique soit remplie. Une fois 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 tant que l'attente implicite.

Dans cet article, je vais vous montrer comment attendre (implicite et explicite) pour qu'une page se charge de sélénium. Alors, commençons.

Conditions préalables:

Pour essayer les commandes et les 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 virtualv Package installé sur votre ordinateur.
5) Mozilla Firefox ou Google Chrome Web Browsers installé sur votre ordinateur.
6) Doit savoir comment installer le pilote Firefox Gecko ou le pilote Web Chrome.

Pour répondre aux exigences 4, 5 et 6, lisez mon article Introduction au sélénium avec Python 3 à Linuxhint.com.

Vous pouvez trouver de nombreux articles sur les autres sujets sur Linuxhint.com. Assurez-vous de les vérifier si vous avez besoin d'aide.

Configuration d'un répertoire de projet:

Pour garder tout organisé, créez un nouveau répertoire de projet sélénium-wait / comme suit:

$ mkdir -pv sélénium-wait / pilotes

Accédez à la sélénium-wait / Répertoire de projet comme suit:

$ CD Selenium-wait /

Créez un environnement virtuel Python dans le répertoire de projet comme suit:

$ virtualenv .venv

Activez l'environnement virtuel comme suit:

$ source .Venv / bin / Activer

Installez le sélénium en utilisant PIP3 comme suit:

$ pip3 installer le sélénium

Téléchargez et installez tout le pilote Web requis dans le Conducteurs/ Annuaire du projet. J'ai expliqué le processus de téléchargement et d'installation de pilotes Web dans mon article Introduction au sélénium 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. Donc, j'utiliserai le chromedriver binaire du Conducteurs/ annuaire.

Travailler avec une attente implicite:

Pour expérimenter avec une attente implicite, créez un nouveau script Python ex01.py dans votre répertoire de projet et saisissez les lignes de codes suivantes dans ce fichier.

à partir de Selenium Import WebDriver
de sélénium.webdriver.commun.Clés Import les clés
Options = webDriver.ChromeOptions ()
options.sans tête = vrai
navigateur = webdriver.Chrome (exécutable_path = "./ pilotes / chromedriver ", options = options)
navigateur.Implicitly_wait (10)
navigateur.get ("https: // www.Unixtimestamp.com / ")
horodatage = navigateur.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
Imprimer ('Timestamp actuel:% S'% (horodatage.texte.Split (") [0]))
navigateur.fermer()

Une fois que vous avez terminé, enregistrez le ex01.py Script python.

Les lignes 1 et 2 importent tous les composants de sélénium requis.

La ligne 4 crée un objet Chrome Options.

La ligne 5 permet le mode sans tête pour le pilote Web Chrome.

La ligne 7 crée un objet de navigateur chromé à l'aide du chromedriver binaire du Conducteurs/ annuaire.

La ligne 8 est utilisée pour dire à Selenium d'attendre implicitement 10 secondes en utilisant le Implicitly_wait () méthode du navigateur.

La ligne 10 charge le www.Unixtimestamp.com dans le navigateur.

La ligne 12 trouve l'élément horodat // h3 [@ class = 'text-danger'] [1] et le stocke dans le horodatage variable.

J'ai obtenu le sélecteur XPATH de l'outil de développeur Chrome. Comme vous pouvez le voir, l'horodatage est dans le premier h3 élément avec le nom de classe danger de texte. Il ya deux h3 Éléments avec la classe danger de texte.

La ligne 13 imprime uniquement 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.

Travailler avec une attente explicite:

Pour expérimenter avec une attente explicite, créez un nouveau script Python ex02.py dans votre répertoire de projet et saisissez les lignes de codes suivantes dans ce fichier.

à partir de Selenium Import WebDriver
de sélénium.webdriver.commun.Clés Import les clés
de sélénium.webdriver.commun.par importation par
de sélénium.webdriver.soutien.UI Importer WebDriverWait
de sélénium.webdriver.Prise en charge de l'importation attendue_conditions
Options = webDriver.ChromeOptions ()
options.sans tête = vrai
navigateur = webdriver.Chrome (exécutable_path = "./ pilotes / chromedriver ", options = options)
navigateur.get ("https: // www.Unixtimestamp.com / ")
essayer:
Timestamp = WebDriverWait (navigateur, 10).jusqu'à(
attend_conditions.présence_of_element_located ((par.Xpath, "
// h3 [@ class = 'text-danger'] [1] "))
)
Imprimer ('Timestamp actuel:% S'% (horodatage.texte.Split (") [0]))
enfin:
navigateur.fermer()

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 de sélénium.

La ligne 7 crée un objet Chrome Options.

La ligne 8 permet le mode sans tête pour le pilote Web Chrome.

La ligne 10 crée un objet de navigateur chromé à l'aide du chromedriver binaire du Conducteurs/ annuaire.

Ligne 12 charge le www.Unixtimestamp.com dans le navigateur.

L'attente explicite est implémentée dans le bloc d'essai (de la ligne 14-20)

La ligne 15-17 utilise des créations WebDriverWait () objet. Le premier argument de WebDriverWait () est l'objet du navigateur, et le deuxième argument est le temps maximum autorisé (pire des cas) pour remplir la condition, qui est de 10 secondes dans ce cas.

Dans le jusqu'à() bloc, attend_conditions.présence_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 le présence_of_element_located () 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.

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 des 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 prise en charge sont données ci-dessous:

Par.Xpath - Sélectionne les éléments / éléments à l'aide du sélecteur XPATH.

Par.NOM DU COURS - Sélectionne les éléments / éléments en utilisant le nom de la classe CSS.

Par.CSS_Selector - Sélectionne les éléments / éléments à l'aide du sélecteur CSS.

Par.IDENTIFIANT - Sélectionne l'élément par ID

Par.NOM - Sélectionne les éléments / éléments par nom.

Par.TAG_NAME - Sélectionne les éléments / éléments par nom de balise HTML.

Par.Link_text - Sélectionne les éléments / éléments par le texte du lien de un (ancre) tag html.

Par.Partial_link_text - Sélectionne les éléments / éléments par texte de lien partiel de un (ancre) tag html.

Pour plus d'informations à ce sujet, visitez la page de documentation de l'API Python Selenium.

Conditions attendues dans des attentes explicites:

Dans l'exemple d'attente explicite précédent, j'ai utilisé le présence_of_element_located () méthode de attend_conditions Comme la condition d'attente explicite pour s'assurer que l'élément que je recherchais existe avant de le sélectionner.

Il y en a d'autres attend_conditions 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 partial_title.

Visibility_of (élément) - vérifie si le élément est visible sur la page qui est l'élément a une largeur et une hauteur supérieures à 0.

Visibility_of_element_located (Locator) -

présence_of_element_located (localisateur) - Assurez-vous que l'élément situé (par le localisateur) est présent sur la page. Le localisateur est un tuple de (Par, sélecteur), Comme je l'ai montré dans l'exemple d'attente explicite.

présence_of_all_element_located () - S'assure que tous les éléments correspondaient par le localisateur est présent sur la page. Le localisateur est un (Par, sélecteur) tuple.

text_to_be_present_in_element (locateur, texte) - Vérifie si le texte est présent dans l'élément situé par le localisateur. Le localisateur est un (Par, sélecteur) tuple.

element_to_be_clickable (localisateur) - Vérifie si l'élément situé par le localisateur est visible et cliquable. Le localisateur est un (Par, sélecteur) tuple.

element_to_be_selected (localisateur) - Vérifie si l'élément situé par le localisateur est sélectionné. Le 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 attend_conditions Disponible pour que vous puissiez utiliser. Pour plus d'informations à ce sujet, visitez la 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 devez toujours essayer d'utiliser une attente explicite dans vos projets de sélénium car le sélénium essaiera de réduire le temps d'attente autant que possible. De cette façon, vous n'aurez pas à attendre un nombre spécifique de secondes à chaque fois que vous exécutez vos projets de sélénium. L'attente explicite devrait économiser beaucoup de secondes.

Pour plus d'informations sur les attentes de Selenium, visitez la page de documentation officielle de la bibliothèque de Selenium Python.