python selenium-webdriver 等待時間(七)


測試過程中,我們經過發現腳本執行的時候展現出來的效果都是很快結束了,為了觀察執行效果我們會增加一個等待時間來觀察一下執行效果。這種等待時間我們只是為了我們便於觀察,這種情況下是否包含等待時間不會影響我們的執行結果,但是有一種情況會直接影響我們的執行結果。在我們打開一個網站的時候需要由於環境的因素導致頁面沒有下載完成時,去定位元素此時無法找到元素,這個時候會影響到我們,這個時候我們增加一個等待時間就會顯得萬分重要。

selenium 主要提供Explicit Waits和Implicit Waits兩種模式的等待,但是python time 模塊也提供了一種非智能的sleep()等待,這個設置以后必須強制等待設置的時間,只有等待時間結束以后才會繼續執行,這種模式我一般會用到觀察執行的效果時候,而Explicit Waits和Implicit Waits 這兩種我會在實際自動化測試中使用。

下面我們了解一下這種三種等待模式

1.強制等待

  強制等待屬於python time模塊的一種等待,使用時需要引入time模塊才可以使用,下面我們看一斷代碼

#-*- coding:utf-8 -*-
import time
from datetime import datetime
print (datetime.now())   #獲取當前時間
time.sleep(10)           #設置等待時間10s
print(datetime.now())    #再次獲取當前時間

代碼很簡單,主要是獲取當前時候后設置了一個等待時間,然后在等待時間后面設置一個事物,這個事物來查看等待時間結束后的當前時間。通過執行結果我們很好的看到只有執行完畢等待以后才會再次執行下一步驟。

 2.隱性等待 implicitly_wait()

  什么是隱性的等待呢?所謂的隱性的等待就是我們設置了一個等待時間范圍,這個等待的時間是不固定的,最長的等待也莫過於我們設置的最大值。用高考來舉個例子,高考的語文是6月7日上午9:00 - 11:30,我們只能在規定的時間內答題交卷,不能超過11:30 交卷,如果我們提前答完卷,那么我們可以提前交卷,那么這里規定的2.5小時是我們設置的最大等待時間,而我們可以再任何時間答完試卷均去交卷,但是我們不能超過11:30交卷,也就是說明最大的答卷時間就是2.5h(正好也是因為此時剛剛高考結束,所以我這邊也趁下熱度)。

下來我們看段代碼

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)更加智能一些。

  說明:首先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,因為該模塊設計的內容比較多,我在這里就不詳細介紹,后面會單獨拿一個專題來介紹該模塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM