English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
I found that too many people do not know how to use waiting, and the blogger can't help but want to talk about the necessity of waiting today.
Many people in the group ask, this dropdown box cannot be located, that pop-up box cannot be located... various failures to locate, in fact, most of the time it is just two problems:1 with frame,2 No waiting was added. Little did you know, what level your code's running speed is, and what level the browser's loading and rendering speed is. It's like Flash and Shrunken Man make an appointment to fight the monster, and then Flash comes back after finishing and asks Shrunken Man why you are still wearing shoes and haven't left the house yet? Shrunken Man has a thousand thoughts running through his mind in a heartbeat, thinking he is too slow and doesn't want to play with you, throws an exception and gives up the challenge.
So how can we take care of Shrunken Man's slow loading speed? There is only one way, that is, to wait. When it comes to waiting, there are three ways to wait, and let me explain them one by one:
1. Forced wait
The first and simplest method is forced wait sleep(xx), forcing Flash to wait for xx time, regardless of whether Shrunken Man can keep up with the speed or has already arrived early, he must wait for xx time.
See the code:
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get('https://huilansame.github.io sleep(3) # Forced wait3seconds before executing the next step print driver.current_url driver.quit()
This is called forced wait, regardless of whether the browser has finished loading, the program must wait3seconds,3After one second, continue executing the following code, which is very useful for debugging. Sometimes you can also wait like this in the code, but it is not recommended to use this waiting method all the time. It is too rigid and seriously affects the execution speed of the program.
2. Implicit wait
The second method is called implicit wait, implicitly_wait(xx). The meaning of implicit wait is: Flash and Shrunken Man make an agreement that no matter where Flash goes, he has to wait for Shrunken Man xx seconds. If Shrunken Man arrives within this time, both of them will immediately set off to fight the monster. If Shrunken Man does not arrive within the specified time, Flash will go alone. Naturally, he will wait for Shrunken Man to throw an exception to you.
See the code:
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(30) # Implicit wait, maximum wait time30 seconds driver.get('https://huilansame.github.io print driver.current_url driver.quit()
Der implizite Wartezustand ist eine festgelegte maximale Wartezeit. Wenn die Seite im festgelegten Zeitraum geladen wird, führt das nächste Schritt aus, andernfalls wartet es bis zum Ablauf der Zeit und führt dann das nächste Schritt aus. Beachte, dass es hier einen Nachteil gibt, dass das Programm immer auf die vollständige Ladevorgang der Seite wartet, was in der Regel bedeutet, dass du den kleinen Kreis im Browser-Tab siehst, der nicht mehr dreht, bevor der nächste Schritt ausgeführt wird. Aber manchmal sind die Elemente, die du willst, bereits geladen, aber weil einige js-ähnliche Dinge besonders langsam sind, muss ich warten, bis die Seite vollständig geladen ist, bevor ich den nächsten Schritt ausführen kann. Was mache ich, wenn ich auf den nächsten Schritt warten will, sobald das Element, das ich will, bereit ist? Es gibt eine Möglichkeit, und das hängt davon ab, wie Selenium eine andere Warteart anbietet - den expliziten Wartezustand wait.
Es muss besonders erwähnt werden: Der implizite Wartezustand wirkt sich während des gesamten Lebenszyklus des Drivers aus, daher muss er nur einmal eingerichtet werden. Ich habe gesehen, dass einige Menschen den impliziten Wartezustand wie sleep verwenden, überall hinein...
3. explizite Wartung
Die dritte Methode ist der explizite Wartezustand, WebDriverWait, zusammen mit den Methoden until() und until_not() der Klasse, um flexibel zu warten, basierend auf dem Bedingungen. 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 Wartezustand und der explizite Wartezustand können gleichzeitig verwendet werden, aber achte darauf: Der längste Wartezeitpunkt ist der größere 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, in WebDriverWait.. spielt die explizite Wartezeit die Hauptrolle, aber beachten Sie, dass die maximale Wartezeit von dem größeren der beiden abhängt, im Beispiel ist dies20, wenn die implizite Wartezeit > die explizite Wartezeit ist, dann ist die maximale Wartezeit der folgenden Codezeile gleich der impliziten Wartezeit.
Wir verwenden hauptsächlich die WebDriverWait-Klasse und das expected_conditions-Modul, der Blogger wird Ihnen beide Module im Detail zeigen:
WebDriverWait
Die WebDriverWait-Klasse im wait-Modul ist eine explizite Wartezeitklasse, schauen wir uns an, welche Parameter und Methoden sie hat:
selenium.webdriver.support.wait.WebDriverWait(Klasse) __init__ driver: WebDriver-Instanz übergeben, d.h. der driver in unserem obigen Beispiel timeout: Timeout-Zeit, maximale Wartezeit (berücksichtigen Sie gleichzeitig die implizite Wartezeit) poll_frequency: Intervallzeit 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 diese Ausnahmen im Tupel ausgelöst werden dann wird der Code nicht unterbrochen, weiter gewartet, und wenn eine Ausnahme außerhalb dieses Tups auftritt, wird der Code unterbrochen und die Ausnahme ausgelöst. Standardmäßig nur NoSuchElementException. until method: Während der Wartezeit wird diese übergebene Methode in regelmäßigen Abständen aufgerufen, bis der Rückgabewert nicht False ist message: Wenn der Timeout auftritt, wird TimeoutException ausgelöst, die message wird in die Ausnahme übergeben until_not ist das Gegenteil von until, until führt fort, wenn ein Element erscheint oder eine Bedingung erfüllt ist, until_not führt fort, wenn ein Element verschwindet oder eine Bedingung nicht erfüllt ist, die Parameter sind gleich, nicht weiter erläutert. method message
Nachdem Sie den obigen Inhalt gelesen haben, sollten Sie sich im Grunde ziemlich klar sein, der Aufruf erfolgt wie folgt:
WebDriverWait(driver, Timeout-Dauer, Abfrage-Frequenz, Ausnahmen ignorieren).until(ausführbare Methode, Timeout-Information, die zurückgegeben wird)
Hier ist besonders zu beachten, dass das Methodenargument method in until oder until_not oft ein WebElement-Objekt ist, wie folgt:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # Fehler
Dies ist eine falsche Verwendung, die Parameter müssen aufrufbar sein, d.h. der Objekt muss eine __call__() -Methode haben,否则 wird eine Ausnahme ausgelöst:
TypeError: 'xxx' object is not callable
Hier können Sie verschiedene Bedingungen aus dem Modul expected_conditions von selenium verwenden, sowie die Methoden is_displayed()、is_enabled() und is_selected() von WebElement oder selbst verpackte 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 im driver.title ist title_is title_contains Diese beiden Bedingungen überprüfen, ob ein Element vorhanden ist, die übergebenen Parameter sind Tupel des Typs locator, wie (By.ID, 'kw') Der Name sagt alles, eine Bedingung durchläuft, wenn ein Element unter den Bedingungen geladen wird; die andere muss alle Elemente unter 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 Tupel des Typs locator, der dritte übergibt WebElement Die erste und die dritte sind in der Tat gleich visibility_of_element_located invisibility_of_element_located visibility_of Diese beiden Bedingungen prüfen, ob ein bestimmter Text in einem bestimmten Element vorhanden ist, eine prü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 Bedingungstests ob frame in das Element eingebettet werden kann, es kann ein locator-Tupel übergeben werden oder direkt ein Locator-Modus: id, name, index oder WebElement übergeben werden frame_to_be_available_and_switch_to_it 这个条件判断是否有 alert 出现 alert_is_present 这个条件判断元素是否可点击,传入 locator element_to_be_clickable 这四个条件判断元素是否被选中,第一个条件传入 WebElement 对象,第二个传入 locator 元组 第三个条件传入 WebElement 对象以及状态,相等返回 True,否则返回 False 第四个条件传入 locator 以及状态,相等返回 True,否则返回 False element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be 最后一个条件判断一个元素是否仍在 DOM 中,传入 WebElement 对象,可以判断页面是否刷新了 staleness_of
上面是所有17一个 condition,与 until、until_not 组合可以实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。
今天分享这些内容,有什么问题可以留言给我交流,希望能帮助到有需要的同学。谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@)进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。