Wie man mit Selenium auf das Laden einer Seite wartet

How Wait Page Load With Selenium



Während der Webautomatisierung oder des Web-Scrapings mit dem Selenium-Webtreiber können Probleme auftreten, z. B. das Element, das Sie auswählen möchten, ist nicht verfügbar oder die Schaltfläche, die Sie drücken möchten, kann nicht angeklickt werden usw.

Der Grund dafür ist, dass der Selenium-Webtreiber die Webseite herunterladen und das Rendern der Seite beenden muss, bevor Sie etwas daran tun können. In der Vergangenheit hat der Webserver den Inhalt einer Website generiert und der Browser hat ihn einfach heruntergeladen und gerendert. Heutzutage haben wir viele Single-Page-Web-Apps, die ein bisschen anders funktionieren. In Single Page Web Apps (SPAs) bedient der Webserver nur die Frontend-Codes. Sobald der Frontend-Code im Browser gerendert wurde, verwendet der Frontend-Code AJAX, um API-Daten an den Webserver anzufordern. Sobald das Frontend die API-Daten erhält, rendert es sie im Browser. Auch wenn der Browser das Herunterladen und Rendern der Webseite abgeschlossen hat, ist die Webseite immer noch nicht bereit. Sie müssen warten, bis es die API-Daten empfängt und auch rendert. Die Lösung für dieses Problem besteht also darin, zu warten, bis die Daten verfügbar sind, bevor wir etwas mit Selenium unternehmen.







In Selenium gibt es 2 Arten von Wartezeiten:
1) Implizites Warten
2) Explizites Warten



1) Implizites Warten: Dies ist am einfachsten zu implementieren. Ein implizites Warten weist den Selenium-Webtreiber an, einige Sekunden zu warten, bis das DOM (Dokumentobjektmodell) bereit ist (die Webseite ist bereit).



2) Explizites Warten: Dies ist etwas komplexer als das implizite Warten. Beim expliziten Warten teilen Sie dem Selenium-Webtreiber mit, worauf er warten soll. Selen wartet darauf, dass diese spezifische Bedingung erfüllt ist. Sobald es erfüllt ist, ist der Selenium-Webtreiber bereit, andere Befehle zu übernehmen. Normalerweise ist die explizite Wartezeit variabel. Es hängt davon ab, wie schnell die Bedingungen erfüllt sind. Im schlimmsten Fall wird das explizite Warten so lange warten wie das implizite Warten.





In diesem Artikel zeige ich Ihnen, wie Sie warten (implizit und explizit), bis eine Seite mit Selenium geladen wird. Also lasst uns anfangen.

Voraussetzungen:

Um die Befehle und Beispiele dieses Artikels auszuprobieren, müssen Sie Folgendes haben:



1) Eine auf Ihrem Computer installierte Linux-Distribution (vorzugsweise Ubuntu).
2) Python 3 auf Ihrem Computer installiert.
3) PIP 3 auf Ihrem Computer installiert.
4) Python virtuelle Umgebung Paket auf Ihrem Computer installiert.
5) Auf Ihrem Computer installierte Webbrowser Mozilla Firefox oder Google Chrome.
6) Muss wissen, wie man den Firefox Gecko-Treiber oder den Chrome Web-Treiber installiert.

Um die Anforderungen 4, 5 und 6 zu erfüllen, lesen Sie meinen Artikel Einführung in Selenium mit Python 3 bei Linuxhint.com.

Viele Artikel zu den anderen Themen finden Sie auf LinuxHint.com . Sehen Sie sich diese unbedingt an, wenn Sie Hilfe benötigen.

Einrichten eines Projektverzeichnisses:

Um alles organisiert zu halten, erstellen Sie ein neues Projektverzeichnis Selen-Warte/ wie folgt:

$mkdir -pvSelen-Warte/Fahrer

Navigieren Sie zum Selen-Warte/ Projektverzeichnis wie folgt:

$CDSelen-Warte/

Erstellen Sie eine virtuelle Python-Umgebung im Projektverzeichnis wie folgt:

$virtualenv .venv

Aktivieren Sie die virtuelle Umgebung wie folgt:

$Quelle.venv/bin/aktivieren Sie

Installieren Sie Selenium mit PIP3 wie folgt:

$ pip3 Selen installieren

Laden Sie alle erforderlichen Webtreiber herunter und installieren Sie sie im Fahrer/ Verzeichnis des Projekts. Den Vorgang zum Herunterladen und Installieren von Webtreibern habe ich in meinem Artikel erklärt Einführung in Selenium mit Python 3 . Wenn Sie Hilfe benötigen, suchen Sie auf LinuxHint.com für diesen Artikel.

Ich werde den Google Chrome-Webbrowser für die Demonstration in diesem Artikel verwenden. Also werde ich die verwenden Chromtreiber binär aus dem Fahrer/ Verzeichnis.

