Selenium

Wie man mit Selenium auf das Laden einer Seite wartet

Wie man mit Selenium auf das Laden einer Seite wartet
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 einseitige 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: Das ist etwas komplexer als das implizite Warten. In expliziter Wartezeit 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 kommt darauf an, 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,

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) Mozilla Firefox- oder Google Chrome-Webbrowser, die auf Ihrem Computer installiert sind.
6) Muss wissen, wie man den Firefox Gecko-Treiber oder den Chrome Web-Treiber installiert install.

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. Schauen Sie sie sich an, wenn Sie Hilfe benötigen.

Einrichten eines Projektverzeichnisses:

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

$ mkdir -pv selenium-wait/drivers

Navigieren Sie zum Selen-Warte/ Projektverzeichnis wie folgt:

$ cd Selen-warten/

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

$ virtualenv .venv

Aktivieren Sie die virtuelle Umgebung wie folgt:

$ Quelle .venv/bin/aktivieren

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 LinuxHinweis.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.

Arbeiten mit implizitem Warten:

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.

vom Selen-Import-Webtreiber
aus Selen.Webtreiber.verbreitet.Schlüsselimport Schlüssel
Optionen = Webtreiber.ChromeOptions()
Optionen.kopflos = wahr
Browser = Webtreiber.Chrome(executable_path="./drivers/chromedriver", options=options)
Browser.implizit_wait(10)
Browser.bekommen("https://www.unixtimestamp.com/")
Zeitstempel = Browser.find_element_by_xpath("//h3[@class='text-danger'][1]")
print('Aktueller Zeitstempel: %s' % (Zeitstempel.Text.split(")[0]))
Browser.schließen()

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() Browsermethode.

Zeile 10 lädt das 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 erhalten. 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 aus unixtimestamp extrahiert.com 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.

vom Selen-Import-Webtreiber
aus Selen.Webtreiber.verbreitet.Schlüsselimport Schlüssel
aus Selen.Webtreiber.verbreitet.per Import
aus Selen.Webtreiber.Unterstützung.ui importieren WebDriverWait
aus Selen.Webtreiber.Unterstützungsimport erwartete_bedingungen
Optionen = Webtreiber.ChromeOptions()
Optionen.kopflos = wahr
Browser = Webtreiber.Chrome(executable_path="./drivers/chromedriver", options=options)
Browser.bekommen("https://www.unixtimestamp.com/")
Versuchen:
Zeitstempel = WebDriverWait(Browser, 10).bis um(
erwartete_bedingungen.presence_of_element_located((Von.XPATH, "
//h3[@class='text-danger'][1]"))
)
print('Aktueller Zeitstempel: %s' % (Zeitstempel.Text.split(")[0]))
schließlich:
Browser.schließen()

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

Zeile 1-5 importiert alle benötigten 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 das 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, Durch.XPATH wird verwendet, um zu sagen presence_of_element_located() Methode, dass wir einen XPath-Selektor verwendet haben, 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 können, ist der aktuelle Zeitstempel von unixtimestamp.com wird auf der Konsole gedruckt.

Auswählen von Elementen in expliziten Wartezeiten:

Im vorherigen Abschnitt habe ich verwendet Durch.XPATH zur Auswahl 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:

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

Durch.KLASSENNAME - Wählt Element/Elemente mit CSS-Klassennamen aus.

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

Durch.ICH WÜRDE - Wählt Element nach ID aus

Durch.NAME - Wählt Element/Elemente nach Namen aus.

Durch.VERLINKE DEN NAMEN - Wählt Element/Elemente nach HTML-Tag-Namen aus.

Durch.LINK TEXT - Wählt Element/Elemente nach Linktext von ein (Anker) HTML-Tag.

Durch.PARTIAL_LINK_TEXT - Wählt Element/Elemente nach teilweisem Linktext von ein (Anker) HTML-Tag.

Weitere Informationen dazu finden Sie auf der Python Selenium API Documentation Page.

Erwartete Bedingungen bei expliziten Wartezeiten:

Im 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 Sie es auswählen.

Da sind andere erwartete_bedingungen Sie können 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 ist auf der Seite sichtbar, auf der das Element eine Breite und Höhe von mehr als 0 Zoll 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. Das Ortungsgerät ist ein Tupel von (Von, Selektor), wie ich im expliziten Wartebeispiel gezeigt habe.

presence_of_all_element_located() - Stellt sicher, dass alle Elemente mit den übereinstimmenden Locator ist auf der Seite vorhanden. Das Locator ist ein (Nach, 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. Das Locator ist ein (Von, Selektor) Tupel.

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

element_to_be_selected(Locator) - Überprüft, ob das von der Ortungsgerät ist ausgewählt. Das Ortungsgerät ist ein (Nach, Selektor) Tupel.

alert_is_present() - erwarten, dass ein Warndialog auf der Seite angezeigt wird.

Es gibt viele mehr erwartete_bedingungen für Sie verfügbar. Weitere Informationen dazu finden Sie auf der Python Selenium API Documentation Page.

Fazit:

In diesem Artikel habe ich die impliziten und expliziten Wartezeiten von Selenium diskutiert. Ich habe dir auch gezeigt, wie man mit einer impliziten und expliziten Wartezeit arbeitet. 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 Waits finden Sie auf der offiziellen Dokumentationsseite der Selenium Python Library Waits.

So ändern Sie die linke und rechte Maustaste auf einem Windows 10-PC
Es ist ganz normal, dass alle Computer-Maus-Geräte ergonomisch für Rechtshänder gestaltet sind. Es gibt aber auch Mausgeräte, die speziell für Linkshä...
Emulieren Sie Mausklicks, indem Sie den Mauszeiger mit der klicklosen Maus in Windows 10 bewegen
Die Verwendung einer Maus oder Tastatur in der falschen Haltung bei übermäßiger Nutzung kann zu vielen gesundheitlichen Problemen führen, einschließli...
Fügen Sie mit diesen kostenlosen Tools Mausgesten zu Windows 10 hinzu
In den letzten Jahren haben sich Computer und Betriebssysteme stark weiterentwickelt. Es gab eine Zeit, in der Benutzer Befehle verwenden mussten, um ...