因爲web網頁打開後須要時間進行數據的傳送,頁面的渲染,因此咱們在寫web自動化腳本的時候,須要等待它加載完全部的頁面元素,咱們才進行操做或點擊。同時這種等待也是爲了提升腳本的穩定性。html
selenium中有三種等待,分別是強制等待,隱性等待和顯性等待:python
一、強制等待web
無論瀏覽器是否加載完,程序都要等待設置的時間,不建議常常使用該等待方式,會嚴重影響程序的執行速度。瀏覽器
time.sleep(秒數)-----這裏的時間單位是秒,表示強制等待幾秒函數
在使用該函數前要導入time模塊spa
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("http://ke.qq.com") time.sleep(3)
二、隱性等待htm
隱形等待是設置了一個最長等待時間,若是在規定時間內網頁加載完成,則執行下一步,不然一直等到時間截止,而後執行下一步。注意這裏有一個弊端,那就是程序會一直等待整個頁面加載完成。隱性等待對driver的整個週期都起做用,因此只要設置一次便可。blog
implicitly_wait(30)----隱性等待,最長時長爲30秒ci
from selenium import webdriver driver = webdriver.Chrome() driver.get("http://ke.qq.com") driver.implicitly_wait(10) # 隱性等待10秒 driver.find_element_by_xpath("//a[@data-type = '1']").click()
三、顯性等待element
WebDriverWait,配合該類的until()和until_not()方法,就可以根據判斷條件而進行靈活地等待了。它主要的意思就是:在設置的最長時間裏面週期性的去檢查這個元素是否知足設定的條件,若是到了截止時間還未知足條件則拋出TimeoutException。
模塊導入:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))------循環週期是0.5秒,最長時長爲20秒,等待元素存在
對於元素的狀態:存在、可見、可用的理解:
元素存在(html裏存在,能找到)
元素可見(存在而且可見-看得見大小-可見纔可操做)
元素可用(可見以後,纔有可用的可能性、只讀/不可點擊)
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://ke.qq.com/") driver.maximize_window() #隱性等待 driver.implicitly_wait(20) #顯性等待 loc =(By.ID, "js_login") WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) #點擊登陸元素 driver.find_element(*loc).click() #點擊qq登陸 driver.find_element_by_xpath("//a[@data-type = '1']").click()
隱性等待和顯性等待能夠同時使用,最長的等待時間取決於二者之間的大者。