在自動化測試指令碼的執行過程中,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()