selenium2 显式 waits
显式的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.w3cschool.cn")
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使用。