Java Selenium 三種等待方式(外加等待function成功執行、元素存在、可見、可點)

在自動測試中如果網頁元件還沒載入完成就進行「模擬點擊」、「取得元件文字」等等的動作,就會出現錯誤,所以我們需要讓程式能夠等待。

常見的等待有三種:
1.無條件等待
Thread.sleep(3000);//發呆三秒

這種應該要最少使用,因為「等待」通常是為了讓元件能夠載入完成,但是每個裝置的配置不一定相同,有可能有時候1秒就好了,但是也有可能今天網路比較慢要10秒,所以通常建議使用下面兩種,但是偶爾也有不得不使用的時候。

2.Implicit Wait (隱含等待)

driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
//等待腳本執行完成

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
//等待頁面載入完成
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
//等待元素存在

3.Explicit Wait(顯式等待)
下面列出常見的用法:

WebDriverWait wait = new WebDriverWait(driver, 5);//最多等5秒
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("btn1")));
//等待id為btn1的元素存在
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("btn1")));
//等待id為btn1的元素可見
wait.until(ExpectedConditions.elementToBeClickable(By.id("btn1")));
//等待id為btn1的元素可點擊
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("btn1")));
//等待id為btn1的元素隱形

中間的By.id可以換成By.name,By.xpath,By.cssSelector...等等

還有看一下下面這兩行


wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("btn1")));
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("btn1"))));
//等待id為btn1的元素可見

這兩行功能基本上是相同的,只是如果有iframe之類的元件或是一直切換視窗通常會出現
stale element reference: element is not attached to the page document錯誤
遇到這種情況只要把頁面刷新就可以解決,但是如果是不能刷新的頁面用上面那行通常就不會出現錯誤(我去爬說明文件發現可能是呼叫同個方法,這只是個人經驗僅供參考)

再來就是滿有用的一個小方法
有的時候可能會遇到你已經檢查完元素存在、元素可見、元素可點擊,可是點下去就還是不行!
經過我的研究發現,檢查這樣還不夠,因為可能後面的Function還沒載入完成,我繼續爬api後發現下面這兩個


等待function成功執行
wait.until(ExpectedConditions.javaScriptThrowsNoExceptions("checkCheckBoxState()"));
//一但執行JavaScript而沒有錯誤,則回傳true
wait.until(ExpectedConditions.jsReturnsValue("checkCheckBoxState()"));
//一但js返回字符串,則回傳true

所以如果遇到不能點擊的就可以去看按鈕裡面的onClick是呼叫哪個function,檢查完再點擊或是直接呼叫function

上面只有介紹常用的幾個,如果還想了解可以去看官方文件



留言