我們在使用selenium的時候,會遇到一種定位不到的情況,因為web頁面有一個加載的過程 當頁面元素未出現時,
去定位肯定是定位不到的,所以我們需要用到了‘等待’,該如何使用等待呢,讓我們一起來探討一下吧!
time.sleep()強制等待
time模塊,是python專門用來處理時間的內建庫。
我們可以使用它時需要導入 import time
time.sleep(2) 意思是強制休眠2秒種的時間
這樣等待的弊端是,我們已經定位到元素的時候,還會繼續等待,導致我們工作效率很低 所以WebDriver提供了兩種類型的等待:隱式等待和顯式等待
implicitly_wait()隱式等待
該方法來實現隱式等待,默認參數的單位為秒,如里面的參數設置等待時長為10秒。
當腳本執行到某個元素定位時,如果元素可以定位,則繼續執行;
如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設在第6秒定位到了元素則繼續執行,
若直到超出設置時長(10秒)還沒有定位到元素,則拋出異常
該等待設置完是對整個全局起作用,所以只需設置一次即可,不需要導入任何模塊,直接使用
WebDriverWait():顯式等待
是針對於某個特定的元素設置的等待時間,在設置時間內,默認每隔0.5時間檢測一次特定的元素是否存在,
如果在設置的時間內找到了元素,則直接執行。如果超過設置最長等待時間檢測不到則拋出異常。
默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException。
該方法需要導入By 、WebDriverWait 、expected_conditions
下面的代碼是對三種等待的具體例子:
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
import time
driver=webdriver.Chrome() driver.implicitly_wait(5) #隱式等待
driver.get('http://www.baidu.com')
time.sleep(3) #強制等待
driver.find_element_by_id('kw').send_keys('特朗普')
#每隔0.5秒檢查一次(默認就是0.5秒。也可以修改),最多等待10秒,直到找到ID="su"元素就執行,否則拋出異常
element=WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located((By.ID,'su'))) #顯式等待
element.click()
time.sleep(2)
driver.quit()
補充一點
presence_of_element_located 檢查元素是否存在,但是並不一定可見。
visibility_of_element_located 檢查元素存在,並且可見於頁面,也就是能定位到它