RobotFramework框架
一、简介和特点
基于python开发的、可扩展的,以关键字驱动的自动化测试框架
-
数据驱动:
数据驱动是把测试用例的数据放到excel、yaml里面,然后通过改变excel或者yaml文件里面的数据,达到控制测试用例的执行过程
-
关键字驱动:
把项目中的一些业务逻辑或基本的操作封装成一个一个的关键字,然后调用不同的关键字或者关键字的组合实现不同的业务逻辑
-
特点:
- 编写用例更方便,可以以robot,txt,html等格式
- 自动生成htm格式的测试报告(unittest:htmltestrunner,pytest:allure)
- 自带很多类库,支持很多扩展库
- 可以根据我们业务逻辑的需要自定义关键字(登录,下订单,评论)
- 支持非GUI方式运行,还可以和Jenkins持续集成
二、搭建RF测试环境
-
先安装python,并配置环境变量
-
pip install robotframework
-
pip install robotframework-ride(生成快捷方式)
-
检查是否安装完成
pip list
三、RIDE的基本使用
-
测试套件
-
Edit标签:
Setting 设置
加载外部文件(扩展库,资源文件,变量文件,帮助文档)
定义内部变量
定义元数据
-
四、RF类库和扩展库
-
标准库(RF自带的库,不需要额外安装)
BuitIn
Collections(集合库)
DateTime(时间库)
Screenshot(截屏库)
-
扩展库(需要通过pip命令额外安装的库)
-
web自动化:SeleniumLibrary
安装:pip install robotframework-seleniumlibrary
-
接口自动化:RequestLibrary
安装:pip install robotframework-request
-
app自动化:AppiumLibrary
安装:pip install robotframework-appiumlibrary
-
存储的位置:E:\SoftWare\Python\Lib\site-packages
-
五、RF的基本使用
六、RF关键字
-
常规关键字
*** Settings *** Library Collections *** Test Cases *** 测试用例test Log 码尚学院 # 打印 # 定义变量 ${a} set variable 100 log ${a} # 获取系统时间 ${time} get time log ${time} # 字符串拼接 ${str} catenate 百里 星瑶 微微 log ${str} ${str} catenate SEPARATOR= # \ \ \ 百里 \ \ \ 星瑶 \ \ \ 微微 log ${str} # 创建列表 ${list} Create list 百里 星瑶 微微 log ${list} @{list} Create list 百里 星瑶 微微 log many @{list} # 字典关键字 ${dic} create dictionary name=百里 age=38 # 获取字典所有key log ${dic} ${keys} Get Dictionary Keys ${dic} log ${keys} # 获取字典所有values ${values} get dictionary values ${dic} log ${values} # 通过key取value ${value} get from dictionary ${dic} name log ${value}
*** Settings *** Library Collections Library Screenshot *** Test Cases *** 常规关键字 Log 码尚学院 # 打印 # 定义变量 ${a} set variable 100 log ${a} # 获取系统时间 ${time} get time log ${time} # 字符串拼接 ${str} catenate 百里 星瑶 微微 log ${str} ${str} catenate SEPARATOR= # \ \ \ 百里 \ \ \ 星瑶 \ \ \ 微微 log ${str} # 创建列表 ${list} Create list 百里 星瑶 微微 log ${list} @{list} Create list 百里 星瑶 微微 log many @{list} # 字典关键字 ${dic} create dictionary name=百里 age=38 # 获取字典所有key log ${dic} ${keys} Get Dictionary Keys ${dic} log ${keys} # 获取字典所有values ${values} get dictionary values ${dic} log ${values} # 通过key取value ${value} get from dictionary ${dic} name log ${value} 复杂关键字 # 执行python方法 ${rand} evaluate random.randint(1, 101) modules=random log ${rand} ${time} evaluate time.time() modules=time log ${time} # 执行py文件里面的关键字 ${x} evaluate int(10) ${y} evaluate int(20) import library E:/test.py ${result} sum ${x} ${y} log ${result} #流量控制if ${a} set variable 86 run keyword if ${a}<60 log 不及格 ... ELSE IF ${a}<80 log 一般 ... ELSE log 优秀 #流程控制for FOR ${a} IN apple orcale banana log ${a} END #列表方式 @{list} create list apple orcale banana FOR ${a} IN @{list} log ${a} END #写法3 FOR ${a} IN RANGE 1 11 Run Keyword If ${a}==6 Exit For Loop Log ${a} END # 截图 Take Screenshot
七、准备WEB自动化环境
-
web自动化关键字
*** Settings *** Library SeleniumLibrary *** Test Cases *** # 打开浏览器并且加载网页 打开浏览器 Open Browser url=http://www.baidu.com browser=chrome # 设置隐式等待 Set Browser Implicit Wait 3 Sleep 2 # 设置浏览器最大化 Maximize Browser Window Sleep 2 # 设置浏览器的宽度和高度 Sleep 2 Set Window Size 600 800 # 获得浏览器的宽度和高度 Sleep 2 ${width} ${height} Get Window Size Sleep 2 # 回退 Go Back # 前进 Go To http://www.csdn.com # 刷新 Reload Page # 获得标题 ${title} Get Title # 获得浏览器地址 ${location} Get Location # 关闭浏览器 Close Browser
八、元素定位
前提:元素或属性必须唯一
八种元素定位方式:id\name\link_text\partial_link\xpath\css\class_ame\tag_name
绝对路径:以/开头,绝对路径是从网页的第一个标签开始查询元素
xpath=/html/body/div[1]/div/div[5]/div/div/form/span[1]/input
相对路径:以//开头,相对路径是从网页的任意标签开始查询元素
-
相对路径+索引定位 //form/span/input
-
相对路径+属性定位 //input[@autocomplete=“off”]
-
相对路径+部分属性值定位
- 以什么开头 //input[starts-with(@autocomplete,‘of’)]
- 以什么结尾 //input[substring(@autocomplete,2)=‘ff’]
- 包含 //input[contains(@autocomplete,‘of’)]
-
相对路径+通配符定位
- //*[@id=‘kw’]
- 一般不建议大家复制xpath使用
- 复制的xpath性能较低
- 复制的xpath比我们手写的要复杂
- 有些元素是动态的,复制的xpath完全失效
-
相对路径+文本定位
- //span[text()=“按图片搜索”]
-
CSS定位
-
绝对路径
xpath=html>body>div[1]>div>div[5]>div>div>form>span[1]>input
-
相对路径
*** Settings *** Library SeleniumLibrary *** Test Cases *** # 打开浏览器并且加载网页 元素定位 Open Browser url=http://www.baidu.com browser=chrome Set Browser Implicit Wait 2 # id定位 Input Text id=kw 自动化测试 Click Element id=su # name定位 Input Text name=wd 自动化测试 Click Element id=su # link_text链接文本定位 Click Element link=新闻 # particl_link 部分链接 Click Element partial link=新 Sleep 3 # xpath定位 Input Text xpath=/html/body/div[1]/div/div[5]/div/div/form/span[1]/input 自动化测试 Click Element id=su Input Text xpath=//input[starts-with(@autocomplete,'of')] 自动化测试 Input Text xpath=//input[substring(@autocomplete,2)='ff'] 自动化测试 Input Text xpath=//input[contains(@autocomplete,'of')] 自动化测试 Input Text xpath=//*[@id='kw'] 自动化测试 Input Text xpath=//span[text()="按图片搜索"] 自动化测试 Click Element id=su # CSS定位 # 通过ID定位 Input Text css=#kw 自动化测试 Click Element id=su # 通过class定位 Input Text css=input.s_ipt 自动化测试 Click Element id=su # 清空元素 Clear Element Text id=kw
-
九、操作元素的关键字
-
操作元素
*** Settings *** Library SeleniumLibrary *** Test Cases *** 常规元素操作 Open Browser http://www.baidu.com chrome # 获取元素文本信息 ${text} Get Text xpath=//a[@href='http://news.baidu.com'] # 获取元素属性 ${attribute} Get Element Attribute xpath=//a[@href='http://news.baidu.com'] class 鼠标和键盘关键字 Open Browser http://www.baidu.com chrome # 双击元素 Double Click Element id=kw # 键盘事件 Press Key id=kw autotest Sleep 3 Close Browser 断言关键字(系统断言) # 系统断言 ${a} Set Variable zhangsan Should Be Empty ${a} Should Be Equal ${a} ZHANGSAN ignore_case=True Should Be True 1=2 Should Contain zhangsan zhan ignore_case=False Should Start With zhangsan zh Should End With zhangsan an Length Should Be zhangsan 8 Open Browser https://www.baidu.com chrome Sleep 3 slenium断言 Open Browser https://www.baidu.com chrome Sleep 5 # 断言页面是否包含hao123这个字段 Page Should Contain hao123 # 断言页面中是否包含有id=kw的元素 Page Should Contain Element id=kw 元素等待关键字 Open Browser https://www.baidu.com chrome Set Browser Implicit Wait 3 # 针对当前浏览器 Set Selenium Implicit Wait 3 # 针对所有浏览器 # 等待元素包含指定的文本 Wait Until Element Contains xpath=//a[@href='http://news.baidu.com'] 新闻 3 Sleep 3 # 等待元素可用 Wait Until Element Is Enabled link=新闻 3 # 等待元素可见 Wait Until Element Is Visible link=新闻 3 # 等待页面包含指定的文本 Wait Until Page Contains 百度一下 3 # 等待页面包含指定元素 Wait Until Page Contains Element id=kw Close Browser
十、项目实战
-
示例
*** Settings *** Library SeleniumLibrary *** Test Cases *** 登录 Open Browser http://ihrm-java.itheima.net/#/login chrome Clear Element Text name=username Clear Element Text name=password Sleep 5 Input Text name=username 13800000002 Input Text name=password 888itcast.CN764%... Click Button xpath=//*[@id="app"]/div/form/button Sleep 3 Close Browser 查询商品(框架及下拉框) # 进入框架 Select Frame name=menu-frame # 选择元素 # 跳出框架 Unselect Frame # 进入新框架 Select Frame name=main-frame # 选中下拉框中的数据 Select From List By Index name=brand_id 4 Select From List By Value name=brand_id 9 Select From List By Label name=brand_id 联想 删除商品 # 定位一组元素 ${ele_list} Get WebElements xpath=//img[@src='abc'] Click Element ${ele_list}[0] # 点击alert按钮 Sleep 2 Handle Alert # 直接点确定 Handle Alert action=Dismiss # 取消 Handle Alert timeout=10s # 超时接受 Handle Alert DISMISS # 超时取消 ${message} Handle Alert 新网页操作 Select Frame name=header-frame Click Element link=查看网店 Sleep 3 # 进入到新网页操作 Switch Window new
问题
-
线性脚本,不利于后期维护
-
没有分层封装的思想
京东的仓库:日用品,书籍,电器
分层:页面的元素层,业务逻辑层,测试用例层(数据驱动)
-
数据是没有独立的
分层目的:主要增加脚本的重复利用
项目的三层架构
- 页面元素层
- 业务逻辑层
- 测试用例层
-
业务逻辑层调用页面元素层,测试用例层调用业务逻辑层
-
为什么要分层
实现页面元素,公共方法,公共数据,测试用例集中式管理
增加脚本重复利用率
增加脚本的可维护性
Jenkins持续集成RF
- 在Jenkins里面安装robotframework插件
RF扩展
- 发送电子邮件
- 执行js脚本
- 鼠标键盘事件
- 验证码处理
- 断言
- 接口自动化
- APP自动化
-
web自动化
语言:python、java
设计模式:PO模式、关键字驱动
用例管理:unittest/pytest
日志监控:logger
二次封装:selenium二次封装,yaml二次封装,excel二次封装,数据库二次封装
测试报告:htmltestrunner/allure,日志的定制
数据驱动ddt,parameterice
版本控制:git,集成pycharm
容器技术:docker
最核心的:自主独立的搭建一套自动化框架