【轉(zhuǎn)】Selenium中的幾種等待方式,需特別注意implicitlyWait的

最近在項目過程中使用selenium 判斷元素是否存在的時候 遇到一個很坑爹的問題, 用以下方法執(zhí)行的時候每次都會等待很長一段時間,原因是因為對selenium實現(xiàn)方法了解不足導致一直找不到解決方法。

privateboolean isElementPresent(By by) {

? ? try {

? ? ? driver.findElement(by);

? ? ? returntrue;

? ? } catch (NoSuchElementException e) {

? ? ? returnfalse;

? ? }

}

不明所以,

經(jīng)過追蹤源碼才發(fā)現(xiàn)啟動Driver的時候?使用driver.manage().timeouts().implicitlyWait(30,

TimeUnit.SECONDS); 此處設(shè)置的等待時間 是針對全局設(shè)置的,webdriver中執(zhí)行所有命令 的超時時間都設(shè)置為30秒了,

如上面的findElement方法,找不到元素會默認等待三十秒。? 有些時候只需簡單判斷元素是否存在,立馬執(zhí)行,而此處的設(shè)置導致

腳本執(zhí)行緩慢。? 將Selenium中的等待時間貼出來給大家張張經(jīng)驗。

Selenium的延遲等待分為 顯式等待(Explicit Wait) & 隱式等待(Implicit Wait).

1.顯式等待

顯式等待,就是明確的要等到某個元素的出現(xiàn)或者是某個元素的可點擊等條件,等不到,就一直等,除非在規(guī)定的時間之內(nèi)都沒找到,那么就跳出Exception.如:

newWebDriverWait(driver,15).until(? ? ? ?

? ? ? ? ? ? ? ? ? ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator")));

這里,15是要等待的秒數(shù).如果沒有滿足until()方法中的條件,就會始終在這里wait 15秒,依然找不到,就拋出異常.

也可以這樣寫:

WebDriver driver =new FirefoxDriver();

? ? driver.get(www.baidu.com);

? ? WebElement e = (newWebDriverWait( driver,10)) .until(

? ? ? ? newExpectedCondition< WebElement>(){

? ? ? ? ? ? @Override

? ? ? ? ? ? public WebElement apply( WebDriver d) {

? ? ? ? ? ? ? ? returndriver.findElement( By.id("id locator"));

? ? ? ? ? ? }

? ? ? ? }

這樣就通過回調(diào)函數(shù),直接獲得了這個WebElement.也就是頁面元素.

如果只是僅僅想判斷頁面是不是加載到某個地方了,就可以用第一種方法; 但如果需要得到某個WebElement,兩種方式都可以,只是第一種方式還需要再多一步獲取的操作.

Wait w =newWait(){

? ? ? ? @Override

? ? ? ? publicbooleanuntil() {

? ? ? ? ? ? returnwebElement.isDisplayed();

? ? ? ? }

另外這種等待的方式,在加載js代碼的時候做判斷會比較方便,反正我只在代碼里這么見過,但是沒用過,有興趣的朋友可以研究一下.

2.隱式等待

driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);

隱式等待, 此處的隱式等待是針對Driver 每次執(zhí)行命令的 最長執(zhí)行時間也可以理解為超時時間,?

一些人對此處有誤解,認為是讓Driver等一段時間,? 確實某些時候能讓Driver等一段時間, 但是影響是全局的,每次Driver執(zhí)行

找不到元素都會等待此處設(shè)置的時間,?

假設(shè)某處將此值設(shè)置的太長,必須在執(zhí)行完成之后還原回來,否則判斷一個元素是否存在的時候,就會遇到很坑爹的問題。?? 改進后的方法如下:

WebDriver會進行一個隱式等待,但參數(shù)只有時間,這就導致我需要什么元素出現(xiàn),我不一定能等到它,

privateboolean isElementPresent(By by) {

? ? try {

? ? ? driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

? ? ? driver.findElement(by);

? ? ? returntrue;

? ? } catch (NoSuchElementException e) {

? ? ? returnfalse;

? ? }

? }

得不到某個元素,我們就延遲一下...

3.線程休眠

Thread.sleep()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容