測試過程當中,咱們通過發現腳本執行的時候展示出來的效果都是很快結束了,爲了觀察執行效果咱們會增長一個等待時間來觀察一下執行效果。這種等待時間咱們只是爲了咱們便於觀察,這種狀況下是否包含等待時間不會影響咱們的執行結果,可是有一種狀況會直接影響咱們的執行結果。在咱們打開一個網站的時候須要因爲環境的因素致使頁面沒有下載完成時,去定位元素此時沒法找到元素,這個時候會影響到咱們,這個時候咱們增長一個等待時間就會顯得萬分重要。python
selenium 主要提供Explicit Waits和Implicit Waits兩種模式的等待,可是python time 模塊也提供了一種非智能的sleep()等待,這個設置之後必須強制等待設置的時間,只有等待時間結束之後纔會繼續執行,這種模式我通常會用到觀察執行的效果時候,而Explicit Waits和Implicit Waits 這兩種我會在實際自動化測試中使用。web
下面咱們瞭解一下這種三種等待模式測試
1.強制等待網站
強制等待屬於python time模塊的一種等待,使用時須要引入time模塊纔可使用,下面咱們看一斷代碼ui
#-*- coding:utf-8 -*- import time from datetime import datetime print (datetime.now()) #獲取當前時間 time.sleep(10) #設置等待時間10s print(datetime.now()) #再次獲取當前時間
代碼很簡單,主要是獲取當前時候後設置了一個等待時間,而後在等待時間後面設置一個事物,這個事物來查看等待時間結束後的當前時間。經過執行結果咱們很好的看到只有執行完畢等待之後纔會再次執行下一步驟。google
2.隱性等待 implicitly_wait()spa
什麼是隱性的等待呢?所謂的隱性的等待就是咱們設置了一個等待時間範圍,這個等待的時間是不固定的,最長的等待也莫過於咱們設置的最大值。用高考來舉個例子,高考的語文是6月7日上午9:00 - 11:30,咱們只能在規定的時間內答題交卷,不能超過11:30 交卷,若是咱們提早答完卷,那麼咱們能夠提早交卷,那麼這裏規定的2.5小時是咱們設置的最大等待時間,而咱們能夠再任什麼時候間答完試卷均去交卷,可是咱們不能超過11:30交卷,也就是說明最大的答卷時間就是2.5h(正好也是由於此時剛剛高考結束,因此我這邊也趁下熱度)。設計
下來咱們看段代碼code
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) #這裏設置智能等待10s driver.get('https://www.google.com.hk') print (driver.title) driver.quit()
這裏主要採用 implicitly_wait(10)方法來設置等待時間,這裏要比time.sleep(10)更加智能一些。blog
說明:首先Implicit Waits默認是等待時間是0,同時隱性等待是對driver起做用,因此只要設置一次便可,沒有必要處處設置
3.顯示的等待 WebDriverWait()
WebDriverWait()會配合until()和until_not()方法一塊兒使用,根據判斷條件而進行靈活進行處理時間等待問題,他會不斷的根據你設定的條件去判斷,直到超過你設置的等待時間,若是設置的條件知足,而後進行下一步操做,若是沒有知足會報一個'selenium.common.exceptions.TimeoutException: Message: '錯誤,使用WebDriverWait首先須要導入from selenium.webdriver.support.ui import WebDriverWait模塊,下面咱們看一下實際的代碼
#-*- coding:utf-8 -*- from datetime import datetime 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 driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.maximize_window() try: #爲了更好的對比效果,首先咱們設置了一個存在的元素,而後在去找一個不存在的元素,一樣設置了10s的等待時間 #kw元素存在時 print(datetime.now()) # element = WebDriverWait(driver,10).until( #until 也屬於WebDriverWait,表明一直等待,直到某元素可見,until_not與其相反,判斷某個元素直到不存在 EC.presence_of_element_located((By.ID, "kw")) #presence_of_element_located主要判斷頁面元素kw在頁面中存在。 ) #kw111元素不存在時 print(datetime.now()) element = WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID, "kw111")) ) finally: print(datetime.now()) driver.quit()
看下剛纔代碼的效果
經過運行的結果咱們能夠看到,id爲kw和kw111兩個元素,均設置了10s等待時間,當id爲kw的元素找到的時候很快就去執行下一步,,找id 爲'kw111'元素時,發現沒法找到一直等待下去,期間會不斷的去巡查,直到超過咱們設置的鏈接超時的時間報一個TimeoutException錯誤。
在使用顯示的等待等待時候咱們使用到了Expected Conditions的方法presence_of_element_located,由於該模塊設計的內容比較多,我在這裏就不詳細介紹,後面會單獨拿一個專題來介紹該模塊。