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特定秒數。
|
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 多半可以獲得解決