前言
现在的网页,基本都是使用ajax异步的加载各种资源的,所以可能我们需要定位的元素不会第一时间就加载出来,这时候是无法定位的,也就会抛出异常。而解决这个问题的方法,就是等待。
下面将介绍在selenium自动化中的三种等待时间
一、固定等待
需要自己估算网页加载的时间,硬性的等待,无论网页加载快慢,都会强制等待这么多时间。
该方式的缺点:由于web加载的速度取决于测试的硬件、网速、服务器的响应时间等因素。如果时间设置太长,容易造成时间浪费,如果设置太短又可能会造成在web还没有加载完所需要定位的element,而出现报错。由于等待时间无法确定,使用太多的sleep会影响运行速度,大大地降低效率。
代码如下(示例):
# 需要现导入Python内置的time模块
import time
# 调用sleep()方法,指定等待2s后继续
time.sleep(2)
二、隐式等待
它是一个全局的设置,也就是在一个脚本中只需要使用一次,作用范围是针对整个webdriver对象实例,为其设置一个最大时长(单位秒),如果定位的元素没有出现就会循环的查询直到超时或者元素出现,相比于硬性等待,这个更加弹性,元素出现了就不会等待了。
该方式的缺点:一旦设置了隐式等待,它将会存在整个 WebDriver 对象实例的声明周期中,隐式等待会让一个正常响应的应用的测试变慢,它将会在寻找每个element的时候都进行等待,这样会增加整个测试执行的时间。
代码如下(示例):
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10) # 设置全局等待10s
driver.get('https://www.baidu.com/')
driver.find_element(By.ID,'kw') # 查找baidu首页中的kw元素,查找到了则继续下一步
# driver.find_element(By.ID,'kw2') # 将kw换成不存在的元素,如kw2,可以发现将会等待10s后报错
三、显示等待
显式等待能自定义等待条件,在这个时间范围内,只要满足等待条件即可执行下一步代码操作,一般需要配合该类的until()和until_not()方法一起用。如果网页出现符合的条件,就不等待继续执行,如果没有则循环直到超时报错。
代码如下(示例):
# 前置条件
from selenium import webdriver # selenium驱动
from selenium.webdriver.common.by import By # 元素定位
from selenium.webdriver.support.ui import WebDriverWait # 显示等待
from selenium.webdriver.support import expected_conditions as EC # 为显示等待提供等待条件,后面单开一个文章介绍,这里不做赘述
# 显示等待语法
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw'))) # 默认是以每500ms轮询一次until中的条件,传入的超时时间是10s
WebDriverWait(driver,10,1).until(EC.presence_of_element_located((By.ID,'kw'))) # 设置每1s轮询一次until中的条件,传入的超时时间是10s
总结
三种等待时间各有优劣,根据自己实际情况选择使用,或配合使用