1、selenium的显式等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception
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://www.baidu')
element = WebDriverWait(driver,5,0.5).util(
EC.presence_of_element_located((By.ID,'kw'))
)
element.send_keys('hello')
driver.quit()
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超过时间,默认以秒为单位
下面两个参数可以省略
poll_frequency:监测的时间间隔,默认为0.5秒
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait一般有until和until_not方法配合使用
until(method,message)
until_not(method ,message)
WebDriverWait(driver, 10):设置了一个10秒上限的等待时间。在指定时间内,一直等待某个条件成立,条件
成立后立即执行定位元素的操作;如果超过这个时间条件仍然没有成立,则会抛出 TimeoutException 异常!
另外,显示等待方法还可以结合lambda函数使用
WebDriverWait(browser, 10, 0.5).until(lambda el: browser.find_element_by_id('captchaimg'))
browser.find_element_by_id('captchaimg').screenshot(picture_name2)
2、隐式等待
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
注意:隐式等待和显示等待都存在时,超时时间取二者中较大的。
from selenium import webdriver
driver = webdriver.Chrome()
# 隐式等待:最长等待10秒钟往下执行
driver.implicitly_wait(10)
driver.get("url")
# 执行定位元素操作
element = driver.find_element_by_id("标签ID")