python selenium三種等待方式及詳解

導(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。

先看個代碼示例:

image

上例中垫挨,我們設(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ì)代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脐区,一起剝皮案震驚了整個濱河市愈诚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖炕柔,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酌泰,死亡現(xiàn)場離奇詭異,居然都是意外死亡匕累,警方通過查閱死者的電腦和手機(jī)陵刹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢嘿,“玉大人衰琐,你說我怎么就攤上這事〖什澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵显设,是天一觀的道長框弛。 經(jīng)常有香客問我讥电,道長冶共,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任砸西,我火速辦了婚禮指攒,結(jié)果婚禮上慷妙,老公的妹妹穿的比我還像新娘。我一直安慰自己允悦,他們只是感情好膝擂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隙弛,像睡著了一般架馋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上全闷,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天叉寂,我揣著相機(jī)與錄音,去河邊找鬼总珠。 笑死屏鳍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的局服。 我是一名探鬼主播钓瞭,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淫奔!你這毒婦竟也來了降淮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佳鳖,沒想到半個月后霍殴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系吩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年来庭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穿挨。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡月弛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出科盛,到底是詐尸還是另有隱情帽衙,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布贞绵,位于F島的核電站厉萝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏榨崩。R本人自食惡果不足惜谴垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望母蛛。 院中可真熱鬧翩剪,春花似錦、人聲如沸彩郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秫逝。三九已至博杖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筷登,已是汗流浹背剃根。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留前方,地道東北人狈醉。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像惠险,于是被迫代替她去往敵國和親苗傅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容