1. 什么是自动化测试?
说白了,就是"机器"去帮我们执行了.他按照预先设定好的条件去运行,设定的条件包括正常条件
和异常条件
,不需要人为手工干涉去进行测试过程,就通过脚本去设定.
2. 自动化测试金字塔
2.1 单元测试
对程序组成的最小单位进行测试,效率很高,我们测试/开发要把大部分精力放在单元测试阶段.(Java 中的 Junit 框架就是单元测试)
2.2 接口测试
接口测试就是 API 测试,相对于 UI 自动化 API 自动化更加容易实现,执行起来也更稳定. 在项目前期,接口开发完成之后就进行测试.他的测试用例维护量少,适合接口变动小的项目
(接口自动化工具: robotframework 框架 , jmeter , postman , Django , soupUI 语言 : Java/Python)
2.3 UI 自动化测试
根据界面元素,对元素进行操作,模拟用户的使用,编写自动化脚本,进行测试. 缺点就是用例维护量大
,优点就是可以支持繁琐复杂,手工不易操作,反复执行的功能测试.
需要在项目后期,界面功能和界面元素稳定的时候进行,适合界面比较稳定的项目
UI 自动化的好处:
- 进行大量的回归测试和兼容性测试,解放双手,提高效率,节省资源
- 建立一个稳定的测试过程,减少人为错误
- 完成对手工测试来说比较有难度的测试
- 完成对手工来说比较繁琐的测试
- 机器执行是很可靠的
- 脚本是可以复用的
3. 为什么要使用 selenium 自动化框架
首先,自动化测试工具是有很多的,像: jmeter , testNG , Django , Appium , Macaca 都是.看自己.
selenium 特点: 轻量级 , 安装方便 , 免费 , 支持多种语言 (Java , Python , ruby , C# , JavaScript) , 支持多个平台 , 支持操作系统 (Linux , Windows , Mac) , 支持多浏览器 (Firefox , Chrome , Opera , Safari)
4. 什么样的项目适合自动化测试
产品型的项目(一些回归测试) , 产品需要不停迭代 , 周期很长 , 项目稳定 , 界面不频繁变动
而不适合的:
- 需求变动频繁的项目,自动化脚本不能重复使用,维护成本太大,性价比低
- 项目周期短,自动化脚本编制完成后使用次数不多,性价比低
- 交互型较强的项目,需要人工干预的项目,自动化无法实施
5. Selenium IDE
Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。
录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。
火狐版:
6. Webdriver(浏览器驱动)
webdriver 解决了 selenium RC 的环境沙箱问题
webdriver 运行原理:
- 启动浏览器,把浏览器绑定到特定的端口,形成一个 remote server
- 客户端(脚本)通过 commandExecutor 向 remote server 发送请求
- 把 web service 指令解析成浏览器的 native 指令,然后去操纵浏览器
6.1 webdriver API
# coding = utf-8
from selenium import webdriver
import time
browser = webdriver.Firefox()
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
browser.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
browser.find_element_by_id("su").click()
browser.quit()
6.2 元素的定位方式
常用的几种:
-
id
(如果元素有 id,肯定会是全局唯一的,可以直接定位元素)
-
name
(如果有,必须是全局唯一的,才可以直接定位)
-
classname
(一样的,不一定可以定位元素)
-
link text
(适用于点击的链接)
-
partial link text
(用部分链接的内容去定位元素)
-
tag name
(组成元素的 tag,当然也要是页面唯一的)
-
xpath
(一定可以定位到该元素,每一个元素的 xpath 都是唯一的)
8. css selector
(一定可以定位到该元素)
像这些只要打开页面开发者工具都是可以获取到这些属性的
6.3 操作测试对象
click
(点击操作对象)send_keys
(给操作对象输入文本信息)submit
(提交订单)clear
(清除操作对象的内容)
text
(获取操作对象的文本内容)
6.3 添加等待
time.sleep()
(固定等待)driver.implicity_wait()
(智能等待 , 等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长)
6.4 打印信息
driver.title
(获得title)driver.url
(获得 URL)
6.5 浏览器操作
maximize_window()
(浏览器的放大,最大化)set_window_size()
(设置浏览器的宽和高)driver.forward()
(浏览器的前进)driver.back()
(浏览器的后退)document.documentElement.scrollTop=10000
(将浏览器滚动条滑到最底端)document.documentElement.scrollTop=0
(将浏览器滚动条滑到最顶端)
6.6 键盘事件
必须引入工具包: from selenium.webdriver.common.keys import Keys
通过send_keys()调用按键:
send_keys(Keys.TAB)
# TABsend_keys(Keys.ENTER)
# 回车send_keys(Keys.SPACE)
#空格键send_keys(Keys.ESCAPE)
#回退键(Esc)
键盘组合键用法:
5. send_keys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
6. send_keys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
7. send_keys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
8. send_keys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)
6.7 鼠标事件
要使用鼠标事件需要导入工具包:
from selenium.webdriver.common.action_chains import ActionChains
#鼠标拖动事件
ActionChains(driver).move_to_element(element).perform()
ActionChains(driver)
生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为。
move_to_element(element)
移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为
ActionChains 类
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 移动
6.8 定位一组元素
有时候我们批量的操作对象,就像多选一样.
6.9 多层框架的操作
6.10 层级定位
就相当于鼠标放到位置后有一些选项,要定位就要先打开这个页面的层级
6.11 下拉框选择
6.12 alert 框的处理
-
获得弹框的操作句柄
-
调用 accept 方法关闭弹框
-
如何向 alert 框中输入信息
6.13 div 对话框的处理
- 先定位到元素所在的 div
- 在去定位其他元素