本文集连接:https://www.jianshu.com/nb/25338984web
ajax
可是,因为ajax和各类JS代码的异步加载问题,因此咱们在使用selenium的时候经常会遇到操做的元素尚未加载出来,就会引起报错。为了解决这个问题,Selenium
提供了几种等待的方法,让咱们能够等待元素加载完毕后,再进行操做。浏览器
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.Chrome()
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()
在这个例子中,咱们在查找一个元素的时候,再也不使用find_element_by_*
这样的方式来查找元素,而是使用了WebDriverWait
。dom
try代码块中的代码的意思是:在抛出元素不存在异常以前,最多等待10秒。在这10秒中,WebDriverWait
会默认每500ms运行一次until之中的内容,而until中的EC.presence_of_element_located
则是检查元素是否已经被加载,检查的元素则经过By.ID
这样的方式来进行查找。异步
就是说,在10秒内,默认每0.5秒检查一次元素是否存在,存在则将元素赋值给element这个变量。若是超过10秒这个元素仍不存在,则抛出超时异常。ui
Expected Conditions
这个类提供了不少种常见的检查条件能够供咱们使用。url
title_isspa
title_containscode
presence_of_element_locatedci
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')))
隐式等待指的是,在webdriver
中进行find_element
这一类查找操做时,若是找不到元素,则会默认的轮询等待一段时间。
这个值默认是0,能够经过如下方式进行设置:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 单位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")