天天看點

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

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

繼續閱讀