自动化测试常见函数(下篇)
问题:页面中明明存在元素,但是代码执行报错,加入time.sleep()程序执行通过
因为脚本的执行速度非常快,而页面加载的资源比较多,因此当脚本执行到改行代码时页面还没有渲染完成,因此找不到该元素,当添加了time.sleep(3)之后,页面已经在3s内加载完成,此时再去查找该元素就可以找到。
1.等待
通常代码执行的速度比页面渲染的速度更快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法。
1.1 强制等待
time.sleep(3)
当调用该方法时,程序会直接阻塞,等待指定秒数后继续执行后面的代码
优点:使用简单,调试的时候比较有效
缺点:影响运行效率,浪费大量时间,1个或数量较少的测试脚本时,添加强制等待消耗的时间不过数秒,实际在工作中,业务场景比较复杂时,要添加的自动化脚本非常多,通常来说自动化测试脚本数量可达到上百,实际上可接受的自动化运行时间为几秒或者几分钟之内
1.2 隐式等待
隐式等待是一种智能等待,它可以规定在查找元素时,在指定时间内不断查找元素,如果找到则代码继续执行,直到超时没找到元素才会报错。
implicitly_wait()
隐式等待的生命周期:隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就一直生效。
优点:智能等待,作用于全局
1.3 显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续的代码
WebDriverWait(driver,sec).until(functions)
//functions:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
from selenium.webdriver.support import excepted_conditions as EC
wait=WebDriverWait(driver,2)
wait.until(EC.invisibility_of_element(By.XPATH,'/dfsfar'))
invisibility_of_element(locator) :检查元素的不可见性
visibility_of_element(locator) :检查元素的可见性 都是excepted_conditions里面的方法
alert_is_present() :检查是否出现弹窗
显示等待可以等待隐式等待无法处理的问题,因为隐式等待无法等待弹窗,弹窗不是页面的元素,无法通过页面元素来定位到弹窗
优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活
缺点:写法复杂
小提示:隐式等待和显示等待不建议一起用,可能会导致不可预测的等待时间,强制等待可以任意配合隐式等待或者显示等待来使用。
2.浏览器导航
常见操作:
1)打开网站
driver.get("https://tool.ui")
2)浏览器的前进、后退、刷新
driver.back()
driver.forward()
driver.refresh()
3.文件上传
点击文件上传的场景下会出现弹窗系统窗口,进行文件的选择
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素,但是可以使用send_keys来上传指定路径的文件,达到的效果是一样的。
driver.get("https://,..")
driver.find_element(By.CSS_SELECTOR,"").send_keys("D:\\file.text")
//通过send_keys()方法,可以实现将本地文件夹中的文件上传上来,要写完整的路径+文件名
创建浏览器对象时,可以传递必要的参数:
1)设置无头模式
无头模式:程序在后端运行,界面看不到页面的表现
自动化打开浏览器默认情况下为有头模式
2)页面加载策略
页面加载方式主要有三种类型
策略 | 说明 |
normal | 默认值,等待所有资源下载(主体框架、图片、视频等) |
eager √ | DOM访问已准备就绪,但诸如图像的其他资源可能仍在加载 |
none × | 完全不会阻塞WebDriver |