Web自动化测试
Selenium
Selenium简介
Selenium支持Web浏览器的自动化,主要由三个工具组成
- WebDriver: 使用浏览器提供的api来控制浏览器
- IDE:是Chrome和Firefox扩展插件,可以录制用户在浏览器中的操作
- Grid:分布式,可以在多个浏览器中操作
官方网站:
selenium架构图
客户端通过不同的语言python/java操作selenium,selenium通过不同浏览器的driver可以驱动浏览器
Selenium安装
Selenium环境配置步骤
- 准备好python环境
- 准备好selenium环境
- pip install selenium
- 下载浏览器对应的driver版本
- driver配置环境变量
- 在python中import对应的依赖
Driver的配置
- Driver的介绍
- Driver的下载
- Driver的安装
- 找到与自己浏览器版本适配的driver版本
- 配置环境变量(验证是否成功:在cmd中输入chromedriver)
Selenium IDE用例录制
录制和回放一些用户的操作
(不是很有用,就是个基础工具)
下载安装
启动IDE
录制第一个用例
扩展:代码导出
Selenium编写用例
入门文档:
https://selenium-python.readthedocs.io/
用例的关键要素
- 导入依赖
- 创建driver
- 执行自动化步骤
- 断言
编写用例
可以用IDE查询定位,比如linktext,css,id等等
Selenium三种等待方式
直接等待
强制等待:线程休眠一定时间
time.sleep(3)隐式等待
设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
self.driver.implicitly_wait(3)
缺点:这是一个全局的变量,作用于全部的find_element,不能特殊情况特殊对待显式等待
最大的优点:具体指了是哪一个操作
在代码中定义等待时间,当天条件发生时才继续执行代码
'WebDriverWait'配合until()和until_not()方法,根据判断条件进行等待
程序每隔一段时间(默认为0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间
web控件定位与常见操作
selenium点击与输入
- 输入:find_element(By.ID,'kw').send_keys("霍格沃兹学院")
- 点击:find_element(By.ID,'su').click()
定位
Xpath定位
使用id/name以及层次间的关系可以定位90%的元素
$x('')
XML Path Language
优点:可以用于appium,selenium
缺点:比较慢,因为是从头到尾遍历
表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素 |
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
//title[@lang='eng'] | 选取所有title元素,且这些元素拥有值为eng的lang属性 |
表达式 | 结果 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
一般一个页面中如果出现了name/id,那就直接拿name/id就行了,唯一的
如果没有name/id那就找它的父元素,然后通过标签定位它,但是标签可能有很多,可以通过是第几个进行定位
/和//的区别:
- /只可以定位子元素
- //可以定位子孙元素
在页面的检查——console里面可以进行查找练习
css selector的位置
可以用于appium和selenium,但是appium原生的空间不支持css selector
只适合于css样式定位
$(' ')
常用的css selector
空格代表子子孙孙,>是子元素
web控件常用操作
右键点击
页面滑动
表单操作
selenium提供了两个接口:
- ActionChains:执行PC端的鼠标点击,双击,右键,拖拽等事件
- TouchActions:模拟PC和移动端的点击,滑动,拖拽,多点触控等手势操作
动作链接ActionChains
执行原理:
调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序存放在一个队列里,当调用perform()方法时,队列中的事件会依次执行