Selenium如何解決ElementNotFound的錯誤? (Wait 的使用情境)

Selenium如何解決ElementNotFound的錯誤?(Wait 的使用情境)

這篇文章主要說明如何解決 Element not Found的錯誤。

自動化測試很有可能因為網站下載的時間、網路時間等影響,

造成網頁上的元件無法在預期的時間內出現,

導致程式錯誤,例如 ElementNot Found、ElementNotVisibleException等錯誤。

這邊提供三個方式可以避免這種狀況。

Implicit Wait

這種方式是比較簡便的方式,設定一段程式會預設等待的時間,例如下面這個例子為 10秒。

因此 selenium會預設等待十秒,如果該網頁元件在超過十秒之後才出現,Exception錯誤才會發生。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds

但是,在某些狀況下,還是會遇到某些特定的網頁元件,在時間內無法正常被截取到,

這時候可以針對該網頁元件做下列處理。

Sleep 特定秒數

在要對該網頁元件做動作前,sleep特定秒數。

import time
time.sleep(5) # delays for 5 seconds

Explicit Wait

最後就是利用 Selenium所提供的功能,對於特定的網頁元件針對特定條件做等待。

例如,等待到該元件出現,或是等待到該元件可以被點擊。

下列例子,等待到該元件可以被點擊。

另外一個常見的就是 visibility_of_element_located 或是  presence_of_element_located。等到元件可以看見或是存在。

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

from selenium.webdriver.support import expected_conditions as EC

...
...
...
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
element = wait.until(EC.visibility_of_element_located((By.ID,'someid')))

[/pastacode]

 

from selenium.webdriver.support import expected_conditions as EC

...
...
...
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
element = wait.until(EC.visibility_of_element_located((By.ID,'someid')))

Implicit Wait 與 Sleep ?

Implicit Wait 就是程式整體的 Timeout 值,如果沒有特別指定,預設為30秒。

也就是說Selenium會等待網頁元件出現,如果30秒後都沒有找到該網頁元件,Selenium就會回傳Exception

Sleep呢? Sleep為程式語言中指定等待幾秒。

例如time.sleep(5) ,程式只要執行到這行就會等待5秒。

PS. 筆者經驗多半的情況下如果 Implicit wait 無法解決,透過稍微長一些的 sleep 多半可以獲得解決

Leave a Reply

Your email address will not be published. Required fields are marked *