在 Python 中顯式等待

當瀏覽器導航到動態頁面(最常見的基於 AJAX 的 Web 應用程式)時,頁面上的元素可能需要不同的時間來載入,此外:某些元素只會載入以響應某些使用者操作。在這種情況下,直接檢索元素可能會失敗:

# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q') 

最明顯的解決方案似乎是在檢索元素之前引入等待:

# Don't do this: inefficient solution for ElementNotVisibleException 
time.sleep(5) # delays for 5 seconds  
element = driver.find_element_by_name('q') 

但是這樣的解決方案是低效的,因為它導致測試總是等待 5 秒,即使在大多數情況下元素出現在 1 秒之後(並且有時僅需要長達 5 秒)。如果它只是一個地方,它看起來並不多,但通常每個測試都處理多個元素,並且有多個測試,這總計測試持續時間。

更好的解決方案是等待元素出現最多 5 秒,但是一旦找到元素就從等待返回。WebDriverWait 允許你做到這一點。

以下示例導航到 www.google.com,等待(最多 5 秒鐘)載入搜尋欄,然後搜尋 selenium

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# Create a new chromedriver instance
driver = webdriver.Chrome()

# Go to www.google.com
driver.get("https://www.google.com")

try:
    # Wait as long as required, or maximum of 5 sec for element to appear
    # If successful, retrieves the element
    element = WebDriverWait(driver,5).until(
         EC.presence_of_element_located((By.NAME, "q")))

    # Type "selenium"
    element.send_keys("selenium")
    
    #Type Enter
    element.send_keys(Keys.ENTER)

except TimeoutException:
    print("Failed to load search bar at www.google.com")
finally:
    driver.quit()