Selenium裡的三種等待方式

jongjongjong發表於2024-11-04

在自動化測試指令碼的執行過程中,webdriver操作瀏覽器的時候,由於網路延遲、瀏覽器卡頓或者非同步載入等原因,會出現元素載入超時的情況,如果超出時間仍然定位不到元素,就會丟擲異常,中止指令碼執行。因此,Selenium提供了三種等待的方式來避免這種偶然失敗。下面介紹這三種等待方式。

一、time.sleep(固定等待)

可以透過該方法自定義等待時間,依照該設定的時間進行等待

1、匯入該模組
from time import sleep
2、程式碼示例

下方示例在在百度頁面輸入關鍵詞並點選搜尋,每次載入時間,在輸入之後和搜尋之後分別等待2s檢視效果。

self.driver.get("https://www.baidu.com")#載入百度頁面
input=self.driver.find_element(By.ID,"kw")#定位輸入框元素
input.send_keys("selenium")#輸入搜尋關鍵詞
sleep(2)#自定義等待時間為2s
button=self.driver.find_element(By.ID,"su")#定位到按鈕
button.click()#點選查詢
sleep(2)#強制等待2s
self.driver.quit()

二、implicitly_wait(隱式等待)

隱式等待實際是設定了一個最長等待時間a,如果在規定時間b內頁面載入完成,則執行下一步,否則一直等待該最長時間a結束,然後執行下一步。
注:隱式等待是全域性等待,對整個driver週期都起作用,在最開始設定一次就可以。
程式碼示例

self.driver.implicitly_wait(10)#設定最長等待時長為10s
self.driver.get("https://www.baidu.com")#載入百度頁面
self.driver.find_element(By.ID, "kw").send_keys("python")#輸入關鍵詞
self.driver.find_element(By.ID,"su").click()#點選查詢

三、WebDriverWait(顯式等待)

顯式等待是一種動態的等待方式,每隔一段時間檢查一下頁面是否達到等待條件,條件成立則執行下一步,若到達設定的最長等待時間條件仍未滿足,則丟擲異常。
Selenium提供了WebDriverWait類,用於針對指定的元素設定等待。

1、匯入WebDriverWait類的路徑
from selenium.webdriver.support.wait import WebDriverWait
2、WebDriverWait類引數
引數 引數說明
1 driver 傳入WebDriver例項
2 timeout 超時時間,等待的最長時間
3 poll_frequency 呼叫until或until_not中的方法的時間間隔,預設是0.5s
4 ignored_expections 忽略的異常,可以設定該異常是否要忽略

常用的是前兩個引數,後兩個引數一般是預設的設定。
例項化WebDriver物件示例:

wait=EC(self.driver,2)#例項化WebDriverWait類物件,在2s內每隔0.5s檢查一次
3、WebDriver模組的兩個方法

(1)until(self,method,message:str=""):返回true則判斷成功
(2)until_not(self,method,message:str=""):返回false則判斷成功
這兩個方法用於設定等待條件來判斷是否執行下一步。

引數 引數說明
1 method 等待條件,在一定等待時間內,每隔一段時間呼叫這個傳入的方法,直到該方法返回值不是False(until)/True(until_not)
2 message 如果超時,丟擲TimeoutExpection,將message傳入異常

until中的等待條件通常與expected_conditions連用,該模組內部封裝了多個判斷方法,比如tite_is():精準匹配頁面標題,匹配成功返回true,失敗返回false

4、程式碼示例
self.driver.get("https://www.baidu.com")  # 載入百度頁面
wait=WebDriverWait(self.driver,2)#例項化WebDriverWait類物件,每隔0.5s檢查一次
wait.until(EC.title_is('百度一下,你就知道'))#每隔一段時間呼叫title_is(),直到該標題為’百度一下,你就知道‘
self.driver.find_element(By.ID, "kw").send_keys("python")
self.driver.find_element(By.ID, "su").click()

四、總程式碼

點選檢視程式碼
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

class TestCase():
    def __init__(self):
        self.driver=webdriver.Edge()#驅動瀏覽器
    
    #測試固定等待sleep()
    def test_sleep(self):
        self.driver.get("https://www.baidu.com")  # 載入百度頁面
        input=self.driver.find_element(By.ID,"kw")#定位輸入框元素
        input.send_keys("selenium")#輸入搜尋關鍵詞
        sleep(2)#自定義等待時間為2s
        button=self.driver.find_element(By.ID,"su")#定位到按鈕
        button.click()#點選查詢
        sleep(2)#強制等待2s
        self.driver.quit()
    
    #測試顯式等待
    def test_implicity(self):
        self.driver.implicitly_wait(10)#設定最長等待時長為10s
        self.driver.get("https://www.baidu.com")#載入百度頁面
        self.driver.find_element(By.ID, "kw").send_keys("python")
        self.driver.find_element(By.ID,"su").click()

    #測試隱式等待
    def test_wait(self):
        self.driver.get("https://www.baidu.com")  # 載入百度頁面
        wait=WebDriverWait(self.driver,2)#例項化WebDriverWait類物件,每隔0.5s檢查一次
        wait.until(EC.title_is('百度一下,你就知道'))#每隔一段時間呼叫title_is(),直到該標題為’百度一下,你就知道‘
        self.driver.find_element(By.ID, "kw").send_keys("python")
        self.driver.find_element(By.ID, "su").click()

if __name__=="__main__":
    case=TestCase()#例項化TestCase物件
    #case.test_sleep()#呼叫方法
    #case.test_implicity()
    case.test_wait()

相關文章