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
使用。