目录
学习路线
序号 | 阶段 | 知识点 |
---|---|---|
第一阶段 | 自动化入门 | 1.认识自动化及自动化测试 2.自动化测试工具(框架)选择 3.SelemiunIDE插件的使用 4.Firebig插件工具及使用 |
二 | web自动化工具(webDriver)基础篇 | 1.元素基础定为 2.Xpath、CSS元素定为方式 3.元素操作 4.浏览器的操作方法 |
三 | Web自动化工具(webDriver)中级篇 | 1.鼠标操作 2.键盘操作 3.元素等待 4. HTML特殊元素处理 5.窗口截图 |
四 | Web自动化(高级篇) | 1.自动化测试模型 2.UnitTest框架 3.UnitTest断言 4.生成HTML测试报告 5.自动测试报告自动发送邮件 |
自动化测试简述
概念
由机器设备代替认为自动完成制定目标的过程
优点
减少人工劳动力
工作效率调高
产品规格统一标准
规模化(批量生产)
概念
让程序代替人为取验证程序功能的过程
为何进行自动化测试
- 解决-回归测试:项目在法新版本之后对项目之前的功能进行验证
- 解决-压力测试:可以裂解多用户同时去操作软件,软件服务器处理多用户请求的能力
- 解决-兼容性测试:不同浏览器(IE、Firefox、Chrome)
- 提高测试效率,保证产品质量
测试在什么阶段开始
功能测试完毕(采用手工测试:就是由人一个一个输入用例,让后观察结果)
自动化测试所属分类
1.√黑盒测试(功能测试)
2.灰盒测试(接口测试)
3.白 盒测试(单元测试)
- web自动化测试属于黑盒测试(功能测试)
自动化测试优点
- 较少的时间内运行更多的测试用例
- 自动化脚本可重复运行
- 减少人为的错误
- 测试数据存储
自动化测试缺点
- 不能取代代手工测试
- 手工测试比自动化发现的缺陷更多的
- 测试人员技能要求
自动化测试分类
- Web-(UI)自动化测试(本阶段学习)
- 接口-自动化测试
- 移动(app)-自动化测试
- 单元测试-自动化测试
什么web项目适合做自动化测试
- 需求变动不频繁
- 项目周期长
- 项目需要回归测试
Web自动化测试的主流测试工具
- QTP(收费)
QTP是商业的功能测试工具,收费、支持web,桌面自动化测试 - Seleniumm(开源)
Selenium是开园的web自动测试工具,免费,主要做功能测试。 - Jmeter(开源、Web、接口、性能)
Jmeter是由Apache公司使用Java平台开发的一款测试工具,支持(Web、接口测试、性能测试)
* Web测试在通信层(无UI界面) - Loadrunner(收费、web、性能)
Loadrunner是商业性能测试工具,收费,功能强大,适合做复杂场景的性能测试 - Robot framework
<Robot Framework是一个基于python可扩展地(关键字驱动)的测试自动化框架
对此,进行了总结:
测试种类 | App端自动化测试 |
---|---|
Web自动化测试 | selenium、robot framework |
App端自动化测试 | Appium、Monkeyrunner、UIautomation |
PC客户端(Win32) | QTP |
接口自动化测试 | Jmeter、Postman、httpUnit、RestClient(后三者为开发常用的浏览器插件) |
云测平台 | Testin Testbird |
性能测试 | Jmeter、LoadRunner |
*加粗字体为会学习到的部分
Selenium
Selenium是一个用于web应用程序测试的工具,中文——硒
Selemiun特点
- 开源软件:源代码开放可以根据需求来增加工具的某些功能
- 跨平台:linux、windows、mac(使用python解释器跨平台)
- 核心功能:可以在多个浏览器上进行自动化测试
- 多语言:Java、Python、C#、JavaScript、Ruby等
- 成熟稳定:目前已经被geogle、百度、腾讯等公司广泛使用
- 功能强大:能够实现类似以商业工具的大部分功能,因为开元行,可实现定制化的功能
Selenium家族发展史(了解)
selenium2.0被广泛使用
Selenium IDE:火狐插件、可录制脚本
selenium Grid:测试量大时使用,分布式
selenium RC:JS脚本注入到浏览器来模拟浏览器,有缺陷
同源策略:安全协议保护,不在同一源内禁止访问
Sleniume2.0(WebDriver)
WebDriver:通过浏览器驱动程序控制(模拟)浏览器,将控制浏览器的方法到分装到库,简称Api
Selenium IDE
是一个Firefox插件,用于记录和播放用户与浏览器的交互。(即录制web操作脚本)
为何使用Selenium IDE
1.Swlenium IDE录制脚本,并转换为代码语言,设计脚本时可用此作为参考
安装相关方法:
1.官网安装V而ISOin:2.9.1.1
通过官网安装插件:Selenium IDE for 火狐(链接已经失效)
2.附加组件管理器
(1)火狐浏览器 v24-v25
(2) 附加组件管理器(Ctrl+Shift+A)→搜索Selenium IDE
提示:
1. IDE前面有个空格
2. 附加组件管理器启动方式
3.离线安装
下载:
安装:下载好 selenium_ide-2.9.1-fx.xpi 直接拖入浏览器安装
环境搭建
对于mp3:-播放器(建地基
对于python环境:工具箱(print函数封装)、编译器
Selenium IDE运行
- Ctrl+Alt+S(试过无效)
- 工具栏→Selenium IDE
录制自动化脚本:
需求1:使用Selemiun IDE插件入职→打开百度搜索引擎,搜索(淘宝网)再返回搜索结果返回连接
界面和老版本有很多不同,保存测试用例
id-kw;#为百度搜索文本框id属性和值
id=su;#为百度一下按钮id属性和值
将录制的脚本转换为代码语言:
新版本已经不支持,老版本(如2.9.0可以导出为其他语言)
录制脚本时是录制鼠标的所有在浏览器的操作,脚本中会有多余步骤,又是需要手动填写或修改脚本,所以需要对IDE脚本编辑与操作有所了解
基于Selenium IDE脚本编辑与操作(了解)
编辑行命令:目的:手动修改或编写脚本(采用录制方式很容易记录出多余的操作)
编辑-行命令:Table标签下选中某一行命令,命令由command、Target、value三部分组成
插入命令:在某一条命令上右击,选择“insert new command”命令,插入空白再进行编辑
插入注释:右击选择“insert new commnet”命令插入注解空白行,本行内容不执行,插入内容以//开头
除此之外还有移动命令、删除命令、命令执行
Selenium IDE常用命令(了解)
Command输入-Target
-
open(url)命令
作用:打开指定的URL,URL可以为先对或是绝对URL
Target:要打开的URL,Value值为空
(1)当Target为空,将打开的Base URL中填写的页面
(2)当Target不为空且值为相对路径,将打开Base URL+Target页面,如假设Base URL为http://www…zhi97.com,而Target为/about.aspx,则执行open命令时,将打开http://zhi97.com/aspx
(3) 当Target以http://开头时,将自动忽略Base URL,直接打开target的网址 -
pause(waitTime)
作用:暂停脚本运行
waitTime:等待时间,单位ms;//Target-1000 -
goBack()
作用:模拟单击浏览器的后退按钮
&emsp提示:由于没有参数,所以Target和Value可不填
- 必须是同一个窗口打开2个以上url才生效
-
refresh()
作用:刷新当前页
提示:由于没有参数,所以Target和Value可不填 -
click(locator)
单击一个链接、按钮、复选框或单选按钮,如果该单击事件导致新的页面嘉爱,命令会加上后缀AndWait“,即clickAnd wait”,或“waitForPageToLoad”命令 -
type(locator,value)
作用:向指定输入域中输入指定值,也可谓下拉框、复选框 和单选框赋值
Target:元素的定为表达式
Value:要输入的值 -
close()
作用:模拟用户单击窗口上的关闭按钮
提示:由于没有参数,所以Target和Value可不填
定位调试插件
快速查找一个元素标签的属性和值
Firebug
Firefox的一款插件,可以调试所有网站语言,同时也可以快速定为HTML页面中的元素
作用:定位元素(获取元素定位和查看元素属性)
但是新版的火狐浏览器中已经没有该插件,统一整合到了开发者工具中(调试器)
(需求2 实现天涯论坛自动登陆个人账号)
WebDriver:测试Web项目自动化测试工具
掌握webDriver元素定位、元素操作方法
因为已经进行了融合,一般说的是WebDriver即为Selenium 2.0
搭建环境:工具包、解释器
- Webdriver(Selenium2)是一种用于Web应用程序的自动测试工具
- 它提供了一套友好的API
- Webdriver完全就是一套类库,不依赖于任何测试框架,除了必要的浏览器驱动
说明:
API:应用编程接口说明(Webdriver类库内封装非常多的防范,要使用这些方法,就需要友好的调用命名规则)
WebDriver API
支持的浏览器
1.Firefox(FirefoxDriver)【推荐-本阶段学习使用】
2. IE(InternetExplorerDriver)
3. Opera(OperaDriver)
4. Chorme(ChormeDriver)
5. safari(SafriDriver)
6. Htmlunit(HtmlUnit Driver)
提示:
Fireworks、Chorme:对元素定为和操作有良好的智齿,同时对Javascript支持也非常好。
IE:只能在windows平台运行,所有浏览器中运行速度最慢
HtmlUnit:无GUI(界面)运行,运行速度最快
推荐火狐原因:Selenium IDE、Firebug、对WebDriver API支持良好
支持的开发语言
JAva、Python、PHP、JAvaScript、Perl、Ruby、C#
安装python中的selenium包
浏览器版本需和驱动一致,驱动下载后需要添加Path环境变量中没说这直接放在python安装目录(因为python已添加至path中)
使用火狐浏览器:FireFox 48以上版本 selenium 3.x+FireFox驱动-geckodriver;FireFox 48以下版本 , selenium 2.x内置驱动
IE浏览器:IE9以上版本 selenium 3.x;IE9以下版本 selenium 2.x
Chorme:selenium2.x/3.x+chorme驱动
WebDriver-元素定位
让程序操作指定元素,就必须先找到该元素,程序不如人眼
目标:
了解元素各种定位方法
掌握id、name、class_name、tag_name、link_text、paralal_link_text定位的使用(webDriver提供8种定位方式)
定位方式 | 含义 | 备注 |
---|---|---|
id | 一般做不重复、唯一的识别 | 为元素的id属性定位 |
name | 可重名 | 为元素的name 属性定位 |
class_name | 一个物体可以属于多个类,找其中一个即可 | 类属性值为元素 class 属性 定位 |
tag_name | 通过标签名称(如a、input) | 元素标签名在当前页面必须为唯一元素,或定位符合条件的第一个元素 基于元素的标签名称 |
link_text | 链接文本,指定位 | 为超链接 < a> 定位 |
partial_link_text | 含相关关键字,模糊匹配 | 为超链接 < a > 定位 |
xpath | 为元素路径定位 | 为元素路径定位 |
Css | 选择定位器 | 为CSS选择器定位 |
案例1-注册界面
1.语言使用paython
2.开发工具使用pycharm、使用seleniumxxx
id定位
#定位方法:
find_element_by_id(id值)
说明:HTML规定id属性在整个GTML文档中必须是唯一的,id定位就是通过元素的id属性来定位元素
前提:元素有id属性
实现案例1需求
(1)打开注册A、html页面,使用id定位、自动填写(账号A:admin、密码A:123456)
(2)填写完毕后,3s关闭浏览器窗口
url——\是转义字符,所以用\(html文档在本地)
或r“E:\pro\EGG\df
步骤分析:
from selenium import webdriver #1.导入selenium包
from time import sleep #2.导入time包
driver=webdriver.Firefox() #3.实例化火狐浏览器
driver.get("https://login.taobao.com/member/login.jhtml?spm=a21bo.21814703.201864-2.d1.5af911d9g3Qo9j&f=top&redirectURL=http%3A%2F%2Fwww.taobao.com%2F") #4.打开网页注册页面
element=driver.find_element_by_id("fm-login-id") #5.使用id定位方法(具体值可以在控制台查看)
element.send_keys("喵喵") #6.使用send_keys()方法
pwd=driver.find_element_by_id("fm-login-password")
pwd.send_keys("123456")
sleep(3) #7.暂停3s
quit() #8.关闭浏览器
总结
name定位
#定位方法:
find_element_by_name(name值)
说明:HTML规定name属性来指定元素名称,因此它的作用更像人名,name的属性值在当前文档中可以不是唯一的,name定位就是根据元素name属性来定位。
前提:元素有name属性
实现案例1需求
(1)打开注册A、html页面,使用id定位、自动填写(账号A:admin、密码A:123456)
(2)填写完毕后,3s关闭浏览器窗口
#导包
from selenium import webdriver
from time import sleep
#实例化
driver=webdriver.Firefox()
#目标网站
driver.get("https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.201864-2.d1.5af911d9a0HjXd&f=top&redirectURL=http%3A%2F%2Fwww.taobao.com%2F")
#定位用户/密码及操作
driver.find_element_by_name("fm-login-id").send_keys("admin")
driver.find_element_by_name("fm-login-password").send_keys("admin")
sleep(2)
driver.quit( )
Class定位
#方法
find_element_by_class_name()
说明:GTML规定了class来指定元素的类名,用法和name、id类似
前提:元素有class属性
用例:按照class定位在百度中输入 相应文字
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg")
driver.find_element_by_class_name("s_ipt").send_keys("如何学习python")
tag_name定位?
#方法
find_element_by_tag_name(标签名称) #返回符合条件的第一个标签
#如何获取第二个元素?稍后
说明:HTML本质上是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用,tag_name定位就是通过标签名来定位
# tag属性
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("https://www.baidu.com/index.php?tn=monline_3_dg")
driver.find_element_by_tag_name("input").send_keys("如何学习python")
# sleep(3)
link_text定位
#方法
find_elemenet_by_link_text(全部文本值)
说明:link_text定位与前面4个定位有所不同,它专门用来定位超链接文本(< a > 标签 </ a>),需要传入a标签的全部文本
eg.打开一个网页
# tag属性
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("C:\\Users\\71891\\Desktop\\new.html")
#使用link
driver.find_element_by_link_text("访问").click()
"""
传入需要定位的元素,全部文本
click()为单击方法,稍后会做介绍
"""
partial_link_text定位
#方法
find_element_by_partial_link_text(局部文本值)
说明:需要传入a标签局部文本-能表达唯一性(访问新浪网站)
eg.利用a标签打开超链接进行访问并关闭(可以自己在本地写一个标签)
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("C:\\Users\\71891\\Desktop\\new.html")
driver.find_element_by_partial_link_text("访问").click()
sleep(3)
driver.quit()
find_element[s]_by_xxx()
elements:返回所有符合条件的元素
作用:找到定位所有符合条件的元素,且返回定为元素格式数组(列表)格式
说明:返回的格式为列表,所以访问的时候必须指定下标,下标从0开始
eg.本地网页,id=“A”的属性有两个,选择第二进行链接
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("C:\\Users\\71891\\Desktop\\new.html")
#使用link
driver.find_elements_by_id("A")[1].click()
在实际项目中标签没有iname\class属性如何行为?
id\name\class属性为动态获取,随着舒心或加在而变化如何定位?为此出现了xpath和css
xpath
Xpath是非常灵活的定位策略
driver.find_elment_by_xpath()
- Xpath即为XML Path的简称,它是一种用来确定XML文档中某部分位置的语言
- HTML可以看多这是XML的一种实现,所以seleniumm用户可以使用该语言在web应用中定位元素
XML:一种标记语言,用于数据的存储和传递。后缀.xml结尾
Xpath定位策略(方式)
- 路径-定位
&embp;&embp;绝对路径
&embp;&embp;相对路径 - 利用元素属性-定位
- 层级与属性结合-定位
- 属性与逻辑结合-定位
路径(绝对路径、相对路径)
绝对路径:从最外层元素到指定元素之间所有经过元素层级路径,如:/html/body/div/p[2]
提示:
(1)绝对路径 以 / 开始
(2)使用Firebug可以快速生成元素Xpath绝对路径
?
/html/body//div//div//form#绝对另中间不能跳跃,以层级逐级向下
相对路径:从第一个符合条件的元素开始(一般配合属性来区分),如
//input[@id="userA"] #注意,于直接属性查找应该有区别
直接输入绝对路径过于繁复,所以在Firefox中可以先定位再直接复制:
eg.打开某网页并输入用户名密码(采用以上方法用xpath定位)
from time import sleep
from selenium import webdriver
driver=webdriver.Firefox()
url="http://rzfw.njupt.edu.cn/cas/login?service=http%3A%2F%2F202.119.226.237%2F"
driver.get(url)
#绝对路径定位
driver.find_element_by_xpath("//*[@id='username']").send_keys("haha")
driver.find_element_by_xpath("//*[@id='ppassword']").send_keys("123456") #注意单引号中不能继续嵌套单引号/采用双引号
sleep(2)
driver.quit()
层级与属性结合
层级:父子标签
?说明:需要找的元素没有属性,但是它的父级有
示例:
//*[@id='p1A']/input
属性与逻辑结合
两个以上属性时使用,以and连接,属性前需加@
//input[@class="form-control user-input" and @id="username"]
Xpath-延伸
//*[text()="xxx"] #文本内容是xxx的元素,用关键文字定位
//*[start-with(attribute,‘xxx’)] #属性为xxx开头的元素,只能从从第一个字母开始
//*[contains(@attribute,'Haxx')] #属性中含有xxx的元素,已知的内容必须连续
CSS
定义:
CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML的元素显示样式
(格式HTML语言中
在CSS语言中有CSS选择器(不同的策略选择元素),在Selenium中也可以使用这种选择器
使用:
- 在selenium中激励推荐使用CSS定位,定位速度较比Xpath快
- CSS选择器语法很强大,测试中仅使用常用的几个
CSS定位常用策略(方式):
1.id选择器:基于id元素唯一xx
2.class选择器:多个class可以找到
3.元素选择器
4.属性选择器
5.层级选择器
CSS定位方法:
driver.find_element_by_css_selector()
id选择器:
driver.find_element_by_css_selector("#xxx") #xxx为具体id的值
说明:根据元素id属性来选择
格式:#id 如:#userA <选择id属性值为userA的所有元素>
eg.通过id定位,输入数据并点击
from time import sleep
from selenium import webdriver
driver=webdriver.Firefox()
url="https://www.baidu.com/index.php?tn=monline_3_dg"
driver.get(url)
#绝对路径定位
driver.find_element_by_css_selector("#kw").send_keys("拜登")
driver.find_element_by_css_selector("#su").click()
sleep(3)
driver.quit()
class选择器:
driver.find_element_by_css_selector(".xxx") #xxx为具体类的值
说明:根据元素class属性来选择
格式:.class 如:.telA <选择class属性值为telA的所有元素>
from selenium import webdriver
driver=webdriver.Firefox()
url="https://www.baidu.com/index.php?tn=monline_3_dg"
driver.get(url)
#绝对路径定位
driver.find_element_by_css_selector(".s_ipt").send_keys("量子通信")
driver.find_element_by_css_selector(".s_btn").click()
?元素选择器:
仅控制台输入?
[id="kw"]
说明:根据元素的标签名来选择
格式:element 如:input <选择所有input元素>
属性选择器:
driver.find_element_by_css_selector("[xx='yyy']") #xx为属性mingcheng,"yyy"为属性值
driver.find_element_by_css_selector("input[xx='yyy']") #xx为属性mingcheng,"yyy"为属性值
说明:根据元素的属性名和值来选择
格式:[attribute=value] 如:[type=“password”]<选择所有type属性值为password的值>
eg.通过属性的定位得到
from time import sleep
from selenium import webdriver
driver=webdriver.Firefox()
url="https://www.baidu.com/index.php?tn=monline_3_dg"
driver.get(url)
#绝对路径定位
driver.find_element_by_css_selector("[name='wd']").send_keys(量子通信)
#driver.find_element_by_css_selector("input[id='kw']").send_keys("量子通信")
层级选择器:
说明:根据元素的父子关系来选择
格式:element>ekement 如:p>input <返回所有p元素下所有的input元素>
提示:>可以用空格代替 如:p input 或者 p [type=“password”]
eg.
p>input[type="text"] #控制台中操作
#p input[type="text"]
CSS延伸
- input [type^=“p”] 说明type属性是以字母开头的元素
- input [type$=“d”] 说明type属性是以字母结束的元素
- input [type*=“w”] 说明type属性是包含w字母的元素
eg.控制台内
[class*="-pass-"]
对于 XPath与CSS类型而言,功能对比:
定位方式 | XPath | CSS |
---|---|---|
元素名 | //input | input |
id | //input[@id=‘UserA’] | #userA |
class | //*[@class=‘telA’] | .telA |
属性 | 1.//xxx[text()=“xxx”] 2.//[start-with(@attribute,‘xxx’) 3.//[contains(@attribute,‘xxx’)]] | 1.input(type^=‘p’) 2.input[type$='d’ 3.input[type*=‘w’] |
定位——by(了解)
WebDriver除了提供以上定位API方法(driver.find_element_by_xxx())外,还提供了另外一套写法。
导入包,调用find_element()方法,通过by来声明定位的方法,并且传入对应的方法和参数
from selenium。webdriver.common.by import By
方法:
find_element(By,ID,"userA") #需要自行传入两个参数,第一参数为定位的类型,由By提供,第二个参数为定位的具体方式,第三位为值(与以上方法对应类似)
快速导入包By:
光标至By→ctrl+Alt+空格→找到(selenium.webdriver.common.by)→回车
打开函数,其实driver.element_by_css_selector是对By函数的封装,两者等价(不过,还是推荐使用前一种方法)
eg.打开网站,输入相关字符
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Firefox()
url="https://www.baidu.com/index.php?tn=monline_3_dg"
driver.get(url)
#使用by类
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys("admin")
#或者
driver.find_element(By.ID,'kw').send_keys("admin")
driver.find_element_by_css_selector("#kw").send_keys("admin")