導(dǎo)讀:
本文介紹兩個大的知識點(diǎn):
1弱匪、selenium顯示等待WebDriverWait與條件判斷expected_conditions
2撑碴、selenium的三種等待方式
其實(shí)都是圍繞一個大的知識點(diǎn)鞭达,等待
歡迎關(guān)注微信公號【軟測小生(ruancexiaosheng)】
selenium的三種等待方式汇陆,強(qiáng)制等待晃财、隱性等待娩鹉、顯性等待阿迈,一直我都知道元媚,我能朗朗上口說出前兩種,但是第三種在前幾天別人問到我具體實(shí)現(xiàn)的時候我語塞了一下苗沧,今天就再一次學(xué)習(xí)了下刊棕,并總結(jié)發(fā)成文章與大家一起分享。 1. 強(qiáng)制等待(基于Python)
第一種也是最簡單粗暴的一種辦法就是強(qiáng)制等待sleep(xx)待逞,強(qiáng)制讓閃電俠等xx時間甥角,不管凹凸曼能不能跟上速度,還是已經(jīng)提前到了识樱,都必須等xx時間嗤无。
看代碼:
# -- coding: utf-8 --**
from selenium import webdriver from time import sleep# 強(qiáng)制等待3秒再執(zhí)行下一步
url="https://www.baidu.com"
driver=webdriver.Firefox()
driver.get(url).sleep(3)
print(driver.current_url) driver.quit() driver.close()#這種方式更佳,直接關(guān)閉driver進(jìn)程怜庸。
這種叫強(qiáng)制等待当犯,不管你瀏覽器是否加載完了,程序都得等待3秒割疾,3秒一到嚎卫,繼續(xù)執(zhí)行下面的代碼,作為調(diào)試很有用杈曲,有時候也可以在代碼里這樣等待驰凛,不過不建議總用這種等待方式,太死板担扑,嚴(yán)重影響程序執(zhí)行速度恰响。
2. 隱性等待
第二種辦法叫隱性等待,implicitly_wait(xx)涌献,隱性等待的意義是:閃電俠和凹凸曼約定好胚宦,不論閃電俠去哪兒,都要等凹凸曼xx秒燕垃,如果凹凸曼在這段時間內(nèi)來了枢劝,則倆人立即出發(fā)去打怪獸,如果凹凸曼在規(guī)定時間內(nèi)沒到卜壕,則閃電俠自己去您旁,那自然就等著凹凸曼給你拋異常吧。
看代碼: # -- coding: utf-8 --**
from selenium import webdriver driver = webdriver.Firefox()
driver.implicitly_wait(30)
url="https://www.baidu.com"
driver.get(url)
print(driver.current_url) driver.quit()
隱形等待是設(shè)置了一個最長等待時間轴捎,如果在規(guī)定時間內(nèi)網(wǎng)頁加載完成鹤盒,則執(zhí)行下一步蚕脏,否則一直等到時間截止,然后執(zhí)行下一步侦锯。注意這里有一個弊端驼鞭,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標(biāo)簽欄那個小圈不再轉(zhuǎn)尺碰,才會執(zhí)行下一步挣棕,但有時候頁面想要的元素早就在加載完成了,但是因?yàn)閭€別js之類的東西特別慢亲桥,我仍得等到頁面全部完成才能執(zhí)行下一步洛心,我想等我要的元素出來之后就下一步怎么辦?有辦法题篷,這就要看selenium提供的另一種等待方式——顯性等待wait了皂甘。
需要特別說明的是:隱性等待對整個driver的周期都起作用,所以只要設(shè)置一次即可悼凑,我曾看到有人把隱性等待當(dāng)成了sleep在用偿枕,走哪兒都來一下…
3. 顯性等待
第三種辦法就是顯性等待,WebDriverWait户辫,配合該類的until()和until_not()方法渐夸,就能夠根據(jù)判斷條件而進(jìn)行靈活地等待了。它主要的意思就是:程序每隔xx秒看一眼渔欢,如果條件成立了墓塌,則執(zhí)行下一步,否則繼續(xù)等待奥额,直到超過設(shè)置的最長時間苫幢,然后拋出TimeoutException。
先看個代碼示例:
上例中垫挨,我們設(shè)置了隱性等待和顯性等待韩肝,在其他操作中,隱性等待起決定性作用九榔,在WebDriverWait..中顯性等待起主要作用哀峻,但要注意的是:最長的等待時間取決于兩者之間的大者,此例中為20哲泊,如果隱性等待時間 > 顯性等待時間剩蟀,則該句代碼的最長等待時間等于隱性等待時間。
我們主要用到了WebDriverWait類與expected_conditions模塊切威,下面小編帶大家細(xì)看一下這兩個模塊:
WebDriverWait
wait模塊的WebDriverWait類是顯性等待類育特,先看下它有哪些參數(shù)與方法:
selenium.webdriver.support.wait.WebDriverWait(類)
init
driver:傳入WebDriver實(shí)例,即我們上例中的driver
timeout: 超時時間先朦,等待的最長時間(同時要考慮隱性等待時間)
poll_frequency: 調(diào)用until或until_not中的方法的間隔時間缰冤,默認(rèn)是0.5秒
ignored_exceptions: 忽略的異常槽袄,如果在調(diào)用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼锋谐,繼續(xù)等待,如果拋出的是這個元組外的異常截酷,則中斷代碼涮拗,拋出異常。默認(rèn)只有NoSuchElementException迂苛。
until
method: 在等待期間三热,每隔一段時間(init中的poll_frequency)調(diào)用這個傳入的方法,直到返回值不是False
message: 如果超時三幻,拋出TimeoutException就漾,將message傳入異常
until_not
與until相反,until是當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行念搬,
until_not是當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行抑堡,參數(shù)也相同,不再贅述朗徊。
看了以上內(nèi)容基本上很清楚了首妖,調(diào)用方法如下:
WebDriverWait(driver, 超時時長, 調(diào)用頻率, 忽略異常).until(可執(zhí)行方法, 超時時返回的信息)
這里需要特別注意的是until或until_not中的可執(zhí)行方法method參數(shù),很多人傳入了WebElement對象爷恳,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 錯誤
這是錯誤的用法有缆,這里的參數(shù)一定要是可以調(diào)用的,即這個對象一定有 call() 方法温亲,否則會拋出異常:
TypeError: 'xxx' object is not callable
在這里棚壁,你可以用selenium提供的 expected_conditions 模塊中的各種條件,也可以用WebElement的 is_displayed() 栈虚、is_enabled()袖外、is_selected() 方法,或者用自己封裝的方法都可以魂务,那么接下來我們看一下selenium提供的條件有哪些:
expected_conditions
expected_conditions是selenium的一個模塊在刺,其中包含一系列可用于判斷的條件:
selenium.webdriver.support.expected_conditions(模塊)
以下兩個條件類驗(yàn)證title,驗(yàn)證傳入的參數(shù)title是否等于或包含于driver.title
1头镊、title_is
2蚣驼、title_contains
以下兩個條件驗(yàn)證元素是否出現(xiàn),傳入的參數(shù)都是元組類型的locator相艇,如(By.ID, ‘kw’)
顧名思義颖杏,一個只要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行
3坛芽、presence_of_element_located
4留储、presence_of_all_elements_located
以下三個條件驗(yàn)證元素是否可見翼抠,前兩個傳入?yún)?shù)是元組類型的locator,第三個傳入WebElement第一個和第三個其實(shí)質(zhì)是一樣的
5获讳、visibility_of_element_located
6阴颖、invisibility_of_element_located
7、visibility_of
以下兩個條件判斷某段文本是否出現(xiàn)在某元素中丐膝,一個判斷元素的text量愧,一個判斷元素的value 。
8帅矗、text_to_be_present_in_element
9偎肃、text_to_be_present_in_element_value
以下條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id浑此、name累颂、index或WebElement
10、frame_to_be_available_and_switch_to_it
以下條件判斷是否有alert出現(xiàn)
11凛俱、alert_is_present
以下條件判斷元素是否可點(diǎn)擊紊馏,傳入locator
12、element_to_be_clickable
以下四個條件判斷元素是否被選中蒲犬,第一個條件傳入WebElement對象瘦棋,第二個傳入locator元組
第三個傳入WebElement對象以及狀態(tài),相等返回True暖哨,否則返回False
第四個傳入locator以及狀態(tài)赌朋,相等返回True,否則返回False
13篇裁、element_to_be_selected
14沛慢、element_located_to_be_selected
15、element_selection_state_to_be
16达布、element_located_selection_state_to_be
最后一個條件判斷一個元素是否仍在DOM中团甲,傳入WebElement對象,可以判斷頁面是否刷新了
17黍聂、staleness_of
上面是所有17個condition躺苦,與until、until_not組合能夠?qū)崿F(xiàn)很多判斷产还,如果能自己靈活封裝匹厘,將會大大提高腳本的穩(wěn)定性。
閱讀原文查看詳細(xì)代碼