webdriver 提供了兩種等待方式,一種是顯式等待,另一種是隱式等待。implicitly_wait 函數就是隱式等待代表,主要用於處理元素不存在的情況以及元素載入時間不夠的情況。本文將從多個方面對implicitly_wait做詳細的闡述。
一、等待時間設置
implicitly_wait函數默認等待時間是0秒,也就是說webdriver在啟動的時候默認是不會等待的。我們可以手動設置一個等待時間。下面是一個等待10秒的例子:
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10)
可以看到,我們需要在創建driver後,再通過implicitly_wait()方法設置等待時間。同時,需要注意傳入的參數是秒。在等待的過程中,webdriver會輪詢去查看元素是否存在,如果元素在等待時間內存在,webdriver會馬上執行下一步操作;如果元素不存在,webdriver會將等待時間完全耗盡,然後再往下執行下一步操作。
二、等待條件設置
除了等待時間,我們也可以通過設置等待條件來實現更為精細化的特定等待效果。implicitly_wait()方法中支持的條件類型可以參考 官方文檔。以visibility_of_element_located為例:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) wait.until(EC.visibility_of_element_located((By.XPATH, '//input[@name="username"]')))
上述代碼等待10秒,直到元素「username」可見,才繼續往下執行操作。如果等待時間過期,webdriver 會拋出 timeout error。
三、等待前後順序
implicitly_wait() 屬於隱式等待,它會在每一個操作執行前,先進行等待檢測。這意味著如果我們放在代碼的最前面,那麼等待時間會被應用到全部的find element 操作中。當然我們也可以在代碼的後面逐個添加 wait 檢測,除了重複且不能僅檢測想要等待的元素外,這種方式會使我們的代碼變得冗長。
一種常見的方法是將element 操作的代碼放在 helper function 中,並且將其和等待時間包裹在同一個 block 中。下面以login 動作為例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait_time = 10
def login(driver):
wait.until(EC.visibility_of_element_located((By.XPATH, '//input[@name="username"]')))
username = driver.find_element(By.XPATH, '//input[@name="username"]')
password = driver.find_element(By.XPATH, '//input[@name="password"]')
submit = driver.find_element(By.XPATH, '//input[@name="submit"]')
username.send_keys("user")
password.send_keys("password")
submit.click()
driver = webdriver.Chrome()
wait = WebDriverWait(driver, wait_time)
driver.get('https://www.baidu.com')
login(driver)
通過這種方式,我們可以將等待包裹在driver 實例中,因為每次在調用login 動作時,webdriver 都會去等待所有的element。
四、等待的陷阱
最後需要提到的是,implicitly_wait存在一些陷阱。例如:如果等待時間過短,webdriver可能還沒有來得及檢測元素,就已經執行下一個操作,這會導致找不到元素的錯誤。反之則會導致測試用例執行很慢。
遇到這種情況,我們可以使用更為精細化的等待條件來規避問題。例如,對於一個使用 Ajax 載入信息的 page,使用 visibility_of_element_located 就比 implicitly_wait 更為好用,因為它可以更為精細地對待可見性的問題,並且不需要猜測一個合適的等待時間。
參考資料
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/284983.html
微信掃一掃
支付寶掃一掃