在UI自動化測試中,必然會遇到環境不穩定、網絡慢等情況。當你覺得定位沒有問題,但程序卻直接報了元素不可見時,那你就需要思考是否因爲程序運行太快或者頁面加載太慢而造成了元素不可見,必須要再等待直至元素可見和程序繼續運行。而在Selenium中,三種常見的等待方式都有各自的優點或缺點,可以在瞭解後嘗試針對不同的情況選擇最優的等待方式。
1.強制等待(sleep)
設置等待最簡單的方法就是強制等待,其實就是time.sleep()方法,不管它什麼情況,讓程序暫停運行一定時間,時間過後繼續運行;缺點是不智能,設置的時間太短,元素還沒有加載出來,那照樣會報錯;設置的時間太長,則會浪費時間,不要小瞧每次幾秒的時間,case多了,代碼量大了,很多個幾秒就會影響整體的運行速度了;所以儘量少用這個。
#-*- coding:utf-8 -*-
import time
from datetime import datetime
print (datetime.now()) #獲取當前時間
time.sleep(10) #設置等待時間10s
print(datetime.now()) #再次獲取當前時間
代碼很簡單,主要是獲取當前時候後設置了一個等待時間,然後在等待時間後面設置一個事物,這個事物來查看等待時間結束後的當前時間。通過執行結果我們很好地看到只有執行完畢等待以後纔會再次執行下一步驟。
2.隱性等待(implicitly_wait())
隱式等待實際是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然後執行下一步。這樣的隱式等待會有個坑,我們都知道js一般都是放在我們的body的最後進行加載,實際這是頁面上的元素都已經加載完畢,我們卻還在等待全部頁面加載結束。
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(20) # 隱性等待,最長等30秒
driver.get('https://www.baidu.com')
time.sleep(3)
driver.quit()
隱式等待對整個driver週期都起作用,在最開始設置一次就可以了。不要當作固定等待使用,到哪都來一下隱式等待。
3.顯示等待方式(WebDriverWait)
就是明確的要等待的元素在規定的時間之內都沒找到,那麼就拋出Exception.代碼示例如下:
# -*- coding: utf-8 -*-
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
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')
WebDriverWait(driver,20,0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()
WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)),selenium中的wait模塊的WebDriverWait()方法,配合until或者until_not方法,再輔助以一些判斷條件,就可以構成這樣一個場景:每經過多少秒就查看一次locator的元素是否可見,如果可見就停止等待,如果不可見就繼續等待直到超過規定的時間後,報超時異常;當然也可以判斷某元素是否在規定時間內不可見等等的各種場景吧,需要根據你自己實際的場景選擇判斷條件;
4.總結
隱式等待會等driver完全加載完成(如js、css等);顯示等待僅僅校驗需要加載的元素是否存在;強制等待字面很好理解,就不多說。大家可根據需求自行選擇。下期預告:selenium多窗口切換方法。