Um mit implizitem Warten zu experimentieren, erstellen Sie ein neues Python-Skript ex01.py in Ihrem Projektverzeichnis und geben Sie die folgenden Codezeilen in diese Datei ein.

vonSelenimportierenWebtreiber
vonSelen.Webtreiber.gemeinsames.Schlüssel importierenSchlüssel
Optionen=Webtreiber.ChromeOptionen()
Optionen.kopflos = Wahr
Browser=Webtreiber.Chrom(ausführbarer_Pfad='./drivers/chromedriver',Optionen=Optionen)
Browser.implizit_wait(10)
Browser.werden('https://www.unixtimestamp.com/')
Zeitstempel=Browser.find_element_by_xpath('//h3[@][1]')
drucken('Aktueller Zeitstempel: %s'%(Zeitstempel.Text.Teilt('')[0]))
Browser.nah dran()

Wenn Sie fertig sind, speichern Sie die ex01.py Python-Skript.

Zeile 1 und 2 importiert alle erforderlichen Selenium-Komponenten.

Zeile 4 erstellt ein Chrome Options-Objekt.

Zeile 5 aktiviert den Headless-Modus für den Chrome-Webtreiber.

Zeile 7 erstellt ein Chrome-Browserobjekt mit dem Chromtreiber binär aus dem Fahrer/ Verzeichnis.

Zeile 8 wird verwendet, um Selenium anzuweisen, implizit 10 Sekunden zu warten, indem die implizit_wait() Browser-Methode.

Zeile 10 lädt www.unixtimestamp.com im Browser.

Zeile 12 findet das Zeitstempelelement mithilfe des XPath-Selektors //h3[@class=’text-danger’][1] und speichert es im Zeitstempel Variable.

Ich habe den XPath-Selektor vom Chrome Developer Tool. Wie Sie sehen, befindet sich der Zeitstempel im ersten h3 Element mit dem Klassennamen Text-Gefahr . Da sind 2 h3 Elemente mit der Klasse Text-Gefahr .

Zeile 13 druckt nur den Zeitstempel des Elements, das ich mit dem XPath-Selektor ausgewählt und im gespeichert habe Zeitstempel Variable.

Zeile 14 schließt den Browser.

Wenn Sie fertig sind, führen Sie das Python-Skript aus ex01.py wie folgt:

$python3 ex01.py

Wie Sie sehen, wird der aktuelle Zeitstempel von unixtimestamp.com extrahiert und auf der Konsole gedruckt.

Arbeiten mit expliziter Wartezeit:

Um mit explizitem Warten zu experimentieren, erstellen Sie ein neues Python-Skript ex02.py in Ihrem Projektverzeichnis und geben Sie die folgenden Codezeilen in diese Datei ein.

vonSelenimportierenWebtreiber
vonSelen.Webtreiber.gemeinsames.Schlüssel importierenSchlüssel
vonSelen.Webtreiber.gemeinsames.von importierenVon
vonSelen.Webtreiber.Unterstützung.Zwiebel importierenWebDriverWarten
vonSelen.Webtreiber.Unterstützung importierenerwartete_bedingungen
Optionen=Webtreiber.ChromeOptionen()
Optionen.kopflos = Wahr
Browser=Webtreiber.Chrom(ausführbarer_Pfad='./drivers/chromedriver',Optionen=Optionen)
Browser.werden('https://www.unixtimestamp.com/')
Versuchen:
Zeitstempel=WebDriverWarten(Browser, 10).bis um(
erwartete_bedingungen.presence_of_element_located((Von.XPATH, '
//h3[@][1]'
))
)
drucken('Aktueller Zeitstempel: %s'%(Zeitstempel.Text.Teilt('')[0]))
Endlich:
Browser.nah dran()

Wenn Sie fertig sind, speichern Sie die ex02.py Python-Skript.

Zeile 1-5 importiert alle erforderlichen Komponenten aus der Selenium-Bibliothek.

Zeile 7 erstellt ein Chrome Options-Objekt.

Zeile 8 aktiviert den Headless-Modus für den Chrome-Webtreiber.

Zeile 10 erstellt ein Chrome-Browserobjekt mit dem Chromtreiber binär aus dem Fahrer/ Verzeichnis.

Zeile 12 lädt www.unixtimestamp.com im Browser.

Das explizite Warten ist im try-finally-Block implementiert (ab Zeile 14-20)

Zeile 15-17 verwendet erstellt WebDriverWait() Objekt. Das erste Argument von WebDriverWait() ist das Browser-Objekt, und das zweite Argument ist die maximal zulässige Zeit (Worst-Case-Szenario) für die Erfüllung der Bedingung, die in diesem Fall 10 Sekunden beträgt.

In dem bis um() Block, erwartete_bedingungen.presence_of_element_located() -Methode wird verwendet, um sicherzustellen, dass das Element vorhanden ist, bevor versucht wird, das Element auszuwählen. Hier, Von.XPATH wird verwendet, um zu sagen presence_of_element_located() -Methode haben wir einen XPath-Selektor verwendet, um das Element auszuwählen. Der XPath-Selektor ist //h3[@class=’text-danger’][1] .

