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