在UI自動化測試中,必然會遇到環(huán)境不穩(wěn)定、網(wǎng)絡(luò)慢等情況。當(dāng)你覺得定位沒有問題,但程序卻直接報了元素不可見時,那你就需要思考是否因為程序運行太快或者頁面加載太慢而造成了元素不可見,必須要再等待直至元素可見和程序繼續(xù)運行。而在Selenium中,三種常見的等待方式都有各自的優(yōu)點或缺點,可以在了解后嘗試針對不同的情況選擇最優(yōu)的等待方式。
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括安福網(wǎng)站建設(shè)、安福網(wǎng)站制作、安福網(wǎng)頁制作以及安福網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,安福網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到安福省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1.強制等待(sleep)
設(shè)置等待最簡單的方法就是強制等待,其實就是time.sleep()方法,不管它什么情況,讓程序暫停運行一定時間,時間過后繼續(xù)運行;缺點是不智能,設(shè)置的時間太短,元素還沒有加載出來,那照樣會報錯;設(shè)置的時間太長,則會浪費時間,不要小瞧每次幾秒的時間,case多了,代碼量大了,很多個幾秒就會影響整體的運行速度了;所以盡量少用這個。
#-*- coding:utf-8 -*-
import time
from datetime import datetime
print (datetime.now())? ?#獲取當(dāng)前時間
time.sleep(10)? ? ? ? ? ?#設(shè)置等待時間10s
print(datetime.now())? ? #再次獲取當(dāng)前時間
代碼很簡單,主要是獲取當(dāng)前時候后設(shè)置了一個等待時間,然后在等待時間后面設(shè)置一個事物,這個事物來查看等待時間結(jié)束后的當(dāng)前時間。通過執(zhí)行結(jié)果我們很好地看到只有執(zhí)行完畢等待以后才會再次執(zhí)行下一步驟。
2.隱性等待(implicitly_wait())
隱式等待實際是設(shè)置了一個最長等待時間,如果在規(guī)定時間內(nèi)網(wǎng)頁加載完成,則執(zhí)行下一步,否則一直等到時間結(jié)束,然后執(zhí)行下一步。這樣的隱式等待會有個坑,我們都知道js一般都是放在我們的body的最后進行加載,實際這是頁面上的元素都已經(jīng)加載完畢,我們卻還在等待全部頁面加載結(jié)束。
# -*- 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周期都起作用,在最開始設(shè)置一次就可以了。不要當(dāng)作固定等待使用,到哪都來一下隱式等待。
3.顯示等待方式(WebDriverWait)
就是明確的要等待的元素在規(guī)定的時間之內(nèi)都沒找到,那么就拋出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方法,再輔助以一些判斷條件,就可以構(gòu)成這樣一個場景:每經(jīng)過多少秒就查看一次locator的元素是否可見,如果可見就停止等待,如果不可見就繼續(xù)等待直到超過規(guī)定的時間后,報超時異常;當(dāng)然也可以判斷某元素是否在規(guī)定時間內(nèi)不可見等等的各種場景吧,需要根據(jù)你自己實際的場景選擇判斷條件;
4.總結(jié)
隱式等待會等driver完全加載完成(如js、css等);顯示等待僅僅校驗需要加載的元素是否存在;強制等待字面很好理解,就不多說。大家可根據(jù)需求自行選擇。下期預(yù)告:selenium多窗口切換方法。