Sobald das Element gefunden wurde, wird es im Zeitstempel Variable.

Zeile 18 druckt nur den Zeitstempel des ausgewählten Elements.

Schließlich schließt Zeile 19-20 den Browser.

Wenn Sie fertig sind, führen Sie die ex02.py Python-Skript wie folgt:

$python3 ex02.py

Wie Sie sehen, wird der aktuelle Zeitstempel von unixtimestamp.com auf der Konsole gedruckt.

Auswählen von Elementen in expliziten Wartezeiten:

Im vorherigen Abschnitt habe ich verwendet Von.XPATH zum Auswählen des Elements mit dem XPath-Selektor. Sie können die Elemente auch anhand von ID, Tag-Name, CSS-Klassenname, CSS-Selektor usw. auswählen.

Die unterstützten Auswahlmethoden sind nachfolgend aufgeführt:

Von.XPATH – Wählt Element/Elemente mit XPath-Selektor aus.

Von.CLASS_NAME – Wählt Element/Elemente mit CSS-Klassennamen aus.

Von.CSS_SELECTOR – Wählt Element/Elemente mit CSS-Selektor aus.

Nach.ID – Wählt Element nach ID

Namentlich – Wählt Element/Elemente nach Namen aus.

Von.TAG_NAME – Wählt Element/Elemente nach HTML-Tag-Namen aus.

Von.LINK_TEXT – Wählt Element/Elemente nach Linktext von zu (Anker) HTML-Tag.

Von.PARTIAL_LINK_TEXT – Wählt Element/Elemente durch teilweisen Linktext von zu (Anker) HTML-Tag.

Weitere Informationen zu diesen finden Sie auf der Python Selenium API-Dokumentationsseite .

Erwartete Bedingungen bei expliziten Wartezeiten:

In dem früheren expliziten Wait-Beispiel habe ich die presence_of_element_located() Methode von erwartete_bedingungen als explizite Wartebedingung, um sicherzustellen, dass das gesuchte Element existiert, bevor es ausgewählt wird.

Da sind andere erwartete_bedingungen Sie können es als explizite Wartebedingung verwenden. Einige von ihnen sind:

title_is(Titel) – prüft, ob der Titel der Seite Titel .

title_contains(partial_title) – prüft, ob der Titel der Seite einen Teil des Titels enthält partieller_titel .

Sichtbarkeit_von(Element) – prüft, ob die Element auf der Seite sichtbar ist, auf der das Element eine Breite und Höhe größer als 0 hat.

visible_of_element_located(Locator) -

presence_of_element_located(Locator) – Stellen Sie sicher, dass das Element, das sich (am Ortungsgerät ) ist auf der Seite vorhanden. Die Ortungsgerät ist ein Tupel von (Nach, Selektor), wie ich im expliziten Wait-Beispiel gezeigt habe.

presence_of_all_element_located() – Stellt sicher, dass alle Elemente, die von der Ortungsgerät ist auf der Seite vorhanden. Die Ortungsgerät ist ein (Von, Selektor) Tupel.

text_to_be_present_in_element(Locator, Text) – Überprüft, ob die Text ist in dem Element vorhanden, das von der Ortungsgerät . Die Ortungsgerät ist ein (Von, Selektor) Tupel.

element_to_be_clickable(Locator) – Überprüft, ob das von der Ortungsgerät ist sichtbar und anklickbar. Die Ortungsgerät ist ein (Von, Selektor) Tupel.

element_to_be_selected(Locator) – Überprüft, ob das von der Ortungsgerät ist ausgewählt. Die Ortungsgerät ist ein (Von, Selektor) Tupel.

alert_is_present() – erwarten, dass auf der Seite ein Warndialogfeld angezeigt wird.

Es gibt viele mehr erwartete_bedingungen für Sie zur Verfügung. Weitere Informationen zu diesen finden Sie auf der Python Selenium API-Dokumentationsseite .

Abschluss:

In diesem Artikel habe ich die impliziten und expliziten Wartezeiten von Selenium diskutiert. Ich habe Ihnen auch gezeigt, wie Sie mit einer impliziten und expliziten Wartezeit arbeiten. Sie sollten immer versuchen, explizite Wartezeiten in Ihren Selenium-Projekten zu verwenden, da Selenium versucht, die Wartezeit so weit wie möglich zu reduzieren. Auf diese Weise müssen Sie nicht jedes Mal, wenn Sie Ihre Selenium-Projekte ausführen, eine bestimmte Anzahl von Sekunden warten. Das explizite Warten sollte viele Sekunden sparen.

Weitere Informationen zu Selenium-Wartezeiten finden Sie unter die offizielle Selenium Python Library wartet auf die Dokumentationsseite .