一、Robot Framework简介
1)Robot Framework
Robot Framework是一款用Python编写的功能自动化测试框架,支持关键字驱动且可扩展性好。它主要用于需要进行多次验收的系统测试,或者验收测试驱动开发,尤其对于一些常年需要维护的系统来说,价值更大。
2)RIDE
RIDE是一款专门用来编辑Robot Framework用例的软件,用Python编写并且开源。当我们针对一个系统编写好一套脚本后,每当我们对系统做一些更改的时候,便可以把已经写好的脚本拿出来稍作修改,通过执行这些脚本就可以检测系统的功能是否依旧完好。系统需要一个不断完善的过程,而RIDE用例也将随着系统的变更做着相应的修改。
3)特点:
a.测试用例使用文本文件保存;b.测试用例支持变量的使用,也可使用if语句和for循环,测试人员可根据自身情况创建自己需要的测试库;c.测试执行报告和日志是html格式的,容易阅读;d.支持关键字驱动、数据驱动和行为驱动等等
RIDE使用教程
(1)启动ride
启动ride方法:
- 通过界面图标
- dos命令行:进入dos窗口,输入ride.py,按回车即可
推荐第二种打开方式,这样可以方便看到里面的报错日志
进入RIDE界面
(2)菜单栏
1.File
1>New Project:新建工程
2>Open Test Suite:打开测试套件
3>Open Directory:打开目录
4>Save:保存(保存当前鼠标所定位到的案例)
5>Save All:保存全部
6>展示最近打开的工程,最多展示4个,可以直接切换工程
7>Exit:退出
2.Edit
1>Add Tag to selected:对选中的案例增加Tag标签,可批量增加
2>Clear Selected:清除选中的案例
3>Undo:撤销 ctrl+z
4>Redo:重做 ctrl+y
5>Cut:剪切 ctrl+x
6>Copy:复制 ctrl+c
7>Paste:粘贴 ctrl+v
8>Insert:插入
9>Delete:删除
10>Comment:注释当前行,可批量操作
11>Uncomment:取消当前行注释,可批量操作
12>Insert Cells:插入单元格
13>Delete Cells:删除单元格
14>Inset Rows:插入行
15>Delete Rows:删除行
3.Tools
1>Run Test with Debug:以debug形式运行测试案例
2>Run Tests:运行测试案例
3>Stop Test Run:停止案例运行
4>Search Tests:搜索测试案例(可以通过名称或Tag标签搜索案例)
5>Search Keywords:搜索关键字(查找测试库的关键字以及参数和例子)
6>Search Unused Keywords:搜索未使用的关键字
7>Content Assistance:内容助手(用来做脚本补全)
8>Preview:预览(预览测试套件的文件内容,可以选择格式来查看或打印)
9>Manage Plugins:管理插件
10>View All Tags:查看所有Tag
11>Import Library Spec XML:导入测试库描述文件XML(对于不能直接安装的测试库,可以用命令生成XML文档,然后导入,一般不会使用)
12>View RIDE Log:查看RIDE日志
13>Create RIDE Desktop Shortcut:创建RIDE快捷方式(这个可以直接生成快捷方式,比上一篇的更方便,推荐这个,不用改图标哦)
14>Preferences:参数配置
①Saving:可以设置默认的文件格式、文本格式分隔符、行分隔符、单元格之前4个空格分隔
②Importing
Auto imports:设置自动导入哪些Library库
Pythonpath:用于搜索Library库
Library xml directories:用于搜索Library xml目录
③Gird Editor:用于设置写案例的表格里的字体大小和颜色
④Text Editor:用于设置写案例的文本编辑模式里的字体大小和颜色
⑤Excludes:排除(在文本框输入需要排除的路径,一行一个,保存后重新启动生效,RIDE不会去识别该目录下的文件)
4.Navigate导航
1>Go Back:后退
2>Go Forward:前进
5.Macros宏命令
管理运行配置:可以增加或移除操作,增加之后可直接在该选项下点击运行
6.Help
1>Shortcut keys:快捷键列表
2>User Guide:用户指南
3>Report a Problem:报告问题
4>Release notes:更新日志
5>About:关于
三、工程文件区
最简单的工程文件区组成:
工程右键可做操作
1>New Suite:新建测试套件
2>New Directory:新建目录测试套件
3>New Resource:新建资源
4>New User Keyword:新建用户关键字
5>New Scalar:新建变量
6>New List Variable:新建列表型变量
7>New Dictionary Variable:新建词典变量
8>Change Format:修改格式(可以修改工程的格式)
9>Select All Tests:选择全部测试案例
10>Deselect All Tests:取消选择全部测试案例
11>Select Only Failed Tests:只选择失败的测试案例
12>Select Only Passed Tests:只选择成功的测试案例
13>Expand all:展开全部目录
14>Collapse all:折叠全部目录
工作区
1.Edit页面
1>测试套件和资源的编辑页面
两者基本一致
①Source:显示当前套件的路径
②Settings:单击显示
目录型工程和目录型测试套件的Settings设置项
①>Documentation:说明文档,写对当前工程的说明,加粗:XXXX,斜体:XXXX
②>Suite Setup:测试套件初始化
③>Suite Teardown:测试套件结束
④>Test Setup:测试案例初始化
⑤>Test Teardown:测试案例结束
⑥>Force Tags:强制标记,给当前测试套件下的每个测试案例都加上Tag,在测试案例上不能删除,只能在设置的地方删除
③Library:加载测试库
④Resource:加载资源
⑤Variables:加载变量文件
⑥Import Failed Help:导入失败的帮助
⑦Add Scalar:定义变量
⑧Add List:定义列表型变量
⑨Add Dict:定义词典
⑩Add Metadata:定义元数据,定义之后Report和Log显示定义好的内容
2>测试案例的编辑页面
(3.1)创建新工程
点击File→选择New project;
在弹出框中填写项目名称→“type”选择Directory,
“Format”选择ROBOT;
选择好地址;
点击“OK”。
如下图:
(3.2)创建测试套件(suite)
测试套件可以理解为是模块(文件夹)的意思
创建方法:
右键点击First Test,在弹出的右键菜单项中选择New Suite,然后输入测试套名字
快捷键:ctrl+shift+f
(3.3)创建测试用例
创建单独的自动化脚本用例
创建方法:
右键点击test_suite,在弹出的右键菜单中选择New Test Case,输入用例名,保存即可
快捷键:ctrl+shift+t
创建好后层级区别
最外层是项目,一个项目里面可以多有个测试套件(模块),一个套件里可以有多个用例。
如果看到名称前方有个*,代表修改后未保存,记得保存
保存
快捷键:
ctrl+s(局部保存,只保存鼠标点击的部分)
ctrl+shift+s(保存整个工程)
保存之后*号消失
(3.4)Edit介绍
(3):定义元数据
Add Metadata:定义元数据。我们用不着。作用是在 report和 log 里显示定义好的内容,格式和 document 一样
(3.5)导入库
Selenium 是非常流行的开源 web 自动化测试工具,对于大多使用 Robot Framework 框架的人都会使用 Selenium2Library 库来进行 web 自动化测试。所以,我们来学习 Selenium2Library 库。
Selenium 介绍
Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试。
Selenium 的特点:
开源,免费
多浏览器支持:FireFox、Chrome、IE
多平台支持:linux 、windows、MAC
多语言支持:Python、java、Ruby、php、C#、JavaScript
对 web 页面有良好的支持
简单(API 简单)、灵活(用开发语言驱动)
支持分布式测试用例执行
Selenium 是支持多种开发语言的,对于不同的语言来说都有其对应的库。
对 Robot Framework 框 架 的 Selenium 库 有 两 个 :
SeleniumLibrary 和 Selenium2Library 。
SeleniumLibrary 是基于 Selenium1.0 开发的,Selenium2Library 是基于 Selenium2.0 开发的。
如果没有历史遗留问题,我们直接使用 Selenium2Library。里面也包含了SeleniumLibrary里所有的关键字
点击 Edit 标签页右侧的“Library”按钮,来添加库。
在添加库之前,首先库已经在 Python 下进行了安装。
如,添加“Screenshot”库。
如果添加的库不存在或库名错误,将会红色显示,黑库名正常表示正常。
如果你是在“测试套件”中添加的库,那么这个库中所提供的关键字可以被当前测试套件下的用例使用。
如果你是在“测试项目”中添加的库,当前项目下的测试用例不能使用库中的关键字,需要在用例相应的“测试套件”中再次添加库。
按 F5 就可以查看库中所提供的关键字。
导入成功
3.6)导入资源
点击 Edit 标签页右侧的“Resource”按钮来添加资源。
这个资源一般为项目相关的文件。
比如,项目的自定义资源文件。
注意:python 3有个小bug从Resource里导入会导致RIDE崩溃。
可以在Text Edit里写Resource 通用元素层.txt
(3.7)定义变量
点击 Edit 标签页右侧的“Add Scalar”按钮来创建变量。这里创建的变量可以被整个测试套件中的用例所使用。
也可以认为是一个“公共变量”(环境变量)
Name 用于定义变量名,这里给它叫:${abc} Value 用于给变量赋值。这里赋值是一段话:“欢迎大家“
下面就可以在测试用例中来使用这个变量
(3.8)Text Edit 标签
我们在 Edit 标签页完成的工作,都可以在 Text Edit 标签页上完成。
它们之间是对应关系,Edit 可视化的提供的按钮输入框,对于用户来说更容易知道我要怎么做;
而在 Text Edit 中只是一个空当当的文本,我们跟本不知道如何下手。
好在我们已经在 Edit 中做了很多事情。切换到 Text Edit 将会看到这些信息的展示
可以理解位text edit是编写脚本的另外一种方式
测试用例的本来面目也是这个样子的,只是在 RIDE 中对它进行的“美化”。
其实在这个在 Text Edit 下或第三方编辑器下编写 Robot Framework 测试的效率要远远高于 Edit 标签中的“填表格”式编写。 大家前期可以就在表格里填写脚本,后期熟练后可以在其他地方进行尝试。
可以在两种标签页之间切换来提高用例的开发效率
(3.9)Run
(3.10)报告和日志
当用例运行结束,Robot Framework 生成三个文件:output.xml、log.html 和 report.html。output.xml 记录的测试结果是 xml 文件,这个文件不够直观。不建议看。相比较而言 log.html 和 report.html 报告要直观得多,因为是 html 格式的嘛。
查看 log.html 文件,点击 Run 标签而上的“Log”按钮,通过默认浏览器打开。在 log.html 文件中可以查看用例执行的每一步,适合跟踪定义问题。
查看 report.html,点击 Run 标签而上的“Report”按钮,通过默认浏览器打开。report.html 用于最终结果的展示,适合了解测试用例的执行情况:测试了哪些模块,用例数、失败率等
(3.11)测试用例的 Settings
点击测试用例上的“Settings>>”按钮,会看到下面的选项,并且这些选项是可以隐藏的
点击测试套件上的“Settings>>”按钮,也能看到类似的选项
(3.12)右键翻译
项目右键:
套件右键
用例右键:
(4.1)写自动化脚本
首先选中要执行的测试用例,勾选
执行方法:
- 点击工作区中的Run,然后点击Start按钮
- 快捷键:F8
3)选择脚本后,点击
输入框状态:
白色:代表可输入区域
浅灰色:代表有默认值, ----可以不用输入,也可以输入
深灰色:代表无需输入
红色:代表警告报错 ----写错或者未输入
字体状态:
蓝色:代表输入的关键字正确
粗体黑色:代表输入的关键字错误
普通黑色:无实际意义,代表输入正常
绿色:代表输入的是一个变量
紫色:代表该未找到该变量
红色:代表警告报错 ----写错或者未输入
(4.2)执行页面
(4.3)快捷键:
自动补全关键字1——》ctrl+shift+空格
自动补全关键字2——》ctrl+alt+空格
搜索关键字——》F5
执行用例——》F8
保存整个工程——》ctrl+shit+s
局部保存,保存鼠标点击的部分——》ctrl+s
重命名——》F2
显示关键字信息——》 ctrl+鼠标悬浮(鼠标悬浮于关键字上)
创建新工程——》ctrl+n
创建新测试套——》ctrl+shift+f
创建新用例——》ctrl+shift+t
创建新关键字——》ctrl+shift+k
向上移动用例——》ctrl+↑
向下移动用例——》ctrl+↓
删除行——》ctrl+d
删除单元格——》ctrl+shift+d
插入单元格——》ctrl+shift+i
插入行——》ctrl+i
屏蔽代码——》ctrl+#
取消屏蔽——》ctrl+$
查看log——》ctrl+L
查看report——》ctrl+r
注意:如果快捷键不能使用,先看看是否有其他软件已占用相应的快捷键
(4.4)定位元素
对于 Web 自动化测试来说,就是操作页面上的各种元素,在操作元素之间需要先找到元素,换句话说就是定位元素。Selenium2Library 提供了非常丰富的定位器
定位:找到要想去操作的元素的坐标或者位置
虽然有很多种定位方式,并不是要求我们每一种都要学会。
在这里我只介绍 几种常见的定位方式:
id、name、xpath 和 css,class,link。
介绍 id 和 name,是因为这两种定位方式非常简单且实用,
介绍 xpath 和 css,是因为这两种定位方式足够强大,可以满足几乎所有定位需求。
介绍class,link,是因为这种方式很方便,可以减少我们寻找定位的时间.
通常浏览器可以通过 F12 快捷键打开自带的前端工具查 看页面元素。例如:chrome,fixfox,ie
选取页面坐标
id 和name 定位
假如把一个元素看作一个人的话,id 和 name 可以看作一个人的身份证号和姓名。当然,这些属性值是否唯一要看前端开发工程师如何设计了。
一般情况下,同一个页面里的id是唯一的,name并非是唯一的。
根据上面的例子,百度输入框可以取 id 或 name 进行定位。
(前提是 id 和 name 的值在当页面上唯一)
id:
name:
xpath定位:
XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium用户可是使用这种强大语言在 web 应用中定位元素
xpath又被称为万能定位,因为他的用途非常广,可以定位90%的元素
xpath 就是通过这种层级关系和标签属性来找到元素。
先了解一下xpath 的绝对路径
xpath = /html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[1]/input
我们可以从最外层开始找,html 下面的 body 下面的 div 下面的第 2个 div 下面的....input 标签。通过一级一级的锁定就找到了想要的元素。
xptah的绝对路径有没有快点的寻找方式,往下看,一秒钟学会!并找到!
Xpath语法介绍:
1.开头写什么:
(1)单斜杠:/
(2)双斜杠://
(3)开头写单斜杠以及中间写的双斜杠: 单斜杠的话只会找一层, 双斜杠的话会全部找。开头的斜杠可以理解为整个页面。咱们自己写xapth时,开头一般都是些双个斜杠。
2.标签名[@属性名=”属性值”]
(1)标签名可以为一个星号*, 什么意思? 就是指标签名不固定,只要标签的属性名与属性值是写的就行。
3.如果找的标签有多个。
(1)//div[@id="wrapper"]/div[1]
(2)找到一个div后,再他的字标签,如果字标签有多个,可以根据这样的固定写法来找第几个: 标签名[整数] 取第几个,从1开始。
4和5这两种扩展的, 不常用
4.标签名[contains(@属性名, “xxx”)] xxx: 你可以随意些内容
这个标签的属性书名只要包含xxx就能找到。 这种方法一般是为了解决属性值每次刷新页面时发生改变的情况。
<a id=”baidu_123”></a>
找这个标签:
方法一: //a[@id=”baidu_123”]
方法二://a[contains(@id, “baidu”)]
5.标签名[text()=”xxx”]
(1)双边标签里左边和右边中间的文字, 是xxx的就找到。
CSS定位:
(5.1)常用关键字
在学习一门编程语言的时候,大多教材都是从打印“hello world”开始。我们可以像编程语言一样来学习 Robot Framework。
虽然通过 RIDE 提供“填表”一样的写测试用例的方式。但它却有着像编程语言一样的强大的关键字,以及可以开发关键字的扩展能力
查看所有关键字:F5
1.输出打印log:
log 关键字就是编程语言里的“print”一样,可以打印任何你想打印的内容。
在 test case 中填写以下内容:
通过运行结果中看到,
“INFO:”的“hello world” 就是通过 log 关键字打印的信息
2.设置变量 set variable
格式 左边变量名${x} , set variable 右边值
例:把hello world 赋值给a
在text Edit 编辑页面:
输出结果:
3.获取时间:get time
Text Edit:界面
执行结果:
4.强制等待、休眠:sleep:
sleep +整数(单位是:s)
5.if判断语句
通过“run keyword if”关键字可以编写 if 分支语句。
首先定义一个变量 a 等于 xxxx 。
If 判断 a 大于等于 90 ,满足条件 log 输出 “优秀 ”;
不满足上面的条件,接着 else if 判断 a 大于等于 60 ,满足条件 log 输出 “及格”;
不满足上面的条件,接着 else if 判断 a 大于等于 30 ,满足条件 log 输出 “差劲”;
上面的条件都不满足,else log 输出“非常差”。
注:注意 sele if 和 else 前面的三个点点点(...),加...是为了让行不合并,因为理论上是需要在一行里面写
6.for循环
在 Robot Framework 中编写循环通过“:for”
通过“:FOR”定义 for 循环;in range 用于指定循环的范围
7. 调用:Evaluate
它可以使用 Python 语言中所提供的方法
比如随即数random
另外,evalueate还可以直接调用本地的python脚本
(5.2)Selenium2Library关键字
1.Open Browser + URL + 浏览器名
2.览器最大化Maximize Browser Window
Maximize Browser Window 关键字使当前打开的浏览器全屏
后面无需跟参数
3.关闭浏览器 close browser
4.输入文本
input text 输入文本
input password 输入密码
5.点击
click button 点击按钮
Click button 关键字用于点击页面上的按钮。
Click button + 按钮元素的位置
click element 点击元素
Click Element 关键字用于点击页面上的元素,单击任何可以点击按钮、文字/图片、链接、复选框、单选框、甚至是下拉框等。
Click element后面有一个必填参数:
Click element 元素的位置
页面上所有的东西都可以称为元素, 这个也可以当作万能关键字
6.选择窗口
跳转新窗口,当浏览器打开了新的窗口页面时,
可以选择使用该关键字跳转到新的窗口,防止后续定位不到
select window + new 切换新窗口
select window + main 回到主窗口
7.等待
7.1强制等待
为了保证脚本的稳定性,多使用等待.
sleep +整数
7.2隐式等待 Wait Until Page Contains Element
等待某个元素出现
语法如下:
Wait Until Page Contains Element + 元素位置 + 等待时间 报错提示(可以不写)
8.定位下拉框
select from list by index 在通过索引值定位所选项即可
select from list by value 通过下拉框选项中的value值来定位
9.获取文本 get text / get title (获取标题)
获得某个位置的文本信息
语法如下:
变量名 get text 获取文本的位置
设置一个变量来存储某个位置的文本
10.断言 should contain
should contain + 实际值 + 预期值
一般配合get text 一起使用
语法如下:
Should Contain 变量值(实际值) 预期值
如果断言成功,就会执行成功,如果断言失败,就会报错。
[图片上传失败...(image-1253bc-1597575627835)]
断言失败:
11.鼠标悬停 mouse over
悬停,处在悬停状态下,是可以进行选择其他浮层的
语法如下: Mouse Over 悬停元素位置
小技巧:悬停状态下如果无法使用选择器进行选择元素,可以用快捷键,ctrl+shift+c
12.定位嵌套页面
定位嵌套页面
语法如下:Select Frame 嵌套元素位置
备注:有些时候,我们会出现碰见嵌套页面无法定位的情况。这时候,我们就需要先找到嵌套页面的id, 先定位到嵌套页面,再进行正常定位
什么样的属于嵌套页面?
一个页面,进行了跳转,
但是却没有打开新的窗口或者刷新,
只有部分画面跳转到了新的页面,
这种就属于嵌套页面。
通俗来讲,一个html里面如果有两个<html>标签,就属于嵌套。
我们可以用iframe标签来最终判断它是不是一个嵌套页面
13.滑动
selenium不提供滑动定位,可以通过JS进行定位
Execute Javascript + window.scrollTo(0,800)
Execute+Javascript+window.scrollto(0,documen.body.scrollHeight)
6.分层设计
谈到 Robot Framework 分层的思想,就不得不提“关键字驱动”。
回到分层的思想上,程序设计的讲究设计模式,设计模式其实就是根据需求使用抽象与封装,其实就是分层思想。把一个实现过程分成不同多层。提高的灵活性,从而达到可扩展性和可维护性。再回到自动化的话题上,我们可以把操作步骤封装一个一个的方法(关键字),通过调用关键字来实现测试用例。
其实对于每一条测试用例来说,只是搜索的内容不同,
脚本步骤是完全一样的。这样做无疑增加的脚本的冗余,而且不便于维护。假如,百度输入框的定位方式变了,我不得不打开每一条用例进行修改。
我们可以过创建关键字的方式,从而实现分层的思想来解决这个问题。
自动化测试用例时会分为元素层,页面层,用例层。
元素层:把单步(每一步)操作封装成关键字。
先导入 Selenium2Library库
页面层:把单个页面的所有操作封装成关键字。
先导入元素层的关键字:且元素层导入的库也可以使用
用例层:所要编写成脚本的每个测试用例中涉及的所有页面操作
先导入页面层的关键字