Selenium Web Driver自動(dòng)化測試(java版)系列下半部分(23) - 隱式等待和顯示等待

這篇文章討論等待和同步的問題。過去我舉例子總是用java自帶的線程類Thread調(diào)用靜態(tài)方法sleep()來讓程序等待一會(huì)兒,目的是給網(wǎng)頁足夠的時(shí)間刷新或顯示下一個(gè)要操作的元素涮母,否則有可能元素還沒顯示出來呢但代碼已經(jīng)開始定位了挟冠。

但是,這種方式有個(gè)缺點(diǎn)巩梢,如果你代碼中需要等待的情況很多创泄,那你需要在每一個(gè)有可能出危險(xiǎn)的步驟后面寫上這句,比如你寫一個(gè)網(wǎng)上購物代碼:

而且有時(shí)候會(huì)浪費(fèi)很多沒必要等待的時(shí)間括蝠,因?yàn)椴还茉趺礃右欢〞?huì)等一個(gè)固定的時(shí)間鞠抑。比如你給它定10秒,萬一控件在上一步程序執(zhí)行后就馬上出現(xiàn)了呢忌警?那也得等10秒搁拙,沒商量,沒明白的朋友一會(huì)兒通過演示就知道了法绵。其實(shí)Thread類中還有一個(gè)方法叫wait()箕速,也是用來等待的。wait()和sleep()這兩者都屬線程類方法朋譬,控制有限盐茎,被稱為無條件同步。鑒于無條件同步的缺陷徙赢,selenium的開發(fā)人員特別設(shè)計(jì)了一個(gè)有條件同步庭呜,功能要更強(qiáng)大一些,可以更好地完成同步工作犀忱。有條件同步分隱式等待(Implicit Wait)和顯示等待(Explicit Wait)募谎。

首先是隱式等待,代碼是:

implicitlyWait()這個(gè)方法接受兩個(gè)參數(shù)阴汇,第一個(gè)是等待時(shí)間數(shù)值数冬,用整型表示;第二個(gè)是時(shí)間單位,用java中的TimeUnit類調(diào)用一些枚舉常量表示拐纱。這些枚舉常量包括時(shí)(HOURS)/分(MINUTES)/秒(SECONDS)等等铜异,調(diào)用的格式是TimeUnit.HOURS/TimeUnit.MINUTES/TimeUnit.SECONDS。這些其實(shí)java api里都寫了秸架,大家可以去看揍庄。有隱式等待參與的代碼執(zhí)行情況如下:每當(dāng)程序要找某一個(gè)或某一組元素時(shí),首先先檢查元素在不在东抹,如果在則不用執(zhí)行隱式等待語句蚂子;如果不在,先不報(bào)異常缭黔,而是等待一段給定的時(shí)間食茎,之后再次尋找,還不在則拋異常馏谨。舉個(gè)例子别渔,如果我想給它設(shè)置等待10秒,那我的代碼可以寫成:

假如我的程序里這時(shí)要找一個(gè)登錄按鈕惧互。執(zhí)行過程就是先找這個(gè)按鈕哎媚,如果沒找到不馬上拋異常,而是等10秒再檢查喊儡,再?zèng)]找到才報(bào)異常拨与。再強(qiáng)調(diào)一遍,它只作用于尋找某個(gè)或某組元素的時(shí)候管宵。大家或許已經(jīng)猜到了,也就是說攀甚,隱式等待只在findElement()和findElements()執(zhí)行時(shí)才有可能執(zhí)行箩朴。

如果你的程序里有好幾步關(guān)于尋找的代碼也沒關(guān)系,隱式等待讓所有的元素都必須按照同一種設(shè)置執(zhí)行秋度,這樣寫一遍就夠了炸庞,免去了在危險(xiǎn)步驟后都寫的麻煩。按慣例把它寫在創(chuàng)建driver之后和打開網(wǎng)頁之前:

雖然只寫一遍荚斯,但它的生命周期卻延續(xù)至整個(gè)程序執(zhí)行完畢的時(shí)候〔壕樱現(xiàn)在用示例網(wǎng)站hrsystem舉個(gè)完整的例子。我的測試步驟如下:

1. 打開網(wǎng)頁事期;
2. 輸入用戶名和密碼滥壕;
3. 點(diǎn)擊登錄按鈕;
4. 點(diǎn)擊Employee菜單兽泣;
5. 點(diǎn)擊Timesheet菜單绎橘;
6. 退出。

