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()
driver.get("url")
# 隱式等待:最長等待10秒鐘往下執行
driver.implicitly_wait(10) 
# 執行定位元素操作
element = driver.find_element_by_id("標籤ID")

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

 

 

 

 

 

 

 

 

—————————
如有不足請留言指正
相互學習,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章