English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Detaillierte Erklärung der drei Wartungsarten von Python selenium (Notwendig zu beherrschen)

Viele Menschen fragen in der Gruppe, warum dieser Dropdown-Picker nicht gefunden werden kann, dieser Pop-up-Dialog nicht gefunden werden kann... es gibt viele Fälle, die nicht gefunden werden können, aber in den meisten Fällen sind es zwei Probleme:1 Es gibt frame,2 Es gibt keine Wartezeit. Ohne zu wissen, was die Geschwindigkeit der Laufzeit deines Codes ist und was die Geschwindigkeit des Ladens und Renderns des Browsers ist, ist das wie Flash und Gokū, die sich verabredet haben, einen Monsterkampf zu beginnen, und dann kehrt Flash zurück und fragt Gokū, warum er noch im Schuh schnürt und noch nicht hinausgegangen ist? Gokū hat im Herzen Tausende von Ziegen fliegen lassen, beleidigt, dass er langsam ist, und hat gesagt, dass er nicht mehr mitspielen will und wirft eine Ausnahme.

Dann wie kann man die langsame Ladegeschwindigkeit von Gokū berücksichtigen? Es gibt nur eine Möglichkeit, und das ist warten. Wenn wir über warten sprechen, gibt es drei Arten von Warten, und ich werde sie nacheinander erklären:

1. Erzwungene Wartezeit

Die erste und einfachste Methode ist die erzwungene Wartezeit sleep(xx), die Flash xx Sekunden warten lässt, egal ob Gokū mithalten kann oder bereits vorab angekommen ist, er muss xx Sekunden warten.

Schau dir den Code an:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io
sleep(3) # Erzwungene Wartezeit3Sekunden warten und dann den nächsten Schritt ausführen
print driver.current_url
driver.quit()

Das wird als erzwungene Wartezeit bezeichnet, egal ob der Browser vollständig geladen ist oder nicht, muss das Programm warten3Sekunden,3Sekunden nach dem Ablauf, fahre mit dem nächsten Code fort, was für die Debugging sehr nützlich ist. Manchmal kann man in diesem Stil in den Code warten, aber es wird nicht empfohlen, diese Warteart ständig zu verwenden, da sie sehr starre ist und die Geschwindigkeit der Programmausführung stark beeinträchtigen kann.

2. Verborgene Wartezeit

Eine andere Methode heißt verborgene Wartezeit, implicitly_wait(xx), der Sinn der verborgenen Wartezeit ist: Flash und Gokū haben sich verabredet, dass Flash, egal wo er hingeht, auf Gokū xx Sekunden warten muss. Wenn Gokū in dieser Zeit ankommt, starten beide sofort, um den Monsterkampf zu beginnen. Wenn Gokū in der festgelegten Zeit nicht ankommt, geht Flash alleine los. Das bedeutet natürlich, dass Flash auf Gokū wartet, bis er eine Ausnahme wirft.

