天天看點

Python Selenium顯式等待和隐式等待詳細說明

分享知識  傳遞快樂

現在的大多數的Web應用程式是使用Ajax或一些前端架構技術來完成加載頁面,這樣程式便不能确定某個元素何時才能完全加載出來。因不能确定元素被加載到浏覽器的時間,這使得定位元素變得困難。

如果程式定位某個元素時,實際頁面中這個元素還未完全加載進來或元素不再頁面之中,會抛出 ElementNotVisibleException 異常。為了解決這個問題,我們可以使用 selenium 提供的 waits 更好的解決這個問題。waits提供了一些操作之間的時間間隔,主要是定位元素或針對該元素的任何其他操作。

Selenium Webdriver 提供兩種類型的 waits - 隐式等待和顯式等待。顯式等待會讓 WebDriver 等待滿足一定的條件以後再進一步的執行。 而隐式等待讓 Webdriver 等待一定的時間後再才是查找某元素。

顯式等待:

顯式等待是你在代碼中定義等待一定條件發生後再進一步執行你的代碼。簡單的說就是在指定時間内,一直等待某個條件成立,條件成立後立即執行定位元素的操作;如果超過這個時間條件仍然沒有成立,則會抛出異常!顯式等待需要使用 selenium.webdriver.support.excepted_conditions 期望條件和 selenium.webdriver.support.ui.WebDriverWait 類來配合完成。

隐式等待:

隐式等待實際是設定了一個最長等待時間,如果在規定時間内網頁加載完成,則執行下一步,否則一直等到時間結束,然後執行下一步。如果某些元素不是立即可用的,隐式等待是告訴 WebDriver 去等待一定的時間後去查找元素。預設等待時間是0秒,一旦設定該值,隐式等待是設定該 WebDriver 的執行個體的生命周期。這樣的隐式等待會有個坑,有些頁面的JS是放在body的最後進行加載,實際這是頁面上的元素都已經加載完畢,我們卻還在等待全部頁面加載結束。

需要特别說明的是:隐性等待對整個 driver 的周期都起作用,是以隻要設定一次即可(在最開始設定一次就可以了),切不要當作固定等待使用。

熟悉了什麼是顯式等待和隐式等待,下面就讓我們來看看怎麼使用這兩種等待吧。

1、顯式等待

顯式等待是你在代碼中定義等待一定條件發生後再進一步執行你的代碼。

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

driver = webdriver.Chrome()
driver.get("url")

locator = (By.ID, "你的标簽ID")

# 顯式等待:條件成立,立即執行;超過指定時間則報錯
WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located(locator))
driver.find_element_by_id("你的标簽ID").click()
# 或
element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, "你的标簽ID")))
element.click()      

注意:傳入的定位條件必須是元組形式。

代碼說明:

WebDriverWait(driver, 10):設定了一個10秒上限的等待時間。在指定時間内,一直等待某個條件成立,條件成立後立即執行定位元素的操作;如果超過這個時間條件仍然沒有成立,則會抛出 TimeoutException 異常!

expected_conditions:後面是自動化的Web浏覽器中一些常用的預期條件。請參考XXXXXXXXXXXXXXXXX

WebDriverWait參數:

  • driver:傳入WebDriver執行個體,即我們上例中的driver
  • timeout:逾時時間,等待的最長時間
  • poll_frequency:調用until或until_not中的方法的間隔時間,預設是0.5秒
  • ignored_exceptions:忽略的異常,如果在調用until或until_not的過程中抛出這個元組中的異常,則不中斷代碼,繼續等待,如果抛出的是這個元組外的異常,則中斷代碼,抛出異常。預設隻有NoSuchElementException。

這個子產品中,一共隻有兩種方法 until 與 until_not:

  • until:當某元素出現或什麼條件成立則繼續執行
  • until_not:當某元素消失或什麼條件不成立則繼續執行

until 與 until_not 參數如下:

  • method:在等待期間,每隔一段時間調用這個傳入的方法,直到傳回值不是False
  • message:如果逾時,抛出TimeoutException,将message傳入異常

2、隐式等待

如果某些元素不是立即可用的,隐式等待是告訴WebDriver去等待一定的時間後去查找元素。預設等待時間是0秒,一旦設定該值,隐式等待是設定該WebDriver的執行個體的生命周期。

from selenium import webdriver

driver = webdriver.Chrome()
# 隐式等待:最長等待10秒鐘往下執行
driver.implicitly_wait(10) 
driver.get("url")
# 執行定位元素操作
element = driver.find_element_by_id("标簽ID")      

注意:隐式等待和顯示等待都存在時,逾時時間取二者中較大的。

繼續閱讀