各个驱动下载地址: http://www.seleniumhq.org/download/
1.概念
RFS框架:RobotFramework+Selenium框架
2.特点
2.1通过图形化界面来编写自动化脚本,对语言要求低,方便简单,开发效率高
2.2通过'关键字'来进行驱动,内部包含了丰富的关键字;
内置关键字
库关键字 --->你所导入的第三方测试库的中的关键字
用户关键字 --->自己定义关键字
注:'关键字'的内部机制就是通过函数来实现的,一个'关键字'的内部机制其实就是一个'函数'
2.3支持丰富的第三方'关键字'测试库,可通过这些测试库来拓展RFS的功能
例如:
内置的测试库有(robot自带):
BuildIn --->基础库中的关键字
String --->处理字符串的库
第三方测试库有:
Selenium2Library --->界面WEB自动化的测试库,基于selenium
RequestLibrary --->接口自动化的测试库
ExcelLibrary --->操作Excel的测试库,基于xlrd,xlwt
DatabaseLibrary --->连接数据库的测试库,基于PyMySql(Mysql的驱动)
AutoItLibrary --->对Windows窗口操作的库
2.4可自动生成自动化测试报告&日志
3.优点
RFS框架与PSU框架相比较,具有如下优点:
3.1 通过图形化界面,采用'关键字'来开发自动化脚本,对语言要求低,方便简单,开发效率高(只需团队中有一个人懂python开发robot famework 关键字,其它人会用即可)
3.2 RFS框架内置丰富的测试库,同时扩展性强,通过第三方库来扩展RFS的功能
3.3 RFS框架可自动生成自动化HTML测试报告&日志,还带错误截图
3.4 RFS框架可以自动帮我们去加载/管理用例并运行用例
4.缺点
4.1 robot framework 也不带录制功能;不是录个脚本随便跑的那种
4.2 robot framework 目前对Python3的支持性不好,主要是它的扩展库的问题,一般用Python2
5.原理
RFS框架是通过'关键字'来进行驱动的,只要熟悉测试库内部关键字的用法,就可以开发自动化脚本了
6.封装
6.1封装
new directory //创建项目 #取名Function(函数)
new resource //定义资源 #取名'业务关键字'
new user keyword //在资源里定义一个用户自定义关键字 #取名'登录'
Selenium2Library //在资源上进行导包
6.2使用
在哪个测试套件中需要用到上面资源里定义的用户自定义关键字就导入资源,直接引用即可
Log打印
7.常见问题
7.1没有日志信息
进入任务管理器,删除chromedriver.exe进程
7.2解决总是要手动杀死chromedriver.exe进程的问题
7.2.1 导库:OperatingSystem //这个库可以帮助我们自动强制杀死某个指定的进程
7.2.2 ${RunOutput} OperatingSystem.Run taskkill /IM "Chromedriver.exe" /T /F
${RunOutput} //关键字
/F //强制
taskkill /IM "Chromedriver.exe" /T /F //是一条dos命令
7.3 RFS框架断言
7.3.1断言需要根据不同的模块从不同的角度去进行检查,主要从以下几个方面去检查:
1. 前台变化
2. 后台与前台提交数据的校验
3. 相关模块的检查
7.3.2在Selenium2Library这个测试库中提供丰富的断言关键字,通过调用这些关键字并根据以上3个方面去检查我们用例执行是否有问题。
如果要校验后台数据库的数据,还需要安装第三方测试库DabaseLibrary,这个库中给我们提供操作数据的一些关键字。
7.4内嵌网页处理
Select Frame //进入内嵌网页
Unselect Frame //跳出内嵌网页
7.5处理乱码问题
7.5.1 乱码案例
'''
Starting test: Fw.方维登录.test
@{row_values} = [ ('A2', u'\u9a8c\u8bc1\u6b63\u5e38\u767b\u5f55') | ('B2', u'jason') | ('C2', u'zgp123456') | ('D2', u'jason') ]
INFO : ('A2', u'\u9a8c\u8bc1\u6b63\u5e38\u767b\u5f55') //用例名称
INFO : ('B2', u'jason') //用户名
INFO : ('C2', u'zgp123456') //密码
INFO : ('D2', u'jason') //断言信息
'''
7.5.2 找源代码unic.py文件并修改参数
源代码unic.py文件路径:
C:\Python27\Lib\site-packages\robot\utils
import json #新加入的导包语句
对照以下信息对unic.py文件进行修改:
import json #新加入的导包语句
if PY2:
def unic(item):
if isinstance(item, unicode):
return item
if isinstance(item, (bytes, bytearray)):
try:
return item.decode('ASCII')
except UnicodeError:
return u''.join(chr(b) if b < 128 else '\\x%x' % b
for b in bytearray(item))
''' #这个需要新加入的代码
if isinstance(item,(list,dict,tuple)):
try:
item = json.dumps(item,ensure_ascii=False,encoding='cp936')
except UnicodeDecodeError:
try:
item = json.dumps(item,ensure_ascii=False,encoding='cp936')
except:
pass
except:
pass
'''
try:
try:
return unicode(item)
except UnicodeError:
return unic(str(item))
except:
return _unrepresentable_object(item)
7.5.3找源代码encodingsniffer.py文件并修改参数
源代码unic.py文件路径:
C:\Python27\Lib\site-packages\robot\utils
对照以下信息对encodingsniffer.py文件进行修改:
if UNIXY:
DEFAULT_CONSOLE_ENCODING = 'UTF-8'
DEFAULT_SYSTEM_ENCODING = 'UTF-8'
else:
#DEFAULT_CONSOLE_ENCODING = 'cp437' //原来不动,屏蔽
DEFAULT_CONSOLE_ENCODING = 'cp936' //新加的
DEFAULT_SYSTEM_ENCODING = 'cp1252'
7.5.4 重启ride工具即可
重启后即可返回下面这样的格式:
INFO : ["A2", "验证正常登录"]
INFO : ["B2", "jason"]
INFO : ["C2", "zgp123456"]
INFO : ["D2", "jason"]
8.重要测试库介绍
8.1 测试库ExcelLibrary
8.1.1 作用:利用ExcelLibrary库关键字来读取Excel文件中的测试数据,通过参数传递到脚本中
8.1.2 关键字(23个)
Open Excel //打开Excel文件
Open Excel Current Directory //打开当前目录下的Excel文件
Save Excel //保存数据
Add New Sheet //在excel文件中增加一张表
Add To Date //向某张表的某个单元格加入一个数据
Check Cell Type //检查某个单元格的类型
Get Column Count //获取某张表总共多少列
Get Column Values //获取某一列的所有值
Get Row Count //获取某张表总共多少行
Get Row Values //获取某一行的所有值
Get Sheet Names //把所有表的名字全部打印出来
Get Sheet Values //获取某张表的所有的值
Get Workbook Values //获取Excel文件的所有数据
8.2 测试库databaselibrary
8.2.1 作用:连接数据库,校验后台数据是否与前台提交数据一致
8.2.2关键字(18个)
Connect To Database //连接数据库
Connect To Database Using Custom Params //连接数据库
Delete All Rows From Table //删除所有行从某个表中
Disconnect From Database //断开连接
Execute Sql String //执行sql语句
Query //查询数据
9.对数据库的操作
9.1步骤
9.1.1 安装第三方测试库 //pip2 install robotframework-databaselibrary
9.1.2 安装数据库的驱动 //pip2 install PyMySQL
9.1.3 创建关键字,导包
备注:
1. 要连接数据库必须要驱动,不同的数据库驱动不一样
2. databaselibrary提供操作数据库的功能(关键字)
9.2思路
9.2.1 连接数据库 #host,账号,密码,数据库名字,编码方式,端口
[Connect To Database Using Custom Params] pymysql
database='fw',user='root',password='root',port=10021,
host='leonkingking.ticp.io',charset='utf8'
9.2.2 查询 或者 执行sql语句
9.2.3 断开连接
10.关键字二次开发
备注:关键字二次开发需要对开发语言Python比较熟悉,每个关键就是一个封装好的函数,开发完成后,在需要的模块中引用即可
方法1:针对原生态的关键字库,进行修改或增加关键字
示例:
'Get Row Values'关键字在ExcelLibrary.py对应的函数:get_row_values
def get_row_values(self, sheetname, row, includeEmptyCells=True):
"""
Returns the specific row values of the sheet name specified.
hello
Arguments:
| Sheet Name (string) | The selected sheet that the row values will be returned from. |
| Row (int) | The row integer value that will be used to select the row from which the values will be returned. |
| Include Empty Cells (default=True) | The empty cells will be included by default. To deactivate and only return cells with values, pass 'False' in the variable. |
Example:
| *Keywords* | *Parameters* |
| Open Excel | C:\\Python27\\ExcelRobotTest\\ExcelRobotTest.xls | |
| Get Row Values | TestSheet1 | 0 |
"""
#my_sheet_index = self.sheetNames.index(sheetname)
#sheet = self.wb.sheet_by_index(my_sheet_index)
#打开表,得到一个表对象
sheet = self.wb.sheet_by_name(sheetname)
#data = {}
data = []
for col_index in range(sheet.ncols):
#cell = cellname(int(row), col_index)
#获取某一行的第几列的数据,第几个单元格的值
value = sheet.cell(int(row), col_index).value
#data[cell] = value
#加入列表中
data.append(value)
if includeEmptyCells is True:
#sortedData = natsort.natsorted(data.items(), key=itemgetter(0))
#return sortedData
#返回列表
return data
else:
data = dict([(k, v) for (k, v) in data.items() if v])
OrderedData = natsort.natsorted(data.items(), key=itemgetter(0))
return OrderedData
注意:
10.1 删除原来导入的ExcelLibrary库
10.2 重启RIDE工具
10.3 重新导入
方法2:自己开发一个测试库
场景:当需要的功能找不到对应关键字库时,就需要自己独立开发一个新的关键字
示例:
10.1 新建一个目录 MyLibrary
10.2 在MyLibrary文件夹中建立以下三个文件
__init__.py
version.py
MyLibrary.py //这个文件的名字一定要跟MyLibrary文件夹的名字一样
10.3 文件的内容
__init__.py文件中的内容:
from MyLibrary import MyLibrary
from version import VERSION
_version_ = VERSION
class MyLibrary(MyLibrary):
'''
set global paramers
'''
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
versioin.py文件中的内容:
VERSION = '0.0.2'
MyLibrary.py的内容 //注意:这个文件中的类的名字一定要跟文件的名字一样
from version import VERSION
_version_ = VERSION
class MyLibrary:
def Max(self,a,b):
'''
return the max value from a,b
:param a:
:param b:
:return:
'''
if a>b:
return a
else:
return b
10.4 重启RIDE工具
10.3 重新导入
规划->搭建环境->编写并调试脚本(核心:元素定位)->工程的管理维护与优化
1.规划
1.1确定测试范围,根据功能用例整理自动化测试用例
1.2分工
1.3确定具体进度时间相关的情况
1.4确定自动化的框架,资源,环境搭建等
2.框架
RobotFramework+Selenium框架(RFS)
2.环境
https://www.showdoc.cc/lkr?page_id=3767717365610107
4.编写并调试脚本
4.1 创建工程
file->New Project //建'工程名称,类型'
New Suite //建'测试套件'
New Test Case //建'测试用例'
Selenium2Library //导包/库
4.2编写并调试脚本
说明:F5按键可了解一些基本的关键字
4.2.1操作(元素定位)
Open Browser //打开浏览器
Close Browser //关闭浏览器
Input Text //向输入框元素中输入文本信息
Input Password //向输入框元素中输入密码
Click Element //点击某个元素
Click Button //点击某个按钮
Get Text //获取某个元素的文本信息
4.2.2变量
${value} //scaral变量,只能存储一个值
@{} //列表变量
&{} //字典变量
4.2.3断言
Should Be Equal //判断两个值是否相等,若相等则执行成功
Should Not Be Equal //与Should Be Equal相反
Should Be Empty //判断是否为空,若为空则执行成功
Should Not Be Empty //与Should Be Empty相反
Should Be Equal As Integers //以整数的形式来进行比较
Should Be Equal As Strings //以字符串的形式来进行比较
Should Be Equal As Numbers //以number的形式来进行比较
Should Match //判断某个字符串与预期的字符串是否相匹配,若匹配则执行成功
Should Not Match //与Should Match相反
Should Start With //判断某个字符串是否以预期的字符串开始,若是则执行成功
Should Not Start With //与Should Start With相反
4.3日志&报告
4.3.1日志
Log默认保存路径:
c:\users\admini~1\APPdata\local\temp\RIDEijbrqh.d\log.html
4.3.2报告
Report默认保存路径:
c:\users\admini~1\APPdata\local\temp\RIDEijbrqh.d\report.html
4.3.3报告常见问题
Error:一般是代码问题
Fail:测试不通过(BUG)或断言有问题
PASS:测试通过
5.工程的管理维护与优化
5.1参数化:数据与脚本分离,方便后期传参。
5.1.1固定的常量数据,一般通过定义为全局变量的方式,以参数的形式传递到脚本中
5.1.2输入的测试数据,一般保存在excel文件中,导入excelLibrary库读取数据,然后封装操作excel文件的用户关键字,对数据进行读取并以参数的形式传递到脚本中(这里需要用到第三方测试库 ExcelLibrary)
5.2模块化:把常用的'功能业务'封装成模块\函数,方便后期调用。
5.2.1把常用的'业务功能'进行封装,封装成用户关键字,以便在其他的业务流程中重复调用;一般的操作方法是:定义资源->将用户关键字放入资源中(如果需要用到我们封装的用户关键字,需要在对应的测试套件中导入资源)
5.3管理用例:unittest框架
5.3.1RF框架可以自动帮我们去加载/管理用例并运行用例。