So warten Sie auf eine Seite mit Selen in Selen

So warten Sie auf eine Seite mit Selen in Selen
Während Webautomation oder Web -Scraping mit Selenium -Web -Treiber möglicherweise Probleme haben, wie das Element, das Sie auswählen möchten, nicht verfügbar ist oder die Schaltfläche, die Sie drücken möchten.

Der Grund dafür ist, dass der Selenium -Web -Treiber die Webseite herunterladen und die Seite beenden muss, bevor Sie etwas darauf tun können. In der Vergangenheit generierte der Webserver den Inhalt einer Website, und der Browser hat ihn gerade heruntergeladen und rendern. Heutzutage haben wir viele einseitige Web-Apps, die ein bisschen anders funktionieren. In einseitigen Web Apps (SPAS) bedient der Webserver nur die Frontend -Codes. Sobald der Frontend -Code auf dem Browser gerendert wurde, verwendet der Frontend -Code AJAX, um API -Daten an den Webserver anzufordern. Sobald der Frontend die API -Daten empfängt. Obwohl der Browser die Webseite heruntergeladen und rendert, ist die Webseite noch nicht fertig. Sie müssen warten, bis es die API -Daten empfängt und sie auch rendert. Die Lösung für dieses Problem besteht also darin, darauf zu warten, dass die Daten verfügbar sind, bevor wir etwas mit Selen machen.

In Selen gibt es 2 Arten von Waiten:
1) implizites Warten
2) Explizites Warten

1) implizite Wartezeit: Dies ist am einfachsten umzusetzen. Eine implizite Wartezeit sagt dem Selenium -Web -Treiber, dass er mehrere Sekunden lang wartet, bis das DOM (Dokumentobjektmodell) fertig ist (die Webseite, um fertig zu sein).

2) Explizites Warten: Dies ist ein bisschen komplex als das implizite Warten. In explizitem Warten teilen Sie dem Selenium -Web -Treiber mit. Selenium wartet darauf, dass diese bestimmte Bedingung erfüllt wird. Sobald es erfüllt ist, ist der Selenium -Web -Treiber bereit, andere Befehle zu nehmen. 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, bis das implizite Warten.

In diesem Artikel werde ich Ihnen zeigen, wie Sie (implizit und explizit) auf eine Seite mit Selen warten können. Also lasst uns anfangen.

Voraussetzungen:

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

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

Lesen Sie meinen Artikel, um die Anforderungen 4, 5 und 6 zu erfüllen Einführung in Selen mit Python 3 bei LinuxHint.com.

Sie können viele Artikel zu den anderen Themen unter LinuxHint finden.com. Schauen Sie sich sie an, wenn Sie Hilfe benötigen.

Einrichten eines Projektverzeichnisses:

Um alles organisiert zu halten, erstellen Sie ein neues Projektverzeichnis Selen-Wait/ folgendermaßen:

$ mkdir -pv selen -wait/treiber

Navigieren zum Selen-Wait/ Projektverzeichnis wie folgt:

$ cd selen-wait/

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 Selen mit PIP3 wie folgt:

$ pip3 Selen installieren

Laden Sie den gesamten erforderlichen Web -Treiber herunter und installieren Sie sie in der Treiber/ Projektverzeichnis. Ich habe den Prozess des Herunterladens und Installierens von Webtreibern in meinem Artikel erläutert Einführung in Selen mit Python 3. Wenn Sie Hilfe benötigen, suchen Sie nach 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 Chromedriver binär von der Treiber/ Verzeichnis.

Arbeiten mit implizitem Warten:

Um mit implizitem Warten zu experimentieren, erstellen Sie ein neues Python -Skript Ex01.py In Ihrem Projektverzeichnis und in den folgenden Codes -Zeilen in dieser Datei eingeben.

