一、等待

目前大多数网络应用都在使用AJAX技术。当浏览器加载一个页面,页面上的元素可能分多次进行加载。这会导致元素定位困难,如果元素没有在DOM中出现,则会触发ElementNotVisibleException异常。通过等待,我们可以解决这个问题。等待提供了设置操作间的时间间隔-元素定位直接或其他元素操作。

Selenium Webdriver 提供了等待的两种类型,implicit和explicit。显式等待是使webdriver在操作之间有确定的时间等待。隐式等待是使WebDriver 去间隔的轮询DOM,尝试定位到元素。

1.显式等待

显式等待是代码中定义一定的条件,等待条件达成,继续执行。最差的方式是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()

示例代码,默认等待10s或则在10s内找到元素,否则触发TimeoutException异常。默认情况下,WebDriverWait等待500ms就会触发异常,直到成功返回元素.ExpectedCondition成功的返回值是布尔值true或非空代表其他值的异常类型。

2.预期条件

以下列举了浏览器自动化测试常用的条件。Python&selenium提供了一些便利方法,所以不必自己编写一个expected_condition类或为他们创建自己的工具包。

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable-it is Displayed and Enabled
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

    from selenium.webdriver.support import expected_conditions as EC

    wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable(By.ID, 'someid')))

该预期条件模块包含了通过WebDriverWait实现的预期条件。

3.隐式等待

隐式等待让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")

Top^

上一篇Selenium主题4 下一篇Selenium主题6

by 李鹏