在 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()