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