自动化打开一个网页的时候,内部网页元素加载完全有一点的延迟性,因此在做 Web 端的自动化测试的时候,一般都需要在测试 case 时加入一些等待操作,否则可能会出现页面还未加载完全,导致定位元素的时候出现“no such element”异常。
我们常用等待操作有3种,分别是:强制等待sleep、隐式等待、显示等待
1、强制等到sleep()
效率最低,不建议使用。其使用简单,一般在调试脚本时使用
2、隐式等待(driver.implicitly_wait(5))
隐式等待也是设定一个固定的等待时间,对整个生命周期的元素都起作用,所以只要设置一次即可。其设置了一个最长等待时间,程序会一直等待整个页面加载完成,才会执行下一步操作;但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活,且有失败风险,可能会导致用例执行失败,不太建议使用
**警告:不要混合使用隐式和显式等待。这样做会导致不可预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。
#初始化浏览器
driver = webdriver.Chrome()
#最大化浏览器
driver.maximize_window()
#隐式等待
driver.implicitly_wait(5)
#打开url
driver.get('http://116.63.181.151')
#获取登录链接
driver.find_element(By.LINK_TEXT, '登录').click()...
3、显示等待
显式等待 相比隐式等待更灵活,是先设定一个条件函数和一个最长等待时长,轮询判断条件函数的返回值,如果返回 True则开始执行后面的操作,否则会一直等待,直到超时报元素未找到异常
示例代码
from selenium import webdriver1
from selenium.webdriver.common.by import By
from selenium.webdriver,support.ui import WebDriverWait
from selenium.webdriver.support import expected conditions as EC
driver =webdriver.chrome()
driver.get("http://XX.com")
element =WebDriverWait(driver,18).until(Ec,presence of element located((Bv.ID, "Element"))
显示等待需要用到两个类:WebDriverWait和expected_conditions两个类, WebDriverWait指定轮询间隔、超时时间等expected_conditions 指定了很多条件函数(也可以自定义条件函数)。
(1)WebDriverWait(driver,timeout,poll_frequency=0.5,ignored exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:轮询的间隔步长,默认为0.5
signored_exceptions:忽略等待时出现的特定类型的异常,默认忽略NoSuchElementExeception异常
WebDriverWait()类中有until(expected_confition)和until not(expected_confition)方法
(2)expected_confition 等待条件
最常用的两种等待条件:
(1) presence_of_element_located(locator)
判断某个元素是否被加到了dom树里,并不代表该元素一定可见
(2) visibility of_element located(element)
判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
locator(定位器) element(元素)
例子
username = WebDriverWait(driver 10).until(Ec.presence_of_element_located((By.XPATH "//input[contains(@placeholder "用户名')]"))
username.send_keys("admin")
password= WebDriverWait(driver, 10).until(Ec,visibility of_element located(driver.find_element(By.XPATH "//input[contains(@placeholder "密码')]"))
password.send_keys("123456")
(3)其他等待条件
title_is(title)
title_contains(title)