由于网络等原因,页面的加载速度远远低于代码的执行速度导致元素定位失败。当页面元素定位失败时,在指定时间内一直等待的过程叫做元素等待。元素等待有强制等待、隐式等待、显示等待三种。
一、强制等待
方法:sleep()
不管元素是否定位成功,都必须等待指定时长,只有等待时间结束,才可以继续执行后面的代码。示例time.sleep(3)
二、隐式等待
当第一个元素定位失败,在指定时间内等待成功了就继续执行后面的代码,如果等待时间结束还未成功,就抛出找不到元素的异常NosuchElementException
方法:driver.implicitly_wait(sec) 单位是秒,一般等待30s
注意:显式等待对于当前脚本中所有元素全部有效
三、显示等待
如果等待成功就继续执行,如果时间结束仍未等待成功则抛出异常TimeoutException 超时异常。在WebDriver中把显式等待的相关方法封装在WebDriverWait类中。判断元素是否等待成功的相关方法封装在在expected_conditions类中。
(1)实例化等待类:WebDriverWait(driver, timeout, poll_frequency=0.5)
driver:浏览器对象
timeout:超时的时长,单位:秒
poll_frequency:检测间隔时间,默认为0.5秒
(2)判断元素是否定位成功的方法
until(method) 直到……时候
method:expected_conditions.presence_of_element_located(element)
element:By类定位的元素
注意:By类定位语句构成的元组整体作为参数
显式等待只针对当前一个元素有效
示例:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
# 实例化等待类
wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5)
# 显示等待判断搜索框是否存在,如果存在输入搜索内容
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#kw"))).send_keys("lilgaage")
driver.find_element_by_id('su').click()
wait = WebDriverWait(driver, 10.0)
sleep(3)
driver.quit()
四、元素等待小结
- 只有第一次元素定位失败,才会触发显式等待或隐式等待
- 方法不同:强制等待就是time.sleep();显式等待封装在WebdriverWait类中,需要导包及对应方法判断元素是否定位成功;隐式等待implicitly_wait()直接通过浏览器对象调用即可。
- 作用域不同:强制等待只针对所处的位置起作用,显式等待针对单个元素有效,饮食等待对当前脚本设计的元素全部有效。
- 抛出异常不同:强制等待必须等待结束才可以执行,无异常;显式等待失败抛出timeoutExeption;隐式等待失败抛出NoSuchElementException。