因?yàn)槠年P(guān)系我就不斷言了唠倦,只寫步驟称鳞。用隱式等待的寫法如下:

findElement()占了6步涮较,可隱式等待的代碼只寫了一遍。雖然只是一遍冈止,可這6步每次執(zhí)行的時(shí)候如果當(dāng)時(shí)定位不到要找的元素都會(huì)執(zhí)行一下這句狂票。但這已經(jīng)很省時(shí)間了,你執(zhí)行一下很可能就會(huì)發(fā)現(xiàn)好幾個(gè)元素出現(xiàn)時(shí)間很快熙暴,根本不用等待闺属。但如果要用無條件同步的話,你不確定哪步需要等待怨咪,只好在每步后面都寫上等待屋剑,既麻煩又浪費(fèi)時(shí)間。

有隱式就有顯式诗眨,第二種顯式等待要比隱式更高級(jí)一點(diǎn)唉匾。隱式等待只用寫一遍,由每個(gè)尋找元素的步驟共享匠楚,這本來是優(yōu)點(diǎn)巍膘,但現(xiàn)在假如是大多數(shù)元素都不用等多久,只有一個(gè)元素需要等待很長時(shí)間呢芋簿?這種情況特別討厭峡懈,但特容易遇到。只能再判斷得精確點(diǎn)了与斤。顯式等待就提供了很多種判斷方式:

這些判斷方式都是為了檢查能不能結(jié)束等待的條件肪康。顯式等待的語法如下:

第一句是初始化WebDriverWait這個(gè)類,同時(shí)設(shè)置一個(gè)等待時(shí)間撩穿。與隱式等待不一樣的是這個(gè)等待時(shí)間只能是秒磷支,不能表示小時(shí)/分鐘/毫秒等其它單位。第二句用WebDriverWait的對(duì)象調(diào)用until()方法食寡,里面接受一個(gè)參數(shù)雾狈,就是能不能結(jié)束等待的條件,ExpectedConditions就是"期望條件"的意思抵皱。我選了其中一個(gè)判斷方式visibilityOfElementLocated善榛,意思是只要被找的元素出現(xiàn)就停止等待。算上前面給的10秒呻畸,這兩句代碼的意思就是在這10秒內(nèi)不停地檢查移盆,只要元素出現(xiàn)就繼續(xù)執(zhí)行,不用非要等完這10秒伤为。如果10秒過后還不出現(xiàn)則拋異常味滞。又看出一點(diǎn)比隱式等待強(qiáng)的地方了吧?這10秒不用等完,而是只要滿足條件就繼續(xù)剑鞍,完全是動(dòng)態(tài)控制昨凡。如果要是隱式雖然有時(shí)沒必要等,可一旦真的開始等了蚁署,那也必須把給定的等待時(shí)間耗完才能繼續(xù)便脊。

當(dāng)然,顯式等待只用在耗時(shí)長的元素尋找過程中光戈,別的元素還可以使用統(tǒng)一的隱式等待哪痰。還用剛才那個(gè)test case,假如Employee菜單出來得比較慢久妆,我需要設(shè)置一個(gè)顯式等待晌杰。我把程序改一下:

我只覺得登錄時(shí)會(huì)花點(diǎn)時(shí)間,有可能會(huì)影響到下一步筷弦,所以我只在點(diǎn)擊登錄按鈕之后加上了顯式等待肋演。其他步驟還依然用隱式。大家有時(shí)間可以再用另外幾種判斷方式當(dāng)作條件試一試烂琴。

有條件同步的功能比無條件同步更強(qiáng)大爹殊,感覺也更科學(xué)。以后大家寫項(xiàng)目時(shí)可以扔掉Thread.sleep()了奸绷,改用ImplicitlyWait或ExpectedConditions梗夸。

這篇源代碼在SeleniumImplicitWaitSeleniumExplicitWait這兩個(gè)小項(xiàng)目中。

本篇知識(shí)點(diǎn)及注意事項(xiàng):

