在自動測試中如果網頁元件還沒載入完成就進行「模擬點擊」、「取得元件文字」等等的動作,就會出現錯誤,所以我們需要讓程式能夠等待。
常見的等待有三種:
1.無條件等待
這種應該要最少使用,因為「等待」通常是為了讓元件能夠載入完成,但是每個裝置的配置不一定相同,有可能有時候1秒就好了,但是也有可能今天網路比較慢要10秒,所以通常建議使用下面兩種,但是偶爾也有不得不使用的時候。
2.Implicit Wait (隱含等待)
3.Explicit Wait(顯式等待)
下面列出常見的用法:
中間的By.id可以換成By.name,By.xpath,By.cssSelector...等等
還有看一下下面這兩行
這兩行功能基本上是相同的,只是如果有iframe之類的元件或是一直切換視窗通常會出現
stale element reference: element is not attached to the page document錯誤
遇到這種情況只要把頁面刷新就可以解決,但是如果是不能刷新的頁面用上面那行通常就不會出現錯誤(我去爬說明文件發現可能是呼叫同個方法,這只是個人經驗僅供參考)
再來就是滿有用的一個小方法
有的時候可能會遇到你已經檢查完元素存在、元素可見、元素可點擊,可是點下去就還是不行!
經過我的研究發現,檢查這樣還不夠,因為可能後面的Function還沒載入完成,我繼續爬api後發現下面這兩個
所以如果遇到不能點擊的就可以去看按鈕裡面的onClick是呼叫哪個function,檢查完再點擊或是直接呼叫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
上面只有介紹常用的幾個,如果還想了解可以去看官方文件
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com