Selenium三種等待方式的使用

UI自動化測試相嵌,大多都是通過定位頁面元素來模擬實際的生產(chǎn)場景操作腿时。但在編寫自動化測試腳本中,經(jīng)常出現(xiàn)元素定位不到的情況饭宾,究其原因批糟,無非兩種情況:1、有frame捏雌;2跃赚、沒有設(shè)置等待。

因為代碼運行速度和瀏覽器加載渲染速度性湿,不是一個量級纬傲,所以導(dǎo)致了這種情況發(fā)生。在做WEB自動化時肤频,一般要等待頁面元素加載完成后叹括,才能執(zhí)行操作,否則會報找不到元素的錯誤宵荒,這樣就要求我們在有些場景下加等待時間:顯式等待汁雷、隱式等待、強制等待报咳。

一侠讯、顯示等待

定義:等待某個條件成立時繼續(xù)執(zhí)行,否則在達到最大時長時拋出異常(TimeoutException);

WebDriverWait類是由webdriver提供的等待方法暑刃,配合該類提供的until()和until_not()方法一起使用厢漩,就可以根據(jù)判斷條件而靈活進行等待,格式如下:

1 WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

2 driver:瀏覽器驅(qū)動

3 timeout:最長超時時間

4 poll_frequency:檢測間隔時間岩臣,默認0.5s

5 ignored_exceptions:超時后的異常信息溜嗜,默認情況拋出NoSuchElementException異常

6 WebDriverWait()一般由until()或until_not方法配合使用,下面是這兩種方法的說明:

7 until(method,message=''):調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù)架谎,直到返回值為True;

8 until_not(method,message=''):調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù)炸宵,直到返回值為Flase;

示例代碼如下:

1 # coding = utf-8

2 from selenium import webdriver

3 from selenium.webdriver.support.wait import WebDriverWait

4 from selenium.webdriver.support import expected_conditions as EC

5 from selenium.webdriver.common.by import By

6?

7 driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe")

8 driver.implicitly_wait(10)

9 driver.get('http://www.cnblogs.com/imyalost/')

10 locator = (By.LINK_TEXT, '老_張')

11?

12 try:

13? ? WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))

14? ? print(driver.find_element_by_link_text('老_張').get_attribute('href'))

15 finally:

16? ? driver.close()

代碼解析:

本例中,通過as關(guān)鍵字將expected_conditions重命名為EC谷扣,并調(diào)用presence_of_element_located()方法判斷元素是否存在土全;

上面的例子中,同時使用了隱性等待和顯性等待,但是需要注意的是:等待的最長時間取兩者之中的最大值裹匙;

expected_conditions類提供的預(yù)期條件判斷方法如下:

1 title_is: 判斷當(dāng)前頁面的title是否完全等于(==)預(yù)期字符串野哭,返回布爾值

?2 title_contains : 判斷當(dāng)前頁面的title是否包含預(yù)期字符串,返回布爾值?

3 presence_of_element_located : 判斷某個元素是否被加到了dom樹里幻件,并不代表該元素一定可見

?4 visibility_of_element_located : 判斷某個元素是否可見. 可見代表元素非隱藏,并且元素的寬和高都不等于0?

5 visibility_of : 跟上面的方法做一樣的事情蛔溃,只是上面的方法要傳入locator绰沥,這個方法直接傳定位到的element就好了

?6 presence_of_all_elements_located : 判斷是否至少有1個元素存在于dom樹中。舉個例子贺待,如果頁面上有n個元素的class都是‘column-md-3‘徽曲,那么只要有1個元素存在,這個方法就返回True?

7 text_to_be_present_in_element : 判斷某個元素中的text是否 包含 了預(yù)期的字符串?

8 text_to_be_present_in_element_value : 判斷某個元素中的value屬性是否 包含 了預(yù)期的字符串?

9 frame_to_be_available_and_switch_to_it : 判斷該frame是否可以switch進去麸塞,如果可以的話秃臣,返回True并且switch進去,否則返回False

10 invisibility_of_element_located : 判斷某個元素中是否不存在于dom樹或不可見

11 element_to_be_clickable : 判斷某個元素中是否可見并且是enable的哪工,這樣的話才叫clickable

12 staleness_of : 等某個元素從dom樹中移除奥此,注意,這個方法也是返回True或False

13 element_to_be_selected : 判斷某個元素是否被選中了,一般用在下拉列表

14 element_selection_state_to_be : 判斷某個元素的選中狀態(tài)是否符合預(yù)期

15 element_located_selection_state_to_be : 跟上面的方法作用一樣雁比,只是上面的方法傳入定位到的element稚虎,而這個方法傳入locator

16 alert_is_present : 判斷頁面上是否存在alert

二、隱式等待

定義:通過設(shè)定的時長等待頁面元素加載完成偎捎,再執(zhí)行下面的代碼蠢终,如果超過設(shè)定時間還未加載完成,則繼續(xù)執(zhí)行下面的代碼(注意:在設(shè)定時間內(nèi)加載完成則立即執(zhí)行下面的代碼)茴她;

隱式等待的方法為:implicitly_wait寻拂,示例代碼如下:

1 # coding = utf-8

2 from selenium import webdriver

3?

4 driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe")

5 driver.implicitly_wait(10) # 隱性等待,最長等10秒

6 driver.get('http://www.cnblogs.com/imyalost/')

7?

8 print(driver.current_url)

9 driver.quit()

代碼解析:

本例中丈牢,設(shè)置的等待時長為10秒祭钉,但這10秒并非一個固定時間,并不影響腳本執(zhí)行速度赡麦;其次朴皆,隱式等待對整個driver的周期都起作用,因此只需要設(shè)置一次即可泛粹。

三遂铡、強制等待

即sleep()方法,由python中的time模塊提供晶姊,強制讓代碼等待xxx時間扒接,無論前面的代碼是否執(zhí)行完成或者還未完成,都必須等待設(shè)定的時間。

示例代碼如下:

1 # coding = utf-8

2 from selenium import webdriver

3 from time import sleep

4?

5 driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe")

6 driver.get('http://www.cnblogs.com/imyalost/')

7

8 sleep(5)

9?

10 print(driver.current_url)

11 driver.quit()

代碼解析:

本例中钾怔,設(shè)置強制等待時間為5秒碱呼,5秒之后,打印獲取到的當(dāng)前頁面的url宗侦,然后關(guān)閉窗口愚臀。這種強制等待的方法,在debug時候很有用矾利,不過建議慎用這種方法姑裂,因為太死板,嚴重影響程序執(zhí)行速度男旗!

以上三種等待方法舶斧,在具體的場景中需要根據(jù)情況選擇合適的方法,靈活運用如果對軟件測試察皇、接口測試茴厉、自動化測試、面試經(jīng)驗交流什荣。感興趣可以加軟件測試交流:829792258矾缓,還會有同行一起技術(shù)交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稻爬,一起剝皮案震驚了整個濱河市而账,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌因篇,老刑警劉巖泞辐,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竞滓,居然都是意外死亡咐吼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門商佑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锯茄,“玉大人,你說我怎么就攤上這事茶没〖∮模” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵抓半,是天一觀的道長喂急。 經(jīng)常有香客問我,道長笛求,這世上最難降的妖魔是什么廊移? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任糕簿,我火速辦了婚禮,結(jié)果婚禮上狡孔,老公的妹妹穿的比我還像新娘懂诗。我一直安慰自己,他們只是感情好苗膝,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布殃恒。 她就那樣靜靜地躺著,像睡著了一般辱揭。 火紅的嫁衣襯著肌膚如雪芋类。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天界阁,我揣著相機與錄音,去河邊找鬼胖喳。 笑死泡躯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丽焊。 我是一名探鬼主播较剃,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼技健!你這毒婦竟也來了写穴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雌贱,失蹤者是張志新(化名)和其女友劉穎啊送,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣孤,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡馋没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了降传。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷朵。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婆排,靈堂內(nèi)的尸體忽然破棺而出声旺,到底是詐尸還是另有隱情,我是刑警寧澤段只,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布腮猖,位于F島的核電站,受9級特大地震影響赞枕,放射性物質(zhì)發(fā)生泄漏缚够。R本人自食惡果不足惜幔妨,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谍椅。 院中可真熱鬧误堡,春花似錦、人聲如沸雏吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖们。三九已至悉抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摘完,已是汗流浹背姥饰。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孝治,地道東北人列粪。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像谈飒,于是被迫代替她去往敵國和親岂座。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354