在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,执行自动化测试是由机器来执行的,运行中只会考虑到代码运行到哪里,不会考虑什么时候要等一等、缓一缓,为了在脚本在指定的时候可以缓一缓,这时候我们就需要使用等待提升自动化测试的稳定性,来判断上一步操作是否完成,什么时候可以进行下一步操作。
否则,上一步操作如果花费的时间较长,还没有完成,就去进行下一步操作,这时就会产生无法定位到元素,元素状态不正确,数据校验结果不正确等异常。
例如在进行登录操作时,要等待登录页面加载成功,才能定位到用户名和密码输入框,然后填充用户名和密码,进行登录操作。
例如需要定位的元素在某个弹窗上,只有这个弹窗打开之后,才能定位到这个元素。
例如需要验证查询的结果,数据是否正确,就要等查询结束之后,再去定位所需要验证的数据等等。
1. 强制等待:time库下的sleep()
说明:(1)它不考虑代码整体的逻辑性和连贯性,运行到sleep这一行的时候电脑就无条件执行 等待的操作。
(2)等待时间由sleep的参数决定,等待结束后,继续执行后续的代码。
(3)因此在日常测试中,一般情况下不会使用sleep,只有在特定情况下或者临时性的调 试下会使用sleep。
使用方法:sleep参数是以秒为单位,可以为float和int的数字。
优点:容易上手。在有需要的时候,直接调用即可。
缺点:很不智能。只在写的当下生效,造成大量的代码冗余,并且基于自己的感觉来添加,有的时候网速过快,就会造成大量时间的浪费。
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element("name", value='wd').send_keys('这是我的第一次尝试')
driver.find_element("id", value='su').click()
#强制等待
#sleep(1)
driver.find_element('xpath', '//*[@id="1"]/div/div[1]/h3/a').click()
2. 隐式等待
说明:(1)本质意义上而言是driver对象的一个设置项。因此只需要设置一次即可生效,在整个 driver生命周期中都有效。从 driver = webdriver.Chrome() ----driver.quit() 结束。
(2)隐式等待不会阻碍程序的正常运行。
使用方法:(1)driver.implicitly_wait() 其设置了一个最长等待时间。
(2)在页面加载完成之后如果说没有找到对应的元素,就进入隐式等待的时间周期, 在时间周期内会一直等待该元素显示出来,如果获取成功,则继续后续的操作, 如果超过最大时间周期,仍未获取到则抛出异常。
优点:在整个webdriver生命周期中,只需要设置一次,即可一直生效。
缺点:如果在最大时间周期内无法找到元素,则不管了。
from selenium import webdriver
driver = webdriver.Chrome()
#隐式等待
#driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
driver.find_element("name", value='wd').send_keys('这是我的第一次尝试')
driver.find_element("id", value='su').click()
driver.find_element('xpath', '//*[@id="1"]/div/div[1]/h3/a').click()
3. 显示等待
说明:专门针对于元素来进行等待的操作行为,和强制等待的用法相同,在需要使用的时候定义。
使用方法:显示等待有两种不同的等待方法:until与until_not,两种方法的结果相反。
until():表示如果元素存在则返回
until_not():表示如果元素不存在则返回
until的显示等待可以返回被等待的元素。
优势:直接对单个元素进行等待,效率最高的等待行为。
缺点:操作麻烦,略死板。
from selenium import webdriver
#创建webdriver对象
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element("name", value='wd').send_keys('这是我的第一次尝试')
driver.find_element("id", value='su').click()
#显示等待,获取连接的元素,元素等待成功则会返回元素对象. WebDriverWait(对象、等待的时间、查找的频率)
link_el = WebDriverWait(driver, 10, 0.5).until(
lambda el: driver.find_element('xpath', '//*[@id="1"]/div/div[1]/h3/a'),message='显示等待查找失败'
)
link_el.click()
总结:selenium官网定义说显示等待与隐式等待不要共用,可能会造成实际等待时间超出设定时间。但是我在使用过程中没有出现过此情况,所以多种等待应该是可以同时使用的。如果你们出现加载时间过长,那就单独使用。