提示:仅作参考
先安装RIDE工具
1、安装python,建议3.8
2、修正环境变量及镜像库地址
3、安装RIDE
pip install wxpython
pip install selenium
pip install robotframework
pip install robotframework-ride(python3.8及以上版本不兼容,需额外安装Beta版【如下倾斜部分】):
pip install psutil
pip install -U --pre robotframework-ride
pip install robotframework-seleniumlibrary
一、创建第一个自动化脚本
1.创建测试项目
选择菜单栏 file---->new Project
Name 输入项目名称
Type 选择 Directory
2.创建测试套件
右键点击”测试项目“选择new Suite选项
Name 输入项目名称
Type 选择 File
3.创建测试用例
右键点击”测试套件“选择new Test Case
只需要输入用例name,点击OK即可。
4.导入selenium2library库
因为RF框架编写基于WEB的测试用例,所以我们需要selenium库的支持,我们在使用的过程中需要加载selenium2library库。
在”测试套件“的Edit标签页,点击”Library“按钮,弹出输入框,Name输入:Selenium2Library,点击OK完成。
如果导入的库显示为红色表示导入的库不存在,如果是黑色表示导入成功。
5.编写测试用例
下面就可以开始写测试用例了,可是怎么写呢?我们可以通过F5快捷键来查询脚本的关键字。
自动化脚本从打开浏览器开始。如上图,想要打开一个浏览器,想的是”open“关键字,进行搜索,找到一个”Open Browser“关键字,点击这个关键字,可以显示它的用法和说明。根据说明,来尝试创建打开浏览器的操作:
”Open Browser“变蓝了,说明它是合法的关键字,后面的一个方框是红色的,表示这个参数是必填的。通过说明信息,了解到需要填URL地址,还需要指定browser(默认不填时为Firefox)。
更多关键字的使用,请参考相关API文档。
按照上面的方法,创建登录设备Web用例如下:
6.运行测试用例
勾选当前需要运行的测试用例,点击工具栏运行按钮,如果只运行单个用例,可以切换到用例的Run标签页,点击”start“按钮。
运行结果:
运行信息显示会生成三个文件:Output.xml、Log.html、Report.html
重点查看Log.html和Report.html,Log.html更关注脚本执行过程的记录,Report.html更关注脚本执行结果的展示。
快打开你的测试报告看看效果吧!
二、Selenium元素定位
1.id和name定位
假如把一个元素看作一个人,id和name可以看作这个人的身份证号和姓名。当然,这些属性值未必是唯一的,要看前端工程师是如何设计的。
例如一个登录页面:
......//省略
<Input class="m-wrap placeholder-no-flx required text_lang placeholder" type="text" autofocus autocomplete="off" id="user_name" name="user_name" placeholder="Username">
<Input class="m-wrap placeholder-no-flx text_lang placeholder" type="password" autocomplete="off" id="password" name="password" placeholder="Password">
......//省略
<button id="login_button" type="submit" class="btn login-btn">
<span class="text_lang">Login</span>
</button>
......//省略
根据上面的例子,登录页面可以取id或name进行定位。前提是id和name的值在当前页面上唯一。
用户名输入框:id=user_name name=user_name
密码输入框:id=password name=password
在Robot framework中是这样写的:
Input Text | id=user_name | admin |
---|---|---|
Input Text | name=password | 12345678 |
Input Text用于输入框的关键字,”admin“、”12345678“是要给输入框的内容。
登录按钮只id数据可以利用:
登录按钮 id=login_button
Click Button | id=login_button |
---|
Click Button是按钮点击的关键字。
2.xpath定位
假如一个人没有身份证号没有名字怎么找?想想你的朋友,你想要找他吃饭,手机不通,电话不回,可以直接上他家去找,那你一定有他家的地址,xx市xx区xx路xx号。Xpath就可以通过这种层级关系找到元素。
来看看下面页面输入框在整个页面上的位置:
<html>
<head>
<body >
<div id="wrapper" style="display: block;">
<div id="debug"></div>
<div id="u"></div>
<div id="head"></div>
<div id="content" style="display: block;">
<div id="u1" style="display: block;"> </div>
<div id="m">
<p id="lg">
<p id="nv">
<div id="fm">
<form id="form1" class="fm" action="/s" name="f1">
<span class="bg s_ipt_wr">
<input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">
</span >
</form >
</div>
</div>
</div>
</div>
</body>
<html>
(1).xpath的绝对路径:
Xpath = /html/body/div[1]/div[4]/div[2]/div/form/span[1]/input
我们可以从最外层开始找,html 下面的body 下面的div 下面的第4 个div 下面的…input 标签。通过一级一级的锁定就找到了想要的元素。
提示:不推荐使用绝对路径,一旦代码层级结构进行调整,测试用例就要随着改动。
(2).xpath的相对路径:
绝对路径的用法往往是在我们迫不得已的时候才用的。大多时候用相对路径更简便。
a.元素本身:
Xpath 同样可以利用元素自身的属性:
Xpath = //[@id=’kw1’]
//表示某个层级下,*表示某个标签名。@id= user_name 表示这个元素有个id 等于user_name 。
当然,一般也可以制定标签名:
Xpath = //input[@id=’kw1’]
元素本身,可以利用的属性就不只局限为于id 和name ,如:
Xpath = //input[@type=’text’]
Xpath = //input[@autocomplete=’off’]
但要保证这些元素可以唯一的识别一个元素。
b.找上级:
当我们要找的一个人是个刚出生的婴儿,还没起名子也没有身份证号,但是你的父亲是有唯一的名字和身份证号的,这样我们可以先找到你父亲,自然就可以找到你。
元素的上级属性为:
<form id="form1" class="fm" action="/s" name="f1">
<span class="bg s_ipt_wr">
<input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">
找爸爸:
xpath = //span[@class=’bg s_ipt_w’]/input
如果爸爸没有唯一的属性,可以找爷爷:
xpath = //form[@id=’form1’]/span/input
这样一级一级找上去,直到html ,就是一个绝对路径了。
c.布尔值写法:
如果一个人的姓名不是唯一的,身份证号也不是唯一的,但是同时叫张三并且身份证号为
123 的人却可以唯一的确定一个人。那么可以这样写:
Xpath = //input[@id=’kw1’ and @name=’wd’]
可以and ,当然也可以or :
Xpath = //input[@id=’kw1’ or @name=’wd’]
但or 的实际意义不太。我们一般不需要说,一个人的名字或者叫张三,或者身份证号是123。
Input Text | xpath = //*[@id=’kw1’’] | admin |
---|---|---|
Input Text | xpath = //span[@class=’bg s_ipt_w’]/input | admin |
Input Text | xpath = //input[@id=’kw1’ and @name=’wd’] | admin |
3.CSS定位
css定位更灵活,因为它用到更多的匹配符和规格。
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .intro | 选择class="intro"的所有元素 |
#id | #firstname | 选择id="firstname"的所有元素 |
同样以上面输入框的代码,我们来看看CSS 如何定位。
<form id="form1" class="fm" action="/s" name="f1">
<span class="bg s_ipt_wr">
<input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">
id 定位:css=#kw1
class 定位:css=.s_ipt
其它属性:
css=[name=wd]
css=[type=text]
css=[autocomplete=off]
父子定位:
css=span > input
css=form > span > input
根据标签名定位:css=input
Robot framework 中的写法:
Input Text | css=#kw1 | admin |
---|---|---|
Input Text | css=.s_ipt | admin |
Input Text | css=[name=wd] | admin |
同样一个元素,CSS 的不同规则,可能有几十上百种写法。CSS 更灵活强大,但是相比path 的学习成本为更高。但是css 和xpath 两种定位方式是一定要学会一种,不然你的自动化工作无法开展。
三、Robot FrameWork API
提示:此文档只是将最常用的UI操作列出。更多方法请查找selenium关键字库。
1.浏览器驱动
通过不同的浏览器执行脚本
Open Browser | http://192.1.1.1 | Chrome |
---|
浏览器对应的关键字:
firefox/ff | FireFox |
---|---|
Internetexplorer/ie | Internet Explorer |
googlechrome/gc/chrome | Google chrome |
opera | Opera |
android | Android |
iphone | iPhone |
safari | Safari |
提示:要想通过不同的浏览器打开URL地址,一定要安装浏览器对应的驱动。如chrome驱动chromerdriver.exe等。
浏览器默认为空时启动FireFox。
2.关闭浏览器
关闭当前的浏览器:
Close Browser
关闭所有打开的浏览器,并将浏览器缓存重置:
Close All Browsers
3.浏览器最大化
使当前打开的浏览器全屏:
Maximinze Browser Window
4.设置浏览器宽、高
Set Windows Size | 800 | 600 |
---|
以像素为单位,第一个参数800表示宽度,第二个参数600表示高度
5.文本输入
Input Text | xpath=//*[@] | 输入信息 |
---|
xpath=//*[@]表述元素定位,定位文本输入框
6.点击元素
Click Element | xpath=//*[@] |
---|---|
Click Button | xpath=//*[@] |
7.注释
Comment | 注释说明 |
---|---|
#注释说明 |
除了使用Comment关键字进行注释,Robot Framework框架是基于python语言开发的,所以提供了python语言的注释“#”方式。
8.固定休眠时间
sleep | 42或1.5或2minutes 10seconds |
---|
sleep表示执行到当前行固定休眠多长时间,以秒为单位
42表示42秒
1.5表示1.5秒
2minutes 10seconds表示2分10秒
9.等待元素出现在当前页面
a.等待元素出现在当前页面:
Wait Until Page Contains Element | xpath=//*[@] | 42 | error |
---|
xpath=//*[@]表示元素定位,这里定位出现的元素
42表示最长等待时间
Error表示错误提示,自定义错误提示,如“元素不能正常显示”
b.等待元素文本出现在当前页面:
Wait Until Page Contains | text | 30 | error |
---|
text表示这里出现的文本
30表示最长等待时间
Error表示错误提示,自定义错误提示,如“元素不能正常显示”
c.判断元素出现在当前页面:
Page Should Contain Element | xpath=//*[@] | admin |
---|
xpath=//*[@]表示元素定位,这里定位出现的文本
admin表示元素的值
10.获取title
获取当前浏览器窗口的title信息:
Get Title
这里只获取title是没有意义的,我们通常会将取的title传递给一个变量,然后与预期结果进行比较。从而判断当前脚本是否执行成功。
11.获取文本信息
Get Text | xpath=//*[@] |
---|
xpath定位文本信息的元素
12.获取元素属性值
Get Element Attribute | id=kw@name |
---|
id=kw@name :id=kw表示定位的元素。@name表示获取这个元素的name属性值。
13.cookie处理
关键字 | 参数1 | 参数2 | 解释 |
---|---|---|---|
get cookies | 获取当前浏览器的所有cookie | ||
get cookie value | key_name | 获取cookie的值,key_name表示一对cookie中key的name | |
delete cookie | key_name | 删除key为name的cookie信息 | |
delete all cookies | 删除当前浏览器的所有cookie | ||
add cookie | key_name | value_name | 添加一对cookie(key:value) |
14.声明变量
${a} | Set Variable | hello |
---|
定义变量a为hello。
${a} | ${b} | Set Variable | hello | world |
---|
定义变量a为hello,b为world。
15.日志(输出)
${a} | Set Variable | Hello World |
---|---|---|
log | ${a} |
在测试报告中输出a变量的值hello world。
16.下拉框选择和去选择
关键词 | 定位器 | 值 |
---|---|---|
Select From List By Value | xpath=//*[@] | value |
Unselect From List By Value | xpath=//*[@] | value |
xpath=//*[@]定位下拉框
value选择下拉框里的属性值
17.IF分支语句
${a} | Set variable |
---|---|
电脑 | |
手 |
首先定义两个变量a ,b 分别为2和5 。
If 判断a大于等于1 ,满足条件log 输出“a 大于1 ”;
不满足上面的条件,接着else if 判断b 小于等于5 ,满足条件log 输出“b 小于等于5”;
上面两个条件都不满足,else log 输出“上面两个条件都不满足”。
提示:注意else if 和else 前面的三个点点点(…)
18.For循环语句
循环1:
:FOR | ${i} | in range | 10 |
---|---|---|---|
- | log | ${i} |
查看结果:
循环变量i从0到9循环10次。
循环2:
@{a} | create list | aaa | bbb |
---|---|---|---|
:FOR | ${i} | in | @{a} |
-------- | ----- | ----- | ----- |
- | log | ${i} |
@{a}定义一个字符串列表
通过in可以遍历非整型(in range):
说明:
log、if分支、for循环并非selenium关键字库提供的方法,是由BuiltIn包提供的。
四、Robot FrameWork 分层设计
谈到Robot Framework 分层的思想,就不得不提“关键字驱动”。
关键字驱动: 通过调用的关键字不同,从而引起测试结果的不同。
在上一节的selenium API 中所介绍的方法其实就是关键字,如“open browser” 就是一个关键字。从底层去看就是通过编程去现实的一个方法。
def open_browser(url,browser):
#通过browser 找到相应的浏览器驱动,调用浏览器,借助python 的httplib、urllib 模块将url 传递给浏览器。从而实现open brwoser 的目的。
通过上面的伪代码表述的“关键字”的底层其实还是程序定义的方法。
回到分层的思想上,在程序设计的讲究设计模式,设计模式其实就是根据需求使用抽象与封装,其实就是分层思想。把一个实现过程分成不同多层。提高的灵活性,从而达到可扩展性和可维护性。
再回到自动化的话题上,我们可以把操作步骤封装一个一个的方法(关键字),通过调用关键字来实
现测试用例。
对于点击Web导航菜单,只是一级与二级目录的内容不同,脚本步骤是完全一样的。这样做无疑增加的脚本的冗余,而且不便于维护。我们可以过创建关键字的方式,从而使用分层的思想来解决这个问题。
1.创建用户关键字
Robot Framework创建关键字步骤:
(1).创建资源
右键“导航菜单”选择“new resource”创建资源:
输入资源名称:
(2).创建关键字
右键“导航菜单”选择“new User Keyword”来创建用户关键字:
输入关键字的名称:
(3).编辑关键字
分析:
对于一个测试用例来说,用户关心的是输入什么内容,得到什么结果。
对于“导航”关键字来说,需要创建两个接口变量$ {firstmenu}和${secondmenu} ,用于指定要点击的目录。
2.添加调用关键字
(1).添加创建的资源
切换到测试套件(设备信息)页面,添加资源(导航菜单.robot)
(2).调用关键字
现在就可以在测试用例中使用创建的关键字了(导航):
五、全局变量
一般在资源文件中定义全局变量,通过给全局变量赋不同的值,从而引起测试结果的不同。如同一个项目的测试用例,需要在不同设备运行。那么将ip地址、用户名、密码定义成全局变量放到资源文件。
1.创建资源
Robot Framework创建全局变量步骤:
(1).创建资源
右键“测试项目”选择“new resource”创建资源:
输入资源名称:
(2).创建全局变量
右键“Resource”选择“new Scalar”创建资源:
输入变量名称:
(3).给变量赋值
2.添加创建的资源
切换到测试套件(登录)页面,添加资源(Resource.txt)
3.调用全局变量
在测试用例需要使用变量值的地方,填写定义的全局变量名称。