Python Selenium等待的三種方式

分享知識  傳遞快樂

 

Selenium 設置元素等待的三種方式:

  • 強制等待:time.sleep()
  • 隱式等待:implicitly_wait()
  • 顯式等待:WebDriverWait()

 

1、強制等待

強制等待雖然簡單明瞭,但如果設置sleep等待時間過短,元素還沒加載出來,程序會報錯;如果sleep設置等待時間過長,元素早就加載出來了,程序還在等待,浪費是時間,所以不建議使用。(注:腳本調試過程時使用還是挺方便的)

代碼1:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 設置等待5秒鐘
time.sleep(5)
driver.get('https://cn.bing.com/')

 

2、隱式等待

隱式等待實際是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然後執行下一步。如果某些元素不是立即可用的,隱式等待是告訴 WebDriver 去等待一定的時間後去查找元素。默認等待時間是0秒,一旦設置該值,隱式等待是設置該 WebDriver 的實例的生命週期。

代碼2:

from selenium import webdriver

driver = webdriver.Chrome()
# 隱式等待:直接等待10秒鐘下往下執行
driver.implicitly_wait(10) 
driver.get("url")
# 執行定位元素操作
element = driver.find_element_by_id("標籤ID")

在代碼前部分加 implicitly_wait(10),整個的程序運行過程中都會有效(作用於全局,直接在初始化 driver 的後加,後面的代碼都會受影響),都會等待元素加載完成。如果在設置的時間內沒有加載到整個頁面,則會報 NosuchElementError 異常。如果元素在第10s被加載出來,自動執行下面的腳本,不會一直等待10s。這樣的隱式等待會有個坑,有些頁面的JS是放在body的最後進行加載,實際這是頁面上的元素都已經加載完畢,我們卻還在等待全部頁面加載結束。

 

3、顯式等待

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

代碼3:

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()

顯式等待想對執行效率快一些,無需等待整個頁面加載完成,只需加載到你要定位的元素就可以執行。但不過就是麻煩,寫的代碼太多。

 

 

 

 

 

 

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

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