#yyds干货盘点# RobotFramework从基础到项目实战
Posted 测试玉米君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# RobotFramework从基础到项目实战相关的知识,希望对你有一定的参考价值。
一、基础必备
1、简介与特点
RF是一个基于python语言开发的,可扩展的,以关键字驱动模式,结合Selenium实现的一个开源的自动化测试框架。
RF在2019年的7月之前,支持2.7;RF在2019年7月之后,支持3.7。
目前主流的自动化测试框架,RF、AirTest
数据驱动和关键字驱动
-
数据驱动:把测试用例的数据单独的提取出来,放到excel里面或者yaml文件里面,通过改变excel或者yaml文件汇总的数据来驱动用例执行。
- 关键字驱动:把项目中的逻辑封装成一个关键字,调用不同的关键字来实现不同的逻辑,从而驱动用例执行。
特点:
1、编写用例简单,可以以robot.txt,csv,html的格式来保存用例
2、自动生成html格式的自动化测试报告日志。
3、除了自带的类库之后,还有很多扩展库。
4、根据项目的需要,自定义关键字。(自定义关键字其实就是业务逻辑)
5、使用命令行的方式,和jenkins集成。
2、RF环境安装
以管理员的身份打开dos窗口
- 安装python3.7.3,配置环境变量,下载谷歌的浏览器驱动,放到python目录下
- 在dos命令下输入:pip install robotframework==3.1(安装此版本,比较稳定)
- 在dos命令下输入:pip install robotframework-ride (相当于开发工具,pycharm)
- 在dos命令下输入:pip list
- 在dos命令下输入:ride.py或者点击桌面的ride快捷方式
【注意】如果pip命令使用不可,说明python路径下scrip目录没有配置到path下:D:\\Program Files\\Python37\\Scripts
3、RIDE界面的介绍
Edit四大块:(setting设置、导入外部文件、定义内部变量、定义元数据)
- setting:测试套件的准备工作、测试套件的扫尾工作、测试用例的准备工作、测试用例的扫尾工作、强制标记
4、RF类库的介绍
1、标准库:BuiltIn(测试库)、Collections(集合库)、DateTime(时间库)、Screenshot(截屏库)
2、扩展库
Web自动化测试:SeleniumLibrary , Selenium2Library ,Selenium2Library for java
App自动化测试:AppiumLibrary
API接口自动化测试:RequestsLibrary
安装:pip install robotframework-seleniumlibrary
标准库的位置:C:\\python373\\Lib\\site-packages\\robot\\libraries
扩展库的位置:C\\python373\\Liblsite-packages
5、基础应用
-
新建项目 dictionary
-
新建文件 txt
- 新建用例
快捷键:
F5——搜索关键字,弹出窗口,搜索关键字,下面会有说明,来源于哪些库,example表示关键字使用的实例
ctrl+shift+空格 ——自动补全关键字,如果是蓝色表示关键字是OK的,关键字后面红色的单元格表示需要输入关键字参数,根据example实例填写
6、关键字的使用
备注 | 关键字 | 输入内容 | ||||
---|---|---|---|---|---|---|
Comment | 注释内容 | |||||
定义变量 | ${a} | 变量名 | ||||
Log | ${a} | |||||
Comment | 获取系统时间 | |||||
${times} | get time | |||||
Log | ${times} | |||||
Comment | 强制等待 | |||||
sleep | 3 | |||||
Comment | 字符串拼接 | |||||
${total_str} | Catenate | SEPARATOR=|| | 张三 | 李四 | ||
Log | ${total_str} | |||||
Comment | 创建列表 | |||||
${list2} | create list | oracle | mysql | sqlsever | ||
Log | ${list2} | |||||
@{list1} | create list | oracle | mysql | sqlsever | ||
Log Many | @{list1} | |||||
Comment | 创建字典 | |||||
${dic} | Create Dictionary | name | 张三 | age | 18 | |
Log | ${dic} | |||||
获取字典的键 | ${dic_keys} | Get Dictionary Keys | ${dic} | |||
Log | ${dic_keys} | |||||
获取字典的值 | ${dic_values} | Get Dictionary Values | ${dic} | |||
Log | ${dic_values} | |||||
获取字典 | ${key_value} | Get From Dictionary | ${dic} | |||
Log | ${key_value} | |||||
Comment | 调用外部文件 | |||||
导入外部文件的方式以及使用方法 | ${rand_num} | Evaluate | random.randint(1,10) | modules=random | ||
Log | ${rand_num} | |||||
Comment | 流程控制IF语句 | |||||
${num} | Set Variable | 100 | ||||
Run Keyword If | 80<=${num}<=100 | log | 优秀 | |||
... | Else IF | 60<=${num}<80 | log | 一般 | ||
打印输出单个内容 | ... | Else | log | 较差 | ||
多个打印输出,需要先自定义关键字,然后Else后输出 | ... | Else | 自定义关键字(可以为中文) | |||
commnet | 流程控制FOR语句1 | |||||
For | ${a} | IN | apple | balala | lemon | |
Log | ${a} | |||||
END | ||||||
Comment | 流程控制FOR语句2 | |||||
FOR | ${a} | IN RANGE | 1 | 11 | ||
当变量a的值为5时,就退出循环不打印 | Run Keyword If | ${a}==5 | Exit For Loop | |||
log | ${a} | |||||
END | ||||||
Comment | 流程控制FOR语句3 | |||||
@{list} | create list | apple | balala | orange | ||
FOR | ${a} | IN | @{list} | |||
log | ${a} | |||||
END |
二、项目实战
1、seleniumLibrary安装
pip install robotframework-seleniumlibrary
2、浏览器关键字应用
Comment | 打开浏览器 | |
Open Browser | http://www.baidu.com/ | |
Comment | 设置浏览器隐式等待 | |
Set Browser Implicit Wait | 5 | |
comment | 设置浏览器的强制等待 | |
sleep | 3 | |
Comment | 设置浏览器最大化 | |
Maximize Browser Window | ||
Set Window Size | 800 | 800 |
Comment | 获取浏览器的尺寸 | Get Window Size |
${Width} | ${height} | |
comment | 后退一步 | |
Go back | ||
comment | 前进一步 | |
Go To | http://www.baidu.com/ | |
comment | 刷新 | |
Reload Page | ||
comment | 获取网页标题 | |
${title} | Get title | |
comment | 获取网页的URL | |
${location} | Get Location |
3、元素定位详解
8种元素定位方式:id,name,link.partail_link.xpath.css.tag_name.class_name
3.1 xpath定位
- 通过绝对路径来定位——基本不用,路径容易改变
- 通过相对路径来定位:
- //from/span/input
- //from/span[2]/input
- 通过属性定位:找到唯一的属性,将双引号改成单引号
- //input[@autocomplete=off]
- 通过部分属性定位
- //input[start=with(@autocomplete,of")]
- 通过文本定位
- //a[@text()=新闻]
3.2 CSS定位
- 通过ID(#)和class()来定位:
- css=input#kw
- css=input.s_ipt
- 通过属性定位:input[autocomplete=off]
- 通过部分的属性定位:input[autocomplete^=of)]
- 通过子元素定位:通过子元素:div#s-top-left
3.3案例详解
备注 | 关键字 | 内容 | |
---|---|---|---|
open Browser | http://www.baidu.com/ | ||
Set Browser Implicit Wait | 5 | ||
comment | 通过ID定位 | ||
Input Text | id=kw | 知乎 | |
Input Text | name=wd | 知乎 | |
Input Text | identifier=kw | 知乎 | |
Comment | 定位讲解 | ||
点击元素,用这种比较靠谱 | Click Element | link=新闻 | |
部分链接定位 | Click Element | partial link=新 | |
相对路径定位方式 | Input Text | Xpath=//from/span/input | 知乎 |
通过属性定位 | Input Text | Xpath=//input[@autocomplete=off"] | |
通过部分属性定位 | Click Element | Xpath=//input[start=with(@autocomplete,of")] | |
通过文本定位 | Click Element | Xpath=//a[@text()=新闻] | |
通过CSS定位 | Input Text | css=input#kw |
4、元素操作API
备注 | 关键字 | 内容 | ||
---|---|---|---|---|
open Browser | http://www.baidu.com/ | chrome | ||
Set Browser Implicit Wait | 5 | |||
在输入框输入需要查找的内容 | Input Text | id=kw | 知乎 | |
提交表达 | submit Form | id=form | ||
清空输入框 | Clear Element | id=kw | ||
get text获得元素的文本 | ${text} | Get Text | xpath=//a[http] | |
输入查找的内容 | Input Text | id=kw | 知乎 | |
get element attribute获得元素属性的值 | ${value} | Get Element attribute | id=kw | value |
5、frame处理
在谷歌console下可看框架
frame:框架
iframe:子框架
备注 | 关键字 | 内容 | |
---|---|---|---|
进入框架 | Select framename | name=框架名 | |
跳出框架; | Unselect frame | name=框架名 |
6、下拉框处理
备注 | 关键字 | 内容 | |
---|---|---|---|
选择下拉框:先定位再选择,通过下标选中,此处通过值来选中框架 | Select From List By Value | name=框架名 | value的值 |
通过下标去选中 | Select From List By Index | name=框架名 | index的值,从0开始 |
通过文本选中 | Select From List By Label | name=框架名 | 文本 |
7、属性JS弹窗处理
常见弹窗类型:
alert():只有一个确定的按钮
confirm():有【确定】、【取消】按钮
prompt():多了一个输入框,有【确定】、【取消】按钮
8、定位为一组元素
当定位时发现元素额HTML脚本完全一样时,那么就要定位一组元素,例如,每一行都有删除图标
关键字 | 内容 | ||||
---|---|---|---|---|---|
Comment | 新内容 | ||||
${eleList} | Get WebElements | xpath=//img[src=images/icon trash.gif] | |||
Sleep | 1 | ||||
不输入任何表示默认点击确定按钮 | Handle Alert | ||||
点击取消按钮 | Handle Alert | action=DISMISS | |||
Handle Alert | DISMISS | 1 min | |||
取弹窗的内容 | ${message} | Handle Alert | action=LEAVE(或者此格为空) | ||
${message} | action=accept | ||||
让弹窗停留指定时间 | Handle Alert | timeout=10s | |||
comment | 定位删除数据,执行批量删除 | ||||
${checkboxList} | Get WebElements | name=checkboxes[] | |||
Click Element | ${checkboxList[0]} | ||||
Click Element | ${checkboxList[1]} | ||||
comment | 循环语句批量删除 | ||||
${checkboxList} | Get WebElements | name=checkboxes[] | |||
FOR | ${a} | IN RANGE | 0 | 2 | |
Click Element | ${checkboxList[${a}]} | ||||
END | |||||
不懂 | Sclect From List By Value | id=selAction | trash | ||
Handle Alert |
9、断言
TBD
三、持续集成
1、项目分层设计
1.1为什么要分层
- 实现对页面元素,公共方法,公共数据,测试用例集中管理。
- 增加脚本的可重复利用
- 增加脚本的可重复利用
1.2 三层架构
-
页面元素层
-
业务逻辑层
- 测试用例层
业务逻辑层调用页面元素层,测试用例层调用业务逻辑层
1.3 案例
-
工程文件名robot
- 公共部分文件夹名称robot
- 公共元素.txt——存放执行测试的公共操作
- 打开浏览器(新建关键字)
- 关闭浏览器
- 隐式等待
- 线程等待
- 进入框架
- 退出框架
-
公共数据.txt
- ${username}
- ${password}
- ${url}
-
页面元素文件夹名称robot
- 登录页(新建关键字)
- 输入用户名(新建关键字)
- 输入密码(新建关键字)
- 点击登录按钮(新建关键字)
-
商品管理robot
- 商品列表robot
- 商品列表页.txt
-
登录文件夹名称robot(即模块名称的文件夹)
-
登录用例(File,TXT)
- 01登录成功
【导入公共元素.txt(操作)、公共数据.txt(数据)、登录业务(决定操作先后的逻辑).txt】
-
02用户名为空——用户名为空,用\\表示
- 03用户名有误
-
登录业务.txt——此处存放登录的业务逻辑,导入公共元素的资源文件
- 登录(新建关键字)
【在登录下面,直接通过中文写用例】
-
商品管理文件夹名称robot(即模块名称的文件夹,与系统架构一致)
- 商品列表
- 商品列表用例
- 商品列表业务.txt
- 添加新商品
2、非GUI方式运行
非GUI——非页面方式来运行,这种方式可以与Jenkins来集成
pybot -d 【测试报告导出路径】 【项目路径】
运行结果:用例执行成功后,测试报告导出路径下生成相应的测试报告、日志等
3、插件下载和jenkins持续集成
-
前置准备工作:安装jenkins
-
在jenkins中安装RF的插件,在jenkins中的可选插件中搜索
-
新建item
-
勾选触发器,选择Build periodically
日程表:40 21***
-
执行命令:pybot -d 【测试报告导出路径】 【项目路径】
-
增加构建后的操作:RF 测试结果
输入测试结果的路径
相应测试报告的名称
以上是关于#yyds干货盘点# RobotFramework从基础到项目实战的主要内容,如果未能解决你的问题,请参考以下文章