vom Selenium importieren Webdriver
Aus Selen.Webdriver.gemeinsam.Schlüssel importieren Schlüsseln
Optionen = Webdriver.ChromeOptions ()
Optionen.Kopflos = wahr
browser = webdriver.Chrome (ausführbarer_path = "./Treiber/Chromedriver ", Optionen = Optionen)
Browser.implizit_wait (10)
Browser.Get ("https: // www.Unixtimestamp.com/")
TIMESTAMP = Browser.find_element_by_xpath ("// h3 [@class = 'text-danger'] [1]")
drucken ('aktueller Zeitstempel: % s' % (Zeitstempel.Text.split (") [0]))
Browser.schließen()

Sobald Sie fertig sind, speichern Sie die Ex01.py Python -Skript.

Zeile 1 und 2 importieren alle erforderlichen Selenkomponenten.

Zeile 4 erstellt ein Chrome -Optionsobjekt.

Zeile 5 ermöglicht den Kopflosenmodus für den Chrome -Web -Treiber.

Zeile 7 erstellt ein Chrom -Browser -Objekt mit dem Chromedriver binär von der Treiber/ Verzeichnis.

Zeile 8 wird verwendet, um Selenium zu sagen, dass er implizit 10 Sekunden lang mit dem warten soll implizit_wait () Browser -Methode.

Zeile 10 lädt den www.Unixtimestamp.com im Browser.

Zeile 12 findet das Zeitstempelelement mit dem XPath -Selektor // H3 [@class = 'text-danger'] [1] und speichert es in der Zeitstempel Variable.

Ich habe den XPath -Selektor aus dem Chrome Developer -Tool erhalten. Wie Sie sehen können, befindet sich der Zeitstempel im ersten H3 Element mit dem Klassennamen Textdanger. Da sind 2 H3 Elemente mit der Klasse Textdanger.

Zeile 13 druckt nur den Zeitstempel aus dem Element, das ich mit dem XPath -Selektor ausgewählt und in der gespeichert habe Zeitstempel Variable.

Zeile 14 schließt den Browser.

Sobald Sie fertig sind, führen Sie das Python -Skript aus Ex01.py folgendermaßen:

$ python3 ex01.py

Wie Sie sehen können, wird der aktuelle Zeitstempel aus Unixtimestamp extrahiert.com und auf der Konsole gedruckt.

Arbeiten mit explizitem Warten:

Um mit explizitem Warten zu experimentieren, erstellen Sie ein neues Python -Skript Ex02.py In Ihrem Projektverzeichnis und in den folgenden Codes -Zeilen in dieser Datei eingeben.

vom Selenium importieren Webdriver
Aus Selen.Webdriver.gemeinsam.Schlüssel importieren Schlüsseln
Aus Selen.Webdriver.gemeinsam.durch Import durch
Aus Selen.Webdriver.Unterstützung.UI importieren Webdriverwait
Aus Selen.Webdriver.Unterstützen Sie import erwartungsgemäß_conditions
Optionen = Webdriver.ChromeOptions ()
Optionen.Kopflos = wahr
browser = webdriver.Chrome (ausführbarer_path = "./Treiber/Chromedriver ", Optionen = Optionen)
Browser.Get ("https: // www.Unixtimestamp.com/")
versuchen:
TIMESTAMP = WebDriverwait (Browser, 10).bis(
erwartet_Conditions.vorhanden_of_element_located ((von.XPath, "
// H3 [@class = 'text-danger'] [1] "))
)
drucken ('aktueller Zeitstempel: % s' % (Zeitstempel.Text.split (") [0]))
Endlich:
Browser.schließen()

Sobald Sie fertig sind, speichern Sie die Ex02.py Python -Skript.

Zeile 1-5 importiert alle erforderlichen Komponenten aus der Seleniumbibliothek.

Zeile 7 erstellt ein Chrome -Optionsobjekt.

Zeile 8 ermöglicht den Kopflosenmodus für den Chrome -Web -Treiber.

Zeile 10 erstellt ein Chrom -Browser -Objekt mit dem Chromedriver binär von der Treiber/ Verzeichnis.

Zeile 12 lädt den www.Unixtimestamp.com im Browser.

Das explizite Warten wird im Try-final-Block implementiert (aus Zeile 14-20)

Zeile 15-17 Verwendungen erzeugt erstellt Webdriverwait () Objekt. Das erste Argument von Webdriverwait () ist das Browserobjekt, und das zweite Argument ist die maximal zulässige Zeit (Worst-Case-Szenario) zur Erfüllung der Bedingung, die in diesem Fall 10 Sekunden beträgt.

Im bis() Block, erwartet_Conditions.präsca.of_element_located ()) Die Methode wird verwendet, um sicherzustellen, dass das Element vorhanden ist, bevor versucht wird, das Element auszuwählen. Hier, Von.XPath wird verwendet, um das zu sagen präsca.of_element_located ()) Methode, mit der 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 in der gespeichert Zeitstempel Variable.

Zeile 18 druckt nur den Zeitstempel aus dem ausgewählten Element.

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

Sobald Sie fertig sind, laufen Sie die Ex02.py Python -Skript wie folgt:

$ python3 ex02.py

Wie Sie sehen können, der aktuelle Zeitstempel von Unixtimestamp.com wird auf der Konsole gedruckt.

Auswählen von Elementen in expliziten Waiten:

Im früheren Abschnitt habe ich verwendet Von.XPath Zur Auswahl des Elements mit dem XPath -Selektor. Sie können die Elemente auch mit ID, Tag -Namen, CSS -Klassenname, CSS -Selektor usw. auswählen.

Die unterstützten Auswahlmethoden sind unten angegeben:

Von.XPath - Wählt Element/Elemente mit XPath Selector aus.

Von.KLASSENNAME - Wählt Element/Elemente mithilfe des CSS -Klassennamens aus.

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

Von.AUSWEIS - Wählt Element nach ID aus

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

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

Von.LINK TEXT - Wählt Element/Elemente nach Linktext von aus A (Anker) HTML -Tag.

Von.Partial_link_text - Wählt Element/Elemente nach teilweise Link -Text von aus A (Anker) HTML -Tag.

Weitere Informationen zu diesen finden Sie auf der Seite "Python Selen API -Dokumentation".

Erwartete Bedingungen in expliziten Waiten:

Im früheren expliziten Wartenbeispiel habe ich das verwendet präsca.of_element_located ()) Methode von erwartet_Conditions als explizite Wartezustand, um sicherzustellen, dass das Element, nach dem ich gesucht habe, vor der Auswahl existiert.

Da sind andere erwartet_Conditions Sie können als explizite Wartezustand verwenden. Einige von ihnen sind:

title_is (Titel) - Überprüft, ob der Titel der Seite ist Titel.

title_contains (partial_title) - Überprüft, ob der Titel der Seite einen Teil des Titels enthält partial_title.

Sichtbarkeit_of (Element) - Überprüft, ob die Element ist auf der Seite, die das Element ist, die Breite und Höhe größer als 0 sichtbar.

Sichtbarkeit_OF_Element_located (Locator) -

Präsenz_of_element_located (Locator) - Stellen Sie sicher, dass sich das Element befindet (von der Locator) ist auf der Seite vorhanden. Der Locator ist ein Tupel von (Durch, Selektor), Wie ich im expliziten Wartenbeispiel gezeigt habe.

Präsenz_of_all_element_located ()) - Stellen Sie sicher, dass das gesamte Element von dem übereinstimmt Locator ist auf der Seite vorhanden. Der Locator ist ein (Durch, Selektor) Tupel.

text_to_be_present_in_element (Locator, Text) - Überprüft, ob die Text ist in dem Element vorhanden, das sich von dem befindet Locator. Der Locator ist ein (Durch, Selektor) Tupel.

element_to_be_clickable (Locator) - Überprüft, ob das von der gefundene Element Locator ist sichtbar und klickbar. Der Locator ist ein (Durch, Selektor) Tupel.

element_to_be_selected (Locator) - Überprüft, ob das von der gefundene Element Locator ist ausgewählt. Der Locator ist ein (Durch, Selektor) Tupel.

alert_is_present () - Erwarten Sie, dass ein Alarmdialog auf der Seite vorhanden ist.

Es gibt viele mehr erwartet_Conditions Verfügbar für Sie zu verwenden. Weitere Informationen zu diesen finden Sie auf der Seite "Python Selen API -Dokumentation".

Abschluss:

In diesem Artikel habe ich Selens implizite und explizit. Ich habe Ihnen auch gezeigt, wie Sie mit einem impliziten und expliziten Warten arbeiten können. Sie sollten immer versuchen, explizites Warten in Ihren Seleniumprojekten zu verwenden, da Selen versucht, die Wartezeit so weit wie möglich zu verkürzen. Auf diese Weise müssen Sie nicht jedes Mal auf eine bestimmte Anzahl von Sekunden warten, wenn Sie Ihre Seleniumprojekte durchführen. Das explizite Warten sollte viele Sekunden sparen.

Weitere Informationen zu Selenium Waits finden Sie auf der offiziellen Selenium Python Library Waits -Dokumentationsseite.