参考:https://www.cnblogs.com/chenyuebai/p/8359577.html
1、Robot framework是一个基于Python可扩展地关键字驱动的测试自动化框架。
支持简单易用的表格型语法,使得可以用统一方式创建测试用例;
提供可以复用既存的关键字的功能;
提供HTML的简单易读的报表和日志结果文件;
平台和应用相互独立;
提供简单的Libary API,可以使用Ptyhon或者java进行实现;
提供命令行接口和XML格式的输出文件,非常容易进行持续集成;
支持Selenium,Java Gui测试,Telnet,SSH等;
支持创建数据驱动的测试用例;
变量的内建支持,尤其是不同测试环境下的测试;
提供test case和test suite级别的setup和teardown;
2、环境搭建:【默认已安装python,ride好像不支持python3,需要python2 ??后期确认下】
pip install robotframework:Robot framework 框架。[ 也可直接下载exe安装包:https://github.com/robotframework/robotframework ]。
pip install wxPython:python 非常有名的一个GUI库,RIDE基于这个库开发,是安装RIDE的前提。
pip install robotframework-ride:RIDE是一个图形界面的用于创建、组织、运行测试的软件【我们当前用的RFCode】。[ 也可直接下载exe安装包:https://github.com/robotframework/RIDE ]。注意:安装版本要和Robotframework匹配。安装好ride之后,桌面就会生成一个RIDE图标,可双击图标启动工具,也可cmd窗口中输入ride运行。
pip install robotframework-selenium2library:RF版的selenium 库,selenium(webdriver)可以认为是一套基于web的规范(API),所以RF、appium 等测试工具都可以基于这套API进行页面的定位与操作。https://github.com/robotframework/Selenium2Library
pip install robotframework-seleniumlibrary,https://pypi.python.org/pypi/robotframework-seleniumlibrary
pip install robotframework-appiumlibrary:RF版的appium 库
pip install requests:request库,web测试需要
pip install -U robotframework-requests:web测试需要,requests和robotframework-requests的区别:https://blog.csdn.net/huluwababy/article/details/80524288
pip install pygments:非必要,可以用来实现代码高亮,参考:https://blog.csdn.net/mouday/article/details/83114164
3、cmd 运行 case:pybot --test test_case test_suit.robot,运行一条casepybot test_suit.robot,运行指定文件pybot *.robot,运行当前目录下以.robot为后缀名的测试文件pybot testpath/,运行当前testpath/目录下的所有case 4、测试脚本[ .robot文件 ]的基本语法:
*** Settings ***
Library MyLib #导入自定义的库
Library SeleniumLibrary
*** Test Cases ***
#第一行为固定格式,标识
#建议同python一致,使用tab缩进对齐(pycharm中设置tab=4空格),否则可能报执行失败,报 "Test case contains no keywords"
case 1 helloworld #案例名
log first rfw case #log 相当于python的print,可在生成的log.xml中查看
case 2 log #打异常日志,支持多种级别
log test line 2 ERROR
case 3 varible
${myname} Set variable daqiang #定义变量
log my name is ${myname} #使用变量
#case 4 use varible #变量作用域为其定义所在的案例(case3),否则报 "Variable '${myname}' not found."
# log ${myname}
case 5 Catenate
${hi1} Catenate hello world #定义变量方式2 连接两个对象,支持自定义连接符
log ${hi1}
${hi2} Catenate SEPARATOR=---- hello world
log ${hi2}
case 6 list
@{mylist} create list a b c #定义列表
log many @{mylist} #打印列表中的元素
case 7 get time
${currentTime} get time #获取当前时间 2022-02-21 21:05:47
log ${currentTime}
${currentYear} get time format=year #支持多种传参,详情看函数定义
log current year is ${currentYear}
case 8 sleep
log get time
sleep 1 #睡眠,等同于python的time.sleep(5)
log get time
case 9 if
${score} set variable 55
run keyword if ${score}>=90 log 优秀 #if小写
... ELSE IF ${score}>=70 log 良好 #ELSE/ELSE IF要大写
... ELSE log 很差
case 10 for #for循环,注意需要使用来标识这个for循环范围
:FOR ${i} IN RANGE 5 # for in in range(5):
log ${i} # print(i)
case 11 allround the list # 列表循环
@{myList} create list 1 2 3 4 # myList = [1,2,3,4]
:FOR ${i} IN @{myList} # for i in myList:
log ${i} # print(i)
case 12 Evauate #调用python中的方法
${randomNum} evalUATE random.random() random
#变量 关键字evalUATE 调用python的方法 方法所在的库名
log ${randomNum}
case 13 call my python #导入自定义库
${nowTime} get current time
log ${nowTime}
case 14 Comment
log start
comment line 1 #标明注释:使用关键字或者#均可
#line 2
log end
case 15 Selenium2Library #Selenium2Library库,web界面自动化,操作浏览器
open_browser http://www.baidu.com firefox
Input text id=kw Robotframework
click button id=su
sleep 3
close Browser
5、robot文件中调用自定义库:注意文件名、类名的对应关系,否则会导入库失败。
举例:在…python安装路径Libsite-packages下:
- 自定义方法所在的文件:MyKeywords.py
import time
class MyKeywords():
def __init__(self):
pass
#获取当前时间
def get_current_time(self):
current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
return current_time
- 创建__init__.py,继承自定义库中的类,RF会解析类中的函数作为关键词:
from .MyKeywords import *
class MyRobotFwkLib(MyKeywords):
ROBOT_LIBRARY_SCOPE = "GLOBAL"
c. .robot文件导入自定义类,即可使用类中的方法:
*** Settings ***
Library MyRobotFwkLib #导入自定义的库
case 13 call my python
${nowTime} get current time
log ${nowTime}
6、使用SeleniumLibrary库进行web界面自动化测试:
SeleniumLibrary支持:
支持指定多种浏览器,按元素标识操作元素;支持基础关键字(SeleniumLibrary自带);高级关键字(按实际业务对基础关键字封装);用户自定义库中的关键字(参考:5、robot文件中调用自定义库);
应用举例:
*** Settings ***
#方便IDE调试,不添加无法找到关键字定义
Library browsermanagement
Library alertKeywords
Library BrowserManagementKeywords
Library cookieKeywords
Library ElementKeywords
Library FormElementKeywords
Library frameKeywords
Library JavascriptKeywords
Library RunonFailureKeywords
Library ScreenshotKeywords
Library SelectElementKeywords
Library TableElementKeywords
Library WaitingKeywords
Library WindowKeywords
Library SeleniumLibrary
#配置套件级别的Setup和Teardown
Suite Setup
... log now test start 1 #只执行一条
Suite Teardown Run Keywords
... close all browsers AND #执行多条
... log now end 4
#全局变量
*** Variables ***
${loginPageUrl} http://www.baidu.com
${validUsername} admin
${validloginPasswd} adminpasswd
#测试用例
*** Test Cases ***
case 1 correct login test
#配置用例级别的Setup和Teardown
[setup] log setup log 2
[teardown] log teardown log 3
#使用基础关键字封装出的高级关键字,定义在下面
correctLoginTest ${validUsername} ${validloginPasswd}
#使用基础关键字封装高级关键字,类似python的一个函数,支持入参出参,很灵活
*** Keywords ***
correctLoginTest
[Arguments] ${uasename} ${passwd} #入参
open browser ${loginPageUrl} firefox
setBrowser
input text xpath=html/body/div[1]/form/input[1] ${uasename}
input text xpath=html/body/div[1]/form/input[2] ${passwd}
click element class=submit
sleep 5
#出参,相当于调用函数return的值
# ${page1_title} get title #出参,获取页面title,可后续校验页面是否到达
# ${width} ${height} get window size #出参,获取浏览器窗口大小
# select window NEW #切换到新弹出窗口(视图焦点)
page should contain element xpath=//*[@id='topMenu4'] #系统管理菜单
sleep 2
close all browsers
setBrowser
set window size 1024 768 #设置浏览器窗口大小
maximize browser window #浏览器窗口最大化
sleep 1
7、数据驱动测试:适合相同流程、相同预期结果下,不同输入组合的测试
举例:比如测试异常登录流程,用户名、密码在错误(或空)各种组合下的异常验证
*** Settings ***
Library SeleniumLibrary
Test Template errorLoginTest #公共逻辑
*** Variables ***
${loginPageUrl} http://www.baidu.com
${validUsername} admin
${validloginPasswd} adminpasswd
*** Test Cases *** username passwd
#异常登录测试
case 2:Invalid Username invalidname ${validloginPasswd}
case 3:Invalid Password ${validUsername} invalidPasswd
case 4:Invalid Both invalidName invalidPasswd
case 5:Empty Username ${EMPTY} ${validloginPasswd}
case 6:Empty Password ${validUsername} ${EMPTY}
case 7:Empty Both ${EMPTY} ${EMPTY}
*** Keywords ***
errorLoginTest
[Arguments] ${uasename} ${passwd}
open browser ${loginPageUrl} firefox
input text xpath=html/body/div[1]/form/input[1] ${uasename}
input text xpath=html/body/div[1]/form/input[2] ${passwd}
click element class=submit
sleep 5
page should contain element class=submit 5 error:预期应含登录元素未找到【即跳转失败】
sleep 5
close all browsers
8、使用RIDE:可在环境搭建完成后,启动RIDE,创建测试用例
a. 新建Project:File–>NewProject。新建project时,Type只能选择directory,Directory下才可以创建测试套件TestSuite,如果选择File,File下只能创建测试用例TestCase。
b. 新建TestSuite:type选择File
c. 新建TestCase:
d. 导入依赖包Selenium2Library:如果导入后字为红色,说明不正确,检查一下是否打错了,或者大小写问题
i. 导入外部文件:
1. Add Library:导入测试库,主要是Libsite-packages这个目录下面的库
2. Add Resource:导入相关资源,跟项目相关的一些资源文件
3. Variables:加载变量文件
ii. 定义内部变量:
1. Add Scalar:定义一个变量
2. Add List:定义一个列表类型的变量
3. Add metadata:定义元数据
e. 编写测试用例:
i. 打开浏览器,关键词Open Browser,红色表示必填项。关闭浏览器,关键字Close Browser。
ii. 按Ctrl可以对关键字进行解析:可以看到后面红色框里需要填写URL,也就是你需要打开的网页网址,第三个参数就是浏览器,不填就默认Firefox。
注意:需要用到RIDE自动化打开浏览器时,需要下载浏览器对应的插件,例如IE,对应要下载IEDriverServer。
f. 运行case:点击Run
8、贴一个大佬 RF+Python 编写case的实战脚本:https://blog.csdn.net/qq_39719530/article/details/81354007
add_area.py
‘’’ Test Cases ‘’’
from robot.api import TestSuite
from robot.api import ResultWriter
from robot.model import Keyword
#慧猿CRM登录新增区域测试
class CRM_add_areaTest:
def init(self, name, librarys=[“SeleniumLibrary”]):
#创建测试套件
self.suite = TestSuite(name)
#导入SeleniumLibrary
for lib in librarys:
self.suite.resource.imports.library(lib)
#定义变量
def create_variables(self):
variables = {undefined
"${CRM}": "https://XXXXXXXX",
"${browser}": "Chrome",
"${login1_input}": "name=user_name",
"${login2_input}": "name=password",
"${login_btn}": "class=loginBut",
"${ziliao_element}": "xpath=//*[.='资料']",
"${area_element}": "xpath=//*[.='区域信息']",
"${area_add_btn}": "id=area_add",
"${area_name_input}": "xpath=//div[@class='form-body']/div[2]/div/input",
"${area_save_btn}": "xpath=//*[.='保存']",
"${area_add_request}": "class=km-modal-dialog-msg"
}
for k, v in variables.items():
self.suite.resource.variables.create(k, v)
#测试用例:启动浏览器
def open_browsers(self):
test_01 = self.suite.tests.create("启动浏览器")
test_01.keywords.create("Open Browser", args=["${CRM}", "${browser}"])
test_01.keywords.create("Title Should Be", args=["科脉慧猿CRM"])
#测试用例:慧猿CRM登录
def login(self):
test_02 = self.suite.tests.create("慧猿CRM登录测试")
test_02.keywords.create("Input Text", args=["${login1_input}", "769316"])
test_02.keywords.create("Input Text", args=["${login2_input}", "crm666"])
test_02.keywords.create("Click Button", args=["${login_btn}"])
test_02.keywords.create("Sleep",args=["3s"])
#测试用例:断言验证搜索结果标题
def assert_title(self):
test_03 = self.suite.tests.create("断言验证登录结果标题")
test_03.keywords.create("Title Should Be", args=["科脉慧猿CRM-首页"])
#测试用例:新增区域
def add_area(self):
test_04 = self.suite.tests.create("新增区域")
test_04.keywords.create("Sleep",args=["5s"])
test_04.keywords.create("Click element", args=["${ziliao_element}"])
test_04.keywords.create("Sleep",args=["3s"])
test_04.keywords.create("Click element", args=["${area_element}"])
test_04.keywords.create("Sleep",args=["3s"])
test_04.keywords.create("Click Button", args=["${area_add_btn}"])
test_04.keywords.create("Sleep",args=["3s"])
test_04.keywords.create("Input Text", args=["${area_name_input}","测试robot"])
test_04.keywords.create("Click Button", args=["${area_save_btn}"])
test_04.keywords.create("Sleep",args=["3s"])
#测试用例:断言验证新增区域结果
def assert_result(self):
test_05 = self.suite.tests.create("断言验证新增区域结果")
test_05.keywords.create("Page Should Contain Button", args=["确定"])
#测试用例:关闭测试用例
def close_browsers(self):
test_06 = self.suite.tests.create("关闭浏览器")
test_06.keywords.create("Close All Browsers")
#运行
def run(self):
self.create_variables()
self.open_browsers()
self.login()
self.assert_title()
self.add_area()
self.assert_result()
self.close_browsers()
#运行套件
result =self.suite.run(critical="登录测试", output="output.xml")
#生成日志、报告文件
ResultWriter(result).write_results(report="report.html", log="log.html")
if__name__ ==“main”:
print(“用Python写Robot framework测试”)
suite = CRM_add_areaTest(“慧猿CRM登录新增区域测试”)
suite.run()
执行测试:python add_area.py
不跑了,把大佬的 执行结果 + 测试报告 粘过来:



