python selenium 三種等待方式詳解

1.強(qiáng)制等待(sleep)

設(shè)置等待最簡(jiǎn)單的方法就是強(qiáng)制等待穆役,其實(shí)就是time.sleep()方法获三,不管它什么情況旁蔼,讓程序暫停運(yùn)行一定時(shí)間,時(shí)間過(guò)后繼續(xù)運(yùn)行疙教;缺點(diǎn)時(shí)不智能棺聊,設(shè)置的時(shí)間太短,元素還沒(méi)有加載出來(lái)松逊,那照樣會(huì)報(bào)錯(cuò)躺屁;設(shè)置的時(shí)間太長(zhǎng),則會(huì)浪費(fèi)時(shí)間经宏,不要小瞧每次幾秒的時(shí)間犀暑,case多了,代碼量大了烁兰,很多個(gè)幾秒就會(huì)影響整體的運(yùn)行速度了耐亏;所以盡量少用這個(gè)

2.隱性等待(implicitly_wait())

driver.implicitly_wait(),隱性等待設(shè)置了一個(gè)時(shí)間沪斟,在一段時(shí)間內(nèi)網(wǎng)頁(yè)是否加載完成广辰,如果完成了,就進(jìn)行下一步主之;在設(shè)置的時(shí)間內(nèi)沒(méi)有加載完成择吊,則會(huì)報(bào)超時(shí)加載;

# -*- coding: utf-8 -*-  
from selenium import webdriver
import time

driver = webdriver.Chrome()  
driver.implicitly_wait(20) # 隱性等待槽奕,最長(zhǎng)等30秒  
driver.get('https://www.baidu.com')
time.sleep(3)
driver.quit()

缺點(diǎn)也是不智能几睛,因?yàn)殡S著ajax技術(shù)的廣泛應(yīng)用,頁(yè)面的元素往往都可以時(shí)間局部加載粤攒,也就是在整個(gè)頁(yè)面沒(méi)有加載完的時(shí)候所森,可能我們需要的元素已經(jīng)加載完成了囱持,那就么有必要再等待整個(gè)頁(yè)面的加載,執(zhí)行進(jìn)行下一步焕济,而隱性等待滿足不了這一點(diǎn)纷妆;

另外一點(diǎn),隱性等待的設(shè)置時(shí)全局性的晴弃,在開(kāi)頭設(shè)置過(guò)之后掩幢,整個(gè)的程序運(yùn)行過(guò)程中都會(huì)有效,都會(huì)等待頁(yè)面加載完成肝匆;不需要每次設(shè)置一遍粒蜈;

3.顯性等待(WebDriverWait)

WebDriverWait(driver, 20, 0.5).until(expected_conditions.presence_of_element_located(locator))顺献,selenium中的wait模塊的WebDriverWait()方法旗国,配合until或者until_not方法,再輔助以一些判斷條件注整,就可以構(gòu)成這樣一個(gè)場(chǎng)景:每經(jīng)過(guò)多少秒就查看一次locator的元素是否可見(jiàn)能曾,如果可見(jiàn)就停止等待,如果不可見(jiàn)就繼續(xù)等待直到超過(guò)規(guī)定的時(shí)間后肿轨,報(bào)超時(shí)異常寿冕;當(dāng)然也可以判斷某元素是否在規(guī)定時(shí)間內(nèi)不可見(jiàn)等等的各種場(chǎng)景吧,需要根據(jù)你自己實(shí)際的場(chǎng)景選擇判斷條件椒袍;

# -*- 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.implicitly_wait(10)
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()

在本示例中驼唱,我們?cè)O(shè)置了隱性等待(10秒)和顯性等待(20秒),在其他的操作中隱性等待起決定性作用驹暑,在示例中的WebDriverWait設(shè)置了顯性等待的地方玫恳,則顯性等待起決定性作用,但要注意的是:最長(zhǎng)等待時(shí)間取決于兩者之間的大值优俘,所以這里顯性等待的最長(zhǎng)時(shí)間為20s京办。

selenium.webdriver.support.expected_conditions(模塊)  

這兩個(gè)條件類(lèi)驗(yàn)證title,驗(yàn)證傳入的參數(shù)title是否等于或包含于driver.title  

title_is  

title_contains  

這兩個(gè)人條件驗(yàn)證元素是否出現(xiàn)帆焕,傳入的參數(shù)都是元組類(lèi)型的locator惭婿,如(By.ID, 'kw')  

顧名思義,一個(gè)只要一個(gè)符合條件的元素加載出來(lái)就通過(guò)叶雹;另一個(gè)必須所有符合條件的元素都加載出來(lái)才行  

presence_of_element_located  

presence_of_all_elements_located  

這三個(gè)條件驗(yàn)證元素是否可見(jiàn)财饥,前兩個(gè)傳入?yún)?shù)是元組類(lèi)型的locator,第三個(gè)傳入WebElement  

第一個(gè)和第三個(gè)其實(shí)質(zhì)是一樣的  

visibility_of_element_located  

invisibility_of_element_located  

visibility_of  

這兩個(gè)人條件判斷某段文本是否出現(xiàn)在某元素中折晦,一個(gè)判斷元素的text钥星,一個(gè)判斷元素的value  

text_to_be_present_in_element  

text_to_be_present_in_element_value  

這個(gè)條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id筋遭、name打颤、index或WebElement  

frame_to_be_available_and_switch_to_it  

這個(gè)條件判斷是否有alert出現(xiàn)  

alert_is_present  

這個(gè)條件判斷元素是否可點(diǎn)擊暴拄,傳入locator  

element_to_be_clickable  

這四個(gè)條件判斷元素是否被選中,第一個(gè)條件傳入WebElement對(duì)象编饺,第二個(gè)傳入locator元組  

第三個(gè)傳入WebElement對(duì)象以及狀態(tài)乖篷,相等返回True,否則返回False  

第四個(gè)傳入locator以及狀態(tài)透且,相等返回True撕蔼,否則返回False  

element_to_be_selected  

element_located_to_be_selected  

element_selection_state_to_be  

element_located_selection_state_to_be  

最后一個(gè)條件判斷一個(gè)元素是否仍在DOM中,傳入WebElement對(duì)象秽誊,可以判斷頁(yè)面是否刷新了  

staleness_of

特別注意:
很多時(shí)候大家在使用until或until_not時(shí)鲸沮,會(huì)將一個(gè)WebElement對(duì)象傳入給method,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 這是錯(cuò)誤的用法
這里的參數(shù)一定要是可調(diào)用的锅论,這個(gè)對(duì)象一定要有call()方法讼溺,否則會(huì)拋出異常:
TypeError: 'xxx' object is not callable
在這里,也可以用selenium2提供的expected_conditions模塊中提供的各種條件最易,也可用WebElement中的is_displayed()怒坯,is_selected(),is_enabled()方法或是自己封裝的方法均可藻懒。下面我們?cè)倏纯磗elenium提供了哪些條件剔猿,如圖所示:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嬉荆,隨后出現(xiàn)的幾起案子归敬,更是在濱河造成了極大的恐慌,老刑警劉巖鄙早,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汪茧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蝶锋,警方通過(guò)查閱死者的電腦和手機(jī)陆爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扳缕,“玉大人慌闭,你說(shuō)我怎么就攤上這事∏颍” “怎么了驴剔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粥庄。 經(jīng)常有香客問(wèn)我丧失,道長(zhǎng),這世上最難降的妖魔是什么惜互? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任布讹,我火速辦了婚禮琳拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘描验。我一直安慰自己白嘁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膘流。 她就那樣靜靜地躺著絮缅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呼股。 梳的紋絲不亂的頭發(fā)上耕魄,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音彭谁,去河邊找鬼吸奴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛马靠,可吹牛的內(nèi)容都是我干的奄抽。 我是一名探鬼主播蔼两,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼甩鳄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了额划?” 一聲冷哼從身側(cè)響起妙啃,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俊戳,沒(méi)想到半個(gè)月后揖赴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抑胎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年燥滑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阿逃。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铭拧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恃锉,到底是詐尸還是另有隱情搀菩,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布破托,位于F島的核電站肪跋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏土砂。R本人自食惡果不足惜州既,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一谜洽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吴叶,春花似錦褥琐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至造寝,卻和暖如春磕洪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诫龙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工析显, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人签赃。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓谷异,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锦聊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歹嘹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355