Schau dir den Code an:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # Verborgene Wartezeit, maximale Wartezeit30 Sekunden
driver.get('https://huilansame.github.io
print driver.current_url
driver.quit()

Verborgene Wartezeit bedeutet, dass eine maximale Wartezeit eingestellt wird. Wenn die Seite innerhalb der festgelegten Zeit geladen wird, wird der nächste Schritt ausgeführt, andernfalls wird bis zum Ablauf der Zeit gewartet und dann wird der nächste Schritt ausgeführt. Achtung, es gibt hier einen Nachteil, nämlich dass das Programm auf das vollständige Laden der gesamten Seite wartet, das bedeutet, dass normalerweise, wenn du siehst, dass der kleine Kreis in der Lesezeichenleiste des Browsers nicht mehr dreht, der nächste Schritt ausgeführt wird, aber manchmal sind die gewünschten Elemente bereits geladen, aber weil einige JS-Dateien besonders langsam sind, muss ich warten, bis die Seite vollständig geladen ist, um den nächsten Schritt auszuführen. Was mache ich, wenn ich auf das Element, das ich benötige, warte? Gibt es eine Möglichkeit, das ist, wo Selenium eine andere Warteart bietet - sichtbare Wartezeit wait.

Es ist besonders zu beachten, dass das implizite Wait während des gesamten Lebenszyklus des Drivers wirkt, daher ist nur eine Einstellung erforderlich. Ich habe gesehen, dass einige Leute das implizite Wait wie sleep verwenden, überall hin gehen und einmal verwenden…

3. explizites Wait

Die dritte Methode ist das explizite Wait, WebDriverWait, zusammen mit den Methoden until() und until_not() der Klasse, um flexibel zu warten, basierend auf der Bedingung. Der Hauptgedanke ist: Das Programm schaut alle xx Sekunden nach, ob die Bedingung erfüllt ist, dann führt das nächste Schritt aus, andernfalls wartet es weiter, bis die festgelegte maximale Zeit überschritten ist, und wirft dann eine TimeoutException.

Sehen wir uns ein Beispielcode an:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # Der implizite und explizite Wait können gleichzeitig verwendet werden, aber Achtung: Die maximale Wartezeit ist der größere Wert der beiden
driver.get('https://huilansame.github.io
locator = (By.LINK_TEXT, 'CSDN')
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
print(driver.find_element_by_link_text('CSDN').get_attribute('href'))
finally:
driver.close()

Im obigen Beispiel haben wir implizite und explizite Wartezeiten eingerichtet. In anderen Operationen spielt die implizite Wartezeit eine entscheidende Rolle, während die explizite Wartezeit in WebDriverWait.. eine Hauptrolle spielt. Allerdings ist zu beachten, dass die maximale Wartezeit von dem größeren der beiden abhängt, im Beispiel also von der impliziten Wartezeit.20, wenn die implizite Wartezeit länger als die explizite Wartezeit ist, dann ist die maximale Wartezeit des folgenden Codezitates gleich der impliziten Wartezeit.

Wir verwenden hauptsächlich die Klasse WebDriverWait und das Modul expected_conditions. Der Blogger wird Ihnen beide Module im Detail erklären:

WebDriverWait

Die Klasse WebDriverWait des Moduls wait ist eine explizite Wartezeitklasse. Schauen wir uns an, welche Parameter und Methoden sie hat:

selenium.webdriver.support.wait.WebDriverWait (Klasse)
__init__
driver: Übergebene WebDriver-Instanz, d.h. der driver in unserem obigen Beispiel
timeout: Timeoutdauer, maximale Wartezeit (dabei muss auch die implizite Wartezeit berücksichtigt werden)
poll_frequency: Zeitintervall für den Aufruf der Methode in until oder until_not, Standard ist 0.5Sekunden
ignored_exceptions: Ausnahmen, die ignoriert werden. Wenn während des Aufrufs von until oder until_not eine dieser Ausnahmen ausgelöst wird, wird der Code nicht unterbrochen und weiter gewartet, während Ausnahmen außerhalb dieses Tuples den Code unterbrechen und eine Ausnahme auslösen. Standardmäßig nur NoSuchElementException.
until
method: Während der Wartezeit wird dieser übergebene Methode zu bestimmten Zeitintervallen aufgerufen, bis der Rückgabewert nicht mehr False ist
message: Wenn ein Timeout auftritt, wird TimeoutException ausgelöst. Die Meldung message wird in die Ausnahme eingefügt
until_not ist umgekehrt zu until. until führt fort, wenn ein Element erscheint oder eine Bedingung erfüllt ist, während until_not weiterführt, wenn ein Element verschwindet oder eine Bedingung nicht erfüllt ist. Die Parameter sind gleich und werden daher nicht weiter erläutert.
method
message

Nachdem man das obige gelesen hat, sollte alles klar sein. Der Aufruf erfolgt wie folgt:

WebDriverWait(driver, Timeoutdauer, Abfragefrequenz, Ausnahmen ignorieren).until(auszuführende Methode, Rückmeldung im Falle eines Timeouts)

Hier ist besonders zu beachten, dass viele Benutzer den Parameter method der Methoden until oder until_not als WebElement-Objekt übergeben, wie folgt:

WebDriverWait(driver, 10.until(driver.find_element_by_id('kw')) # Fehler

Das ist eine falsche Verwendung, die Parameter müssen aufrufbar sein, d.h. das Objekt muss eine __call__() -Methode haben, andernfalls wird eine Ausnahme ausgelöst:

TypeError: 'xxx' Object ist nicht aufrufbar

Hier können Sie verschiedene Bedingungen aus dem Modul expected_conditions von selenium verwenden, sowie die Methoden is_displayed() , is_enabled() , is_selected() des WebElement oder selbstgefasste Methoden, dann schauen wir uns die von selenium bereitgestellten Bedingungen an:

expected_conditions

expected_conditions ist ein Modul von selenium, das eine Reihe von Bedingungen enthält, die zur Überprüfung verwendet werden können:

selenium.webdriver.support.expected_conditions(Modul)
Diese beiden Bedingungen überprüfen den Titel, ob der übergebene Parameter title gleich oder enthalten ist in driver.title
title_is
title_contains
Diese beiden Bedingungen überprüfen, ob ein Element vorhanden ist, die übergebenen Parameter sind Tupeltyp-Locator, wie (By.ID, 'kw')
Der Name sagt es schon, eine Bedingung ist erfüllt, wenn ein Element mit den Bedingungen geladen wird; die andere Bedingung erfordert, dass alle Elemente mit den Bedingungen geladen werden
presence_of_element_located
presence_of_all_elements_located
Diese drei Bedingungen überprüfen, ob ein Element sichtbar ist, die ersten beiden Parameter sind Tupeltyp-Locator, der dritte parameterisiert WebElement
Erster und dritter sind im Wesentlichen gleich
visibility_of_element_located
invisibility_of_element_located
visibility_of
Diese beiden Bedingungen überprüfen, ob ein Text in einem bestimmten Element vorhanden ist, eine überprüft den Text des Elements, die andere den Wert des Elements
text_to_be_present_in_element
text_to_be_present_in_element_value
Diese Bedingung überprüft, ob der Frame eingefügt werden kann, es kann ein Locator-Tupel übergeben werden oder direkt der Art der Lokalisierung: id, name, index oder WebElement
frame_to_be_available_and_switch_to_it
Diese Bedingung überprüft, ob ein Alert auftritt
alert_is_present
Diese Bedingung überprüft, ob ein Element klickbar ist. Ein locator wird übermittelt.
element_to_be_clickable
Diese vier Bedingungen überprüfen, ob ein Element ausgewählt ist. Die erste Bedingung übermittelt ein WebElement-Objekt, die zweite einen locator-Tupel.
Der dritte Parameter übermittelt ein WebElement-Objekt sowie den Zustand. Wenn sie übereinstimmen, wird True zurückgegeben, sonst False.
Der vierte Parameter übermittelt einen locator sowie den Zustand. Wenn sie übereinstimmen, wird True zurückgegeben, sonst False.
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
Die letzte Bedingung überprüft, ob ein Element immer noch im DOM vorhanden ist. Durch Übermittlung eines WebElement-Objekts kann geprüft werden, ob die Seite neu geladen wurde.
staleness_of

Hier ist alles17Eine Bedingung, in Kombination mit until und until_not, kann viele Entscheidungen treffen. Wenn man sie flexibel einpacken kann, wird die Stabilität des Skripts erheblich verbessert.

Die oben genannten sind die von mir vorgestellten drei Wait-Methoden von Python selenium. Ich hoffe, sie sind Ihnen nützlich. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar, und ich werde umgehend antworten. Vielen Dank auch für die Unterstützung unserer Website呐喊教程!

Erklärung: Der vorstehende Artikel wurde von unserem Redakteur vorgestellt, der eine detaillierte Erklärung der drei Wait-Methoden von Python selenium gegeben hat (wichtig zu wissen). Wir hoffen, dass er Ihnen hilft. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar, und der Redakteur wird umgehend antworten. Vielen Dank auch für die Unterstützung unserer Website呐喊教程!3Anzeige: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig bereitgestellt und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte finden, die möglicherweise gegen das Urheberrecht verstoßen, freuen wir uns über eine E-Mail an: notice#w und die Bereitstellung von relevanten Beweisen. Bei nachgewiesener Infringement wird der fragliche Inhalt sofort gelöscht.

Gefällt mir