文章目录
- 简介
- selenium
- 等待
- Web控件交互
- 表单操作
- 多窗口
- frame
- 多浏览器处理
- 用 js 操作
- 文件上传
- 弹窗
- pageObject
- 复用浏览器
简介
- 这部分主要介绍 web 自动化测试
selenium
- 专门测试 web 的工具,根据测试用例,直接在浏览器上执行对应动作
- 还是在 pytest 框架中使用,框架负责管理用例,selenium 负责执行动作
- 框架图
- 基本操作直接看这里
- 除了这个链接里讲的内容,补充一些
等待
- 有时页面加载或执行某些操作需要等待一定时间,或者是网速抖动也需要时间缓冲,有三种处理方式
- 直接等待
- 隐式等待
- 显式等待
- 直接等待
- python 的
sleep()
方法,直接让线程暂停几秒钟,selenium 暂时不执行后续步骤,让浏览器喘口气 - 缺点:比较粗暴
- python 的
- 隐式等待
- 通过 selenium 提供的方法
- 通过 selenium 提供的方法
- 显式等待
- 还是 selenium 提供的函数
- 可以使用定义好的条件
expected_conditions
判断
- 也可以自定义函数传给
until
,根据源码,定义时要传个形式参数
Web控件交互
- 除了点击,输入等 web 交互,还需要进阶部分 ,比如滑动、拖拽、双击、右击等 web 操作
- 这里主要用到两个 action
- 官方文档
- ActionChains
- 两种写法
- 可以用这个网站练习
- 鼠标移动到 link 上
- 拖拽元素到某个地方,有三种方式实现
- 两种写法
- TouchAction
- 滑动操作 flick;如果不确定滑动的偏移量,就给一个大一些的值,比如10000
- 滑动操作 flick;如果不确定滑动的偏移量,就给一个大一些的值,比如10000
表单操作
- 举个例子就行
多窗口
- 概念
- 一般的处理流程
- demo
- 所有的 window 句柄支持顺序索引,也可以保存当前的 window 句柄
- 主要是用
switch_to.window
方法
frame
- 概念
- frame 虽然能和其他标签一样在 html 页面中使用,但对 selenium 而言需要单独的方法定位
- frame 有两种存在方式:
- 不嵌套:一个页面有一个或多个并行的 frame,里面都是 html 的普通标签
- 嵌套:一个页面的 frame 里还有 frame
- 对于嵌套的 frame
- demo,可以发现,不切换到frame,定位不到
- 注意操作域,通过 id 或者 父子关系 切换
多浏览器处理
- 通过传递参数判断在哪个浏览器执行测试
- 系统环境变量可能并没有 browser 这个键,在启动测试用例前可以设置一下
if __name__ == '__main__': os.environ['browser'] = 'Chrome' b = os.getenv('browser') print(b)
用 js 操作
- selenium 能够执行 js,所以就可以通过 js 代码直接执行需要的动作
- 可以在浏览器的 console 中测试,那里执行的效果放到测试用例中也可以
- demo,
execute_script
方法
- 两个 js 语句也可以用 分号 隔开执行
- 操作时间控件,就是 选日期 那种;就是通过 js 设置
- js 就是一门 web 语言,和浏览器无缝衔接,驱动 driver 执行 JavaScript 代码不是难事
- 可以看看之前的 “非js” 方式的底层实现
- js 和 .net 语言值得学习精进
文件上传
- 上传图片,只需要把本地图片的路径 send 到 “选择文件” 的按钮就行,不需要点击
弹窗
- js 弹窗,和之前 window 切换类似
- div 模态框,比如在登录百度时不会切换界面,直接弹出一个小窗口;或者在百度这里设置皮肤
- demo for alert
pageObject
- 问题:测试和断言放在一起,代码修改要同时考虑这两部分,比较麻烦
- 页面对象(pageObject)就是为了解决这个问题;官方文档;主要原则:
- 后面会有实战,再体会,设计模式层面的东西比较抽象,而且需要代码功底
复用浏览器
- 问题:有些测试需要人为介入,比如扫码登录
- 以企业微信登录为例,我们可以配置浏览器为 debug 模式,只要不关闭,就会保留cookie信息,无需重复登录
- 用例即使重新执行,但因为还是在之前打开的配置过的浏览器 run 的,就不需要重新扫码
- 这就是所谓的复用浏览器
- 这里还是需要扫码一次,我们可以通过植入 cookie 跳过扫码步骤