在selenium-webdriver中等待的方式简单可以概括为三种:
1 强制等待,导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间,如:time.sleep(5),表示等待5秒
2 隐式等待,直接调用implicitly_wait()方法,传入等待时间,比如implicitly_wait(10),就代表最长等待10秒
3 显式等待,导入WebDriverWait和expected_conditions包,调用until()者until_not()方法
一、强制等待:time,sleep())
import time sleep(5) #等待5秒
设置固定休眠时间,单位为秒。 由python的time
包提供, 导入 time 包后就可以使用。
缺点:
不智能,使用太多的sleep会影响脚本运行速度。
二、隐式等待:implicitly_wait()
driver.implicitly_wait(10) #隐式等待10秒
由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常。
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。
三、显示等待:WebDriverWait()
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
WebDriverWait与expected_conditions结合使用
expected_conditions
类提供的预期条件判断的方法
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver,10,0.5) element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="") # 此处注意,如果省略message=“”,则By.ID外面是两层()
显示等待,自定义等待条件
#设置等待 wait = WebDriverWait(driver,10,0.5) #使用匿名函数 wait.until(lambda diver:driver.find_element_by_id('kw'))
lambda的使用可另行参考python相关教程