在自動(dòng)化測(cè)試腳本的運(yùn)行過(guò)程中,webdriver操作瀏覽器的時(shí)候,對(duì)于元素的定位是有一定的超時(shí)時(shí)間,大致應(yīng)該在1-3秒的樣子,如果這個(gè)時(shí)間內(nèi)仍然定位不到元素,就會(huì)拋出異常,中止腳本執(zhí)行。我們可以通過(guò)在腳本中設(shè)置等待的方式來(lái)避免由于網(wǎng)絡(luò)延遲或?yàn)g覽器卡頓導(dǎo)致的偶然失敗,常用的等待方式有三種:
一、強(qiáng)制等待
強(qiáng)制等待是利用python語(yǔ)言自帶的time庫(kù)中的sleep()方法:
from time import sleep
sleep(10)
sleep()顧明思義就是睡覺(jué)的意思,就是腳本一旦執(zhí)行到條語(yǔ)句sleep(10)就睡10s,再執(zhí)行后面的語(yǔ)句,他是一個(gè)強(qiáng)制等待的方式,使得整個(gè)腳本暫停。但是這種方式會(huì)導(dǎo)致這個(gè)腳本運(yùn)行時(shí)間過(guò)長(zhǎng),不到萬(wàn)不得已盡可能少用,特殊情況下,時(shí)間設(shè)置最好不超過(guò)1秒,一般0.5秒。
二、隱式等待
隱式等待相比強(qiáng)制等待更智能,顧明思義,在腳本中我們一般看不到等待語(yǔ)句,但是它會(huì)在每個(gè)頁(yè)面加載的時(shí)候自動(dòng)等待;隱式等待只需要聲明一次,一般在打開(kāi)瀏覽器后進(jìn)行聲明。聲明之后對(duì)整個(gè)drvier的生命周期都有效,后面不用重復(fù)聲明。
driver = webdriver.Chrome()
driver.implicitly_wait(10)
implicitly_wait()方法用來(lái)等待頁(yè)面加載完成(直觀的就是瀏覽器tab頁(yè)上的小圈圈轉(zhuǎn)完),implicitly_wait(10),超時(shí)時(shí)間10s,10秒內(nèi)一旦加載完成,就執(zhí)行下一條語(yǔ)句;如果10秒內(nèi)頁(yè)面都沒(méi)有加載完,就超時(shí)拋出異常。隱式等待在自動(dòng)化測(cè)試中的運(yùn)用,看代碼:
from selenium import webdriver
import unittest
class TestBase(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Chrome() #驅(qū)動(dòng)瀏覽器
self.driver.implicitly_wait(10) #設(shè)置隱式等待
self.driver.maximize_window() #最大化瀏覽器
def test(self):
print('這是一個(gè)測(cè)試用例')
def tearDown(self):
self.driver.quit()
if __name__=='__main__':
unittest.main()
但是隱式等待依然存在一個(gè)問(wèn)題,那就是程序會(huì)一直等待整個(gè)頁(yè)面加載完成,也就是一般情況下你看到瀏覽器標(biāo)簽欄那個(gè)小圈不再轉(zhuǎn),才會(huì)執(zhí)行下一步,但有時(shí)候頁(yè)面想要的元素早就在加載完成了,但是因?yàn)閭€(gè)別js之類(lèi)的東西特別慢,我仍得等到頁(yè)面全部完成才能執(zhí)行下一步。所以,這里webdriver提供了一種更加智能的等待方式:顯示等待
三、顯示等待
顯示等待與隱式等待相對(duì),顯示等待必須在每個(gè)需要等待的元素前面進(jìn)行聲明。
#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions類(lèi),并重命名為EC
from selenium.webdriver.support expected_conditions as EC
#引入By類(lèi)
from selenium.webdriver.common.by import By
# Python小白學(xué)習(xí)交流群:711312441
#設(shè)置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))
顯示等待需要用到兩個(gè)類(lèi):
WebDriverWait和expected_conditions兩個(gè)類(lèi)。
1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:瀏覽器驅(qū)動(dòng)
timeout:最長(zhǎng)超時(shí)時(shí)間,默認(rèn)以秒為單位
poll_frequency:檢測(cè)的間隔步長(zhǎng),默認(rèn)為0.5s
ignored_exceptions:超時(shí)后的拋出的異常信息,默認(rèn)拋出NoSuchElementExeception異常。
WebDriverWait()中的until()和until_not()方法:
- until
method: 在等待期間,每隔一段時(shí)間(__init__中的poll_frequency)調(diào)用這個(gè)傳入的方法,直到返回值不是False
message: 如果超時(shí),拋出TimeoutException,將message傳入異常
- until_not
與until相反,until是當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行,
until_not是當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行,參數(shù)也相同。
2、expected_conditions類(lèi)
各種類(lèi),達(dá)到某種條件,返回True和False
常用條件:
條件 | 說(shuō)明 |
---|---|
presence_of_element_located | 判斷某個(gè)元素是否被加到了DOM樹(shù)里,并不代表該元素一定可見(jiàn) |
visibility_of_element_located | 判斷某個(gè)元素是否可見(jiàn),可見(jiàn)代表元素非隱藏,并且元素的寬和高都不等于0 |
關(guān)于顯示等待,也可以自己寫(xiě)條件:
#設(shè)置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函數(shù)
wait.until(lambda diver:driver.find_element_by_id('kw'))
顯示等待是一種智能程度較高的等待方式,可以有效的增強(qiáng)腳本的健壯性,以下條件適用:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-647314.html
當(dāng)打開(kāi)一個(gè)新頁(yè)面,執(zhí)行第一個(gè)元素操作的時(shí)候
當(dāng)某一步操作會(huì)引發(fā)頁(yè)面的加載,并且加載的內(nèi)容包含了下一步需要操作的元素。一句話(huà),就是當(dāng)某個(gè)元素有加載過(guò)程的時(shí)候,就需要加上顯示等待。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-647314.html
到了這里,關(guān)于webdriver 的三種等待方式(強(qiáng)制等待、隱式等待、顯示等待)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!