selenium 三種等待方式詳解


1、目的背景

解決問題:下拉框定位不到、彈框定位不到…各種定位不到,其實大多數情況下就是兩種問題:1 有frame,2 沒有加等待。

原因:代碼運行速度快,而瀏覽器加載渲染速度慢

解決辦法:加等待,目前三種等待方式:強制等待、隱式等待、顯示等待

2、強制等待 sleep(xx)

不管你瀏覽器是否加載完了,程序都得等待XX秒,XX秒一到,繼續執行下面的代碼,作為調試很有用,有時候也可以在代碼里這樣等待,不過不建議總用這種等待方式,太死板,嚴重影響程序執行速度。

3、隱式等待 implicitly_wait(xx):在指定時間內,輪詢(間隔0.5)查看是否復合要求(全局的)

隱形等待是設置了一個最長等待時間,輪詢查找,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步。

注意:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。

弊端:那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步

4、顯性等待 WebDriverWait:在指定時間內,輪詢查看是否復合要求(指定的)

注意:需要指定一個具體的元素

程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException

隱性等待和顯性等待可以同時用,但要注意:等待的最長時間取兩者之中的大者

# -*- 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) # 隱性等待和顯性等待可以同時用,但要注意:等待的最長時間取兩者之中的大者
driver.get('https://huilansame.github.io')
locator = (By.LINK_TEXT, 'CSDN')
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))  # 每隔 0.5s 執行一次,直到 20s
print driver.find_element_by_link_text('CSDN').get_attribute('href')
finally:
driver.close()

  WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)

selenium.webdriver.support.wait.WebDriverWait(類)
__init__
driver: 傳入WebDriver實例,即我們上例中的driver
timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
poll_frequency: 調用until或until_not中的方法的間隔時間,默認是0.5秒
ignored_exceptions: 忽略的異常,如果在調用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待,如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException。
until
method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not 與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同,不再贅述。
method
message

  參考資料:https://www.jb51.net/article/92672.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM