Implicit Wait 與 Explicit Wait 的區別

自動化測試時常會遇到需要 等待 元件出現,而自動化常被使用到的工具,Selenium 內等待元件出現的方式分成 3 種,Implicit Wait, Explicit Wait 及 Fluent Wait,其中最常被使用到的是 Implicit Wait 與 Explicit Wait,本篇文章會著重在比較 Implicit Wait 與 Explicit Wait 的差異上。

Implicit Wait (隱含等待)

用法

Selenium 的 Implicit Wait 概念是從 Watir (Web Application Testing in Ruby) 而來,Implicit Wait 只需要在測試開始前宣告一次 n 秒 (Selenium 的 Implicit Wait 預設值為 0 秒),在整個測試開始到結束,每次執行到尋找元件指令 (find_element) 時,宣告的 n 秒內沒接收到元件出現的消息會丟出 NoSuchElementException,必須注意的是,Implicit Wait 在受測瀏覽器開啟的狀態都會運作。

Python 實例

將 Implicit Wait 設定為 3 秒,因此在 find_element 時,如果 3 秒內提早在頁面找到元件的存在就 return 該元件,沒有找到元件則 3 秒 timeout 時間到了之後丟 NoSuchElementException。

Webdriver driver = webdriver.Chrome
driver.implicitly_wait(3)

driver.get(“http://url_you_are_testing”)
self.driver.find_element_by_id(‘element_that_delays_to_show’)

優點

  1. 大幅省下編寫元件的等待時間:只要在測試開始前宣告一次 timeout 時間,就可以套用到整個測試上。

缺點

  1. 由 Remote 端操控,導致無法預期錯誤訊息:Implicit Wait 是由 selenium remote 端操控,而錯誤訊息由 OS, 瀏覽器 與 Selenium 的版本決定,這會導致使用 implicit wait 時,結果可能無法預期。詳細資訊可以參考 StackOverflow 討論
  2. 僅限使用在 find elements:Implicit Wait 僅會在 find_element 時檢查元件是否有存在 於 DOM (Document Object Model) 內,若是要進階檢查元件的屬性是否 clickable, visible 等等,則無法達成。
  3. 無法為特殊的元件客製化等待時間:由於 timeout 時間統一都為 n 秒,為了某些元件需要特別長的等待時間,Implicit Wait 的 timeout 可能因此被設定的很長,有些非預期的元件顯示時間可能容易被忽略。
  4. 模糊且沒有實際定義的行為:從實務角度來看,通常會使用 Implicit Wait,除了方便之外,也可能是因為該元件在產品的行為定義模糊,不確定該元件最長需要等待幾秒,才會採用 Implicit Wait。

Explicit Wait (明確等待)

用法

Explicit Wait 顧名思義必須等待元件滿足自己寫的明確條件,才會做接下來的動作,如果設定的 timeout 時間到,條件還是沒有被滿足,就會丟出 TimeoutException。不像 Implicit Wait 僅能等待直到頁面存在元件,Explicit Wait 可以用來做一些更精確的等待判斷,像是等待元件狀態為 clickable, visible, invisible 等等。

Python 實例

將 timeout 時間設定為 10 秒,10 秒內如果該元件可以點擊的話,就會 return 該元件,10 秒內找不到可以點擊的該元件,則丟 TimeoutException。
使用 WebDriverWait 可以結合 selenium support library 內建的 expected_conditions 來控制等待的條件。

element = WebDriverWait(self.driver, 10).until(
expected_conditions.element_to_be_clickable((By.ID,”element_waits_to_be_clickable”))
)

優點

  1. 測試 script 實作 Wait,讓測試可控性高:Explicit Wait 為測試 script 實作,是由 Local 端控制,因此可以預期結果,讓測試可控性更高。
  2. 有精確的等待行為,讓測試可控性高:使用 Explicit Wait 一定會有精確的等待條件與時間,讓整體測試可控性更高,不會像 Implicit Wait,可能會有非預期等待行為,但無法被揭露出來。
  3. 能夠客製化,並實作任何想要的等待條件:不像 Implicit Wait 僅能使用於 find elements 的等待,Explicit Wait 可以等待元件 visible, invisible, clickable…,幾乎所有想得到的等待方式都可以實作,因此可以根據每個元件不同的特性及 SPEC 客製化等待條件。
  4. 能夠客製化處理各個元件的 Exception:由於 Explicit Wait 在使用上,必須每個元件都宣告一次等待條件,因此可以根據每個元件不同的特性及 SPEC 客製化 Exception 處理。

缺點

  1. 實作比 Implicit Wait 麻煩:Explicit Wait 必須在每次等待元件時,宣告該元件的等待條件與 timeout 時間,相較 Implicit Wait 只需要在測試一開始宣告一次,會麻煩很多。

Q & A

Q1. Implicit Wait 和 Explicit Wait,到底用哪一個實作等待會比較好呢?

A1. 推薦使用 Explicit Wait。

雖然 Implicit Wait 方便,但使用上有侷限太多,如同上頭 Implicit Wait 提到的缺點。
相較之下,Explicit Wait 除了可以做到 Implicit Wait 可以做到的事情,還可以做明確的條件等待,針對元件做客製化的等待,使測試更有效率。

Q2. Implicit Wait 實在太方便了,每次元件等待都用 Explicit Wait 很麻煩,可以混用 Implicit Wait 和 Explicit Wait 嗎?

A2. 不建議這麼做。

Selenium 官方在文件上提到混用 Implicit Wait 和 Explicit Wait 可能會導致非預期的等待時間,可以參考 StackOverflow 討論,有詳細的解釋混用可能會發生的問題。
如上述,雖然 Explicit Wait 使用起來比較囉唆,但可以確保等待條件都是精確的,避開模糊的定義。


參考資料

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s