在自动化测试任务中适当地引入元素等待可以降低元素定位的出错率,提高脚本稳定性。本节分别介绍元素定位过程中常见的3种等待,分别是强制等待、隐式等待和显示等待。
强制等待就是Python语言time模块下的sleep()方法,它可以设置固定休眠时间。例如,sleep(5)表示脚本执行到sleep(5)就强制等待5s,等待5s过后再执行后面的语句,示例如下:
from time import sleep from selenium import webdriver dr = webdriver.Chrome() dr.get("https://www.baidu.com") sleep(5) # 强制等待5s dr.find_element_by_id('kw').send_keys('双击一下')
implicitly_wait()是WebDirver提供的一个超时等待方法,比sleep()更加智能一些。隐式等待可以理解成在规定时间范围内,浏览器不停地刷新页面,直到找到目标元素。如果在规定时间内找不到目标元素,就抛出异常。不设置时默认是0。
示例如下:
from time import sleep from selenium import webdriver dr = webdriver.Chrome() dr.get("https://www.baidu.com") dr.implicitly_wait(30) # 隐式等待30s dr.find_element_by_id('kw').send_keys('双击一下')
显示等待可以理解为明确要等到某个元素的出现或是某个元素可单击。如果等不到,就一直等待下去;除非在规定时间内没找到该元素,那么就会抛出异常。
示例如下:
from selenium import webdriver from selenium.webdriver.common.by import By # 导入By类 from selenium.webdriver.support.ui import WebDriverWait # 导入WebDriverWait类 from selenium.webdriver.support import expected_conditions as EC # 导入EC模块 driver = webdriver.Chrome() driver.get('https://mail.sina.com.cn/') element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID, 'freename'))) element.send_keys('hello') driver.quit()
WebDriverWait()是显示等待类。driver是驱动;5表示最长超时时间,单位为s(秒);0.5表示每隔0.5,即检测元素是否存在的频率,单位为s(秒);until表示在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;EC.presence_of_element_located()方法表示只要有一个符合条件的元素加载出来就通过。