一、强制等待:sleep()
设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。
缺点:不智能,使用太多的sleep会影响脚本运行速度。
使用方法:time.sleep(delay)
使用举例:打开百度,强制等待5秒
#导入强制等待模块import time
from selenium import webdriver
wd = webdriver.Chrome()
wd.get('https://www.baidu.com')#强制等待5秒
time.sleep(5)
二、隐式等待:implicitly_wait()
(无条件等待,在一个时间段内等待)
一次设置,全局生效。
不要当作固定等待使用,不要每次需要等待时都写一次隐式等待。
它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常。
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。
使用方法:implicitly_wait(delay),delay的单位为秒
使用举例:打开www.qq.com,等待页面加载完成后,点击新闻链接
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome()
wd.get('http://www.qq.com')
wd.implicitly_wait(10)
wd.find_element(By.CSS_SELECTOR,'[href="http://news.qq.com/"]').click()
三、显式等待:WebDriverWait()
(有条件等待)
当等待的条件满足后(一般用来判断需要等待的元素是否加载出来),就继续下一步操作。等不到就一直等,如果在规定的时间之内都没找到,那么就跳出Exception。
使用显示等待前需先导入显示等待所需模块和等待条件
#显式等待模块from selenium.webdriver.support.ui import WebDriverWait
#显式等待条件from selenium.webdriver.support import expected_conditions as EC
使用举例:
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
wd = webdriver.Chrome()
wd.get('http://www.baidu.com')#wd是webdriver对象,10是最长等待时间,0.5是每0.5秒去查询对应的元素。until后面跟的等待具体条件,EC是判断条件,检查元素是否存在于页面的 DOM 上。
login_btn=WebDriverWait(wd,10,0.5).until(EC.presence_of_element_located((By.ID,"s-top-loginbtn")))#点击元素
login_btn.click()
附加1、与until()或者until_not()方法结合使用
WebDriverWait(wd,10).until(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为True
WebDriverWait(wd,10).until_not(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为False
在设置时间(10s)内,等待后面的条件发生。如果超过设置时间未发生,则抛出异常。在等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False。
附加2、WebDriverWait与expected_conditions结合使用
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
wait = WebDriverWait(wd,10,0.5)
element =wait.until(EC.presence_of_element_located((By.ID,"kw")),message="")# 此处注意,如果省略message=“”,则By.ID外面是三层()
点击查看expected_conditions类的方法与说明大全
版权归原作者 一目知之 所有, 如有侵权,请联系我们删除。