如今,大多数Web应用程序都在使用AJAX技术。当浏览器加载页面时,该页面中的元素可能会以不同的时间间隔加载。这使查找元素变得困难:如果DOM中尚不存在元素,则定位函数将引发ElementNotVisibleException异常。使用等待,我们可以解决此问题。等待使执行的动作之间有些松懈-主要是定位元素或对该元素进行的任何其他操作。
Selenium Webdriver提供两种类型的等待-隐式和显式。显式等待使WebDriver等待特定条件发生,然后再继续执行。隐式等待使WebDriver在尝试查找元素时轮询DOM一定时间。
显示等待
显式等待是您定义的代码,用于在继续执行代码之前先等待特定条件发生。极端的情况是time.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法,可以帮助您编写仅等待所需时间的代码。WebDriverWait与ExpectedCondition结合是实现此目的的一种方法。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
除非找到在10秒内返回的元素,否则它最多等待10秒才抛出TimeoutException。默认情况下,WebDriverWait每500毫秒调用ExpectedCondition,直到成功返回。对于ExpectedCondition类型,成功返回是Boolean返回true,对于所有其他ExpectedCondition类型,返回值不为null。
隐等待
隐式等待告诉WebDriver在尝试查找不立即可用的一个或多个元素时,在一定时间内轮询DOM。默认设置为0。设置后,将在WebDriver对象的生存期内设置隐式等待。
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")