1.有隱式等待參與的代碼執(zhí)行情況如下:每當(dāng)程序要找某一個(gè)或某一組元素時(shí)号醉,首先先檢查元素在不在反症,如果在則不用執(zhí)行隱式等待語句;如果不在畔派,先不報(bào)異常铅碍,而是等待一段給定的時(shí)間,之后再次尋找父虑,還不在則拋異常该酗。隱式等待只在findElement()和findElements()執(zhí)行時(shí)才有可能執(zhí)行授药。
2.隱式等待寫在創(chuàng)建driver之后和打開網(wǎng)頁之前士嚎,其生命周期延續(xù)至整個(gè)程序執(zhí)行完畢的時(shí)候。
3.顯式等待通過用某種判斷方式設(shè)置條件這種方法來實(shí)現(xiàn)悔叽,意思是在一段給定的時(shí)間內(nèi)不停檢查條件是否滿足莱衩,一旦滿足則停止等待繼續(xù)執(zhí)行后邊的程序。超過這段時(shí)間還沒找到則拋異常娇澎。
4.顯式等待比隱式強(qiáng)大的地方有兩點(diǎn) - 1.可以對(duì)某些需要很長時(shí)間等待的元素額外設(shè)置等待時(shí)間笨蚁;2.顯式等待在給定時(shí)間內(nèi)一直在檢查條件是否滿足,只要滿足條件就停止等待繼續(xù)執(zhí)行后面代碼,完全是動(dòng)態(tài)控制括细。隱式雖然有時(shí)沒必要等伪很,可一旦真的開始等了,那也必須把給定的等待時(shí)間耗完才能繼續(xù)奋单。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锉试,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子览濒,更是在濱河造成了極大的恐慌呆盖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贷笛,死亡現(xiàn)場離奇詭異应又,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乏苦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門株扛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邑贴,你說我怎么就攤上這事席里。” “怎么了拢驾?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奖磁,是天一觀的道長。 經(jīng)常有香客問我繁疤,道長咖为,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任稠腊,我火速辦了婚禮躁染,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘架忌。我一直安慰自己吞彤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布叹放。 她就那樣靜靜地躺著饰恕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪井仰。 梳的紋絲不亂的頭發(fā)上埋嵌,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音俱恶,去河邊找鬼雹嗦。 笑死范舀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的了罪。 我是一名探鬼主播锭环,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泊藕!你這毒婦竟也來了田藐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吱七,失蹤者是張志新(化名)和其女友劉穎汽久,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踊餐,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡景醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吝岭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片三痰。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窜管,靈堂內(nèi)的尸體忽然破棺而出散劫,到底是詐尸還是另有隱情,我是刑警寧澤幕帆,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布获搏,位于F島的核電站,受9級(jí)特大地震影響失乾,放射性物質(zhì)發(fā)生泄漏常熙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一碱茁、第九天 我趴在偏房一處隱蔽的房頂上張望裸卫。 院中可真熱鬧,春花似錦纽竣、人聲如沸墓贿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聋袋。三九已至,卻和暖如春语盈,著一層夾襖步出監(jiān)牢的瞬間舱馅,已是汗流浹背缰泡。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工刀荒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留代嗤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓缠借,卻偏偏與公主長得像干毅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泼返,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 這篇文章我們討論線程硝逢,因?yàn)樗锩娴囊恍┓椒ㄔ谧詣?dòng)化測試?yán)镆彩呛艹S玫摹4蠹一蛟S都聽說過進(jìn)程(process)绅喉,我之...
    馬可吃菠蘿閱讀 538評(píng)論 0 0
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,405評(píng)論 8 265
  • 哎渠鸽,終于要下班了。美心里剛這樣想到柴罐,就被身旁的同事拍拍肩膀徽缚。“小美革屠,主管叫你去辦公室一趟凿试,你趕緊的”,同事C...
    RED駱駝刺閱讀 209評(píng)論 1 1
  • 曾經(jīng),我們都寫過日記党瓮,或是完成學(xué)生時(shí)代老師布置的作業(yè)详炬,或是記錄青春時(shí)期內(nèi)心的秘密,或是工作后整理的工作總結(jié)及感悟寞奸,...
    芬芬_Hu閱讀 1,020評(píng)論 3 7
  • 我在2017年10月16日訂閱了劉潤5分鐘商學(xué)院第二季痕寓, 做自己的ceo蝇闭,一切行為背后都存在商業(yè)邏輯呻率。 這些概念讓...
    德羅巴007_592閱讀 912評(píng)論 3 14