阅读(2922) (3)

selenium2 显式 waits

2021-06-22 17:17:17 更新

显式的​waits​等待一个确定的条件触发然后才进行更深一步的执行。最糟糕的做法是​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("https://www.zijiebao.com")
try:
    element = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.NAME,"w"))
    )
finally:
    driver.quit()

这段代码会等待10秒,如果10秒内找到元素则立即返回,否则会抛出​TimeoutException​异常,​WebDriverWait​默认每500毫秒调用一下​ExpectedCondition​直到它返回成功为止。​ExpectedCondition​类型是布尔型,成功的返回值就是​true​,其他类型的​ExpectedCondition​成功的返回值就是 ​not null​。

详细的​ExpectedCondition​可以参看  浏览器驱动

预期条件

自动化网页操作时,有许多频繁使用到的通用条件。下面列出的是每一个条件的实现。Selenium + Python 提供了许多方便的方法,因此你不需要自己编写​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 ​- 元素展示并且可用
  • 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')))

expected_conditions​模块包含了一系列预定义的条件来和​WebDriverWait​使用。