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

Wie man die Wartezeit in Python selenium einstellt

Wir haben bisher gezeigte Selenium WebDriver-Testmethoden basieren auf der Webseite. Die vorherigen Beispiele haben einfache Webseiten verwendet, um zu operieren, möglicherweise wurde der Ladevorgang der Webseite nicht wahrgenommen, aber im tatsächlichen Anwendungsbereich dauert der Ladevorgang der Webseite eine bestimmte Zeit. Dein Skript läuft bereits, aber die Elemente, die du定位 (定位意为定位或查找),sind noch nicht geladen, in diesem Fall wird ein Fehler gemeldet, dass das Element nicht gefunden wurde. Es ist offensichtlich, dass ein Skript, das keine Ladezeit berücksichtigt, kein erfolgreicher Skript ist. Heute werden wir darüber sprechen, wie man Wartezeiten einstellt.

等待的三种方法

time.sleep(n)

强制等待n秒。Python本身的函数,包含在time包中,使用前需要导入time包。我们之前的实例中经常会使用这种等待,方便大家能看清脚本执行的结果。这种等待方法十分笨拙,无论页面加载得如何,都必须等待n秒,可以说是十分不智能了。

implicitly_wait(n)

最长等待n秒,若n秒内页面加载完成,则提前结束等待。WebDriver提供的等待方法,也被称为隐式等待,比强制等待聪明了一点,但如果页面本身包含一个超大视频之类的文件,就算我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有些弊端。

WebDriverWait(n)

最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在,若存在则提前结束等待。也是WebDriver提供的等待方法,也被称为显式等待,这种等待比隐式等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。

实例

强制等待在之前的例子中都有使用过,我们就来看一看WebDriver提供的两种等待方法

隐式等待

其实隐式等待在之前的介绍中也有使用过,但没有特别提到使用的方法。我们这次来打开网易的首页,这是一个加载内容很多的门户网站,根据网速不同,目测大概要10秒左右才能加载完毕,我们把等待时间设置为60秒,然后计算一下从打开页面到点击页面导航栏中的【公开课】按钮需要多久。

# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(60) #隐式等待时间60秒
time_start = time.time() #记录打开页面时的时间
driver.get('https://www.163.com/)
driver.find_element_by_id('js_love_url').click()
time_end = time.time() #记录点击按钮后的时间
print('access time is: ', time_end - time_start) #打印时间差,即实际消耗时间
time.sleep(2) #强制等待2秒,为了观察我们确实打开了【公开课】页面
driver.quit()

脚本执行结束后可以看到,尽管我们设置了隐式时间为60秒,但5大约1秒左右(参见下面的执行结果)页面已完全加载,可以点击【公开课】按钮。下面是我的一次执行结果,显示了整个加载时间。

>>> access time is : 5.717327117919922

Explizite Wartezeit

Beim Verwenden der expliziten Wartezeit muss die Klasse selenium.webdriver.support.wait.WebDriverWait importiert werden, die API ist wie folgt:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver: Es ist nicht notwendig zu sagen, der von Ihnen definierte WebDriver-Browser (Chrome, Firefox usw.)
  • timeout: Die maximale Wartezeit, in Sekunden
  • poll_frequency: Die Zeitintervalle zwischen der Suche nach Elementen, Standard ist 0.5Sekunden (nicht festgelegt ist 0.5Sekunden), das bedeutet standardmäßig 0.5Sekunden, um zu überprüfen, ob das zu suchende Element existiert. Wenn es gefunden wird, wird das gesamte explizite Warten beendet, andernfalls wird weiter gewartet, bis 0.5Sekunden noch einmal suchen
  • ignored_exceptions=None: Die vom Timeout gesendete Fehlermeldung, Standard ist NoSuchElementException

Da die explizite Wartezeit möglicherweise bestätigen muss, ob ein Element existiert, muss sie in der Regel mit den folgenden beiden Methoden kombiniert werden

until(method, message='')
until_not(method, message='')
  • method: Der Bedeutungsinhalt von until()s method ist es, das vom Treiber bereitgestellte Verfahren als Parameter aufzurufen, bis es nicht False zurückgibt, und bis until_not()s method False zurückgibt
  • message: Die异常信息, die beim Timeout übergeben wird

Bitte beachten Sie, dass method() ein aufrufbares Verfahren sein muss und eine __call__() -Methode haben muss. In dem obigen Beispiel schreiben wir es neu.

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
driver = webdriver.Chrome()
class button():
 def __call__(self, driver):
  if driver.find_element_by_id('js_love_url'):
   return True
  else:
   return False
driver.implicitly_wait(60)
time_start = time.time()
driver.get('https://www.163.com/)
# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver,2,0.5).until(button()) 
time_end = time.time()
print('access time is: ', time_end - time_start)
time.sleep(2)
driver.quit()

Nachdem Sie diesen Beispiel betrachtet haben, könnten Sie fragen, dass ich die explizite Wartezeit tatsächlich gesetzt habe2Sekunden, warum gibt es keine Fehlermeldung? Weil wir gleichzeitig die latente Wartezeit eingestellt haben, und die längste der beiden wird als tatsächliche Wartezeit genommen. Daher beträgt die Wartezeit in diesem Beispiel immer noch60 Sekunden.

Zusammenfassung

1、Selenium kann drei Arten von Warten verwenden, wobei WebDriverWait() der intelligenteste ist
2、Wenn latente und explizite Wartezeiten gleichzeitig vorliegen, ist die längste Wartezeit der beiden die gültige Wartezeit
3、Im expliziten Warten ist method() von until(method()) eine aufrufbare Methode, die selbst definiert oder durch Anonymfunktionen und andere Methoden verwendet werden kann. Dies werden wir später im Detail besprechen
4、Die latente Wartezeit wird nur einmal eingestellt, d.h. sie erstreckt sich über den gesamten Skript, und die obligatorische Wartezeit muss an jedem erforderlichen Ort eingerichtet werden

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und wir freuen uns über Ihre Unterstützung und Unterstützung der Anleitungshubseite.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig bereitgestellt und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für relevante rechtliche Verantwortlichkeiten. Wenn Sie verdächtige urheberrechtliche Inhalte finden, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail, um eine Meldung zu machen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Urheberrechtsverletzung wird diese Website die betreffenden Inhalte sofort löschen.)

Empfohlene Artikel