Robot Framework

🍰 基于Python的关键字驱动测试框架,用于验收测试驱动开发(ATDD)、行为驱动开发(BDD)、机器人流程自动化(RPA)。

1 库安装

  • 库安装
    • 基于Python安装robotframework:pip install robotframework
    • 安装robotframework-ride:pip install robotframework-ride
    • 安装seleniumlibrary库:pip install robotframework-seleniumlibrary
    • Python3.8版本以上可使用最新版的RobotFramework,否则需下载对应版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
> python -V
Python 3.9.7

> pip install robotframework
> pip install robotframework-ride
> pip install robotframework-seleniumlibrary

> pip list
Pypubsub 4.0.3
robotframework 7.0.1
robotframework-pythonlibcore 4.4.1
robotframework-ride 2.0.8.1
robotframework-seleniumlibrary 6.5.0
wxPython 4.2.1

1-1 报错分析

  • 报错分析
    • 库安装完成时,桌面可能没有ride.py可执行文件,也搜索不到ride.py文件。
    • 命令pip show robotframework-ride查找安装路径,打开文件夹定位到该路径下。
    • 一般位于C:\Users\Admin\AppData\Roaming\Python\Python39\Scripts文件夹中。
    • 在该文件夹中鼠标右键Git Bash here打开命令窗口,输入python ride.py执行。
    • 问题定位
      • ImportError: DLL load failed while importing _sqlite3:无法找到sqlite3库的动态链接库。
      • 这里使用的Python环境是Anaconda3(指定了安装路径),与库的安装路径C:\...\Python39不一致。
      • 执行ride.py时,位于C盘的robotframework库文件识别不到Anaconda下的sqlite3库(Python自带库)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
> pip show robotframework-ride
Name: robotframework-ride
Version: 2.0.8.1
Summary: RIDE :: Robot Framework Test Data Editor
Home-page: https://github.com/robotframework/RIDE/
Author: Robot Framework Developers
Author-email: robotframework@gmail.com
License: Apache License 2.0
Location: c:\users\admin\appdata\roaming\python\python39\site-packages
Requires: psutil, Pygments, PyPubSub, Pywin32, wxPython
Required-by:

> python ride.py
Traceback (most recent call last):
File "C:\...\site-packages\robotide\__init__.py", line 71, in main
_run(inpath, not noupdatecheck, debug_console)
File "C:\...\site-packages\robotide\__init__.py", line 91, in _run
from robotide.application import RIDE
File "C:\...\site-packages\robotide\application\__init__.py", line 16, in <module>
from .application import RIDE
File "C:\...\site-packages\robotide\application\application.py", line 20, in <module>
from ..namespace import Namespace
File "C:\...\site-packages\robotide\namespace\__init__.py", line 16, in <module>
from .namespace import Namespace
File "C:\...\site-packages\robotide\namespace\namespace.py", line 27, in <module>
from ..spec.iteminfo import (TestCaseUserKeywordInfo, ... , UserKeywordInfo,
File "C:\...\site-packages\robotide\spec\__init__.py", line 16, in <module>
from .librarydatabase import DATABASE_FILE
File "C:\...\site-packages\robotide\spec\librarydatabase.py", line 17, in <module>
import sqlite3
File "D:\Program\Java\Anaconda3\lib\sqlite3\__init__.py", line 57, in <module>
from sqlite3.dbapi2 import *
File "D:\Program\Java\Anaconda3\lib\sqlite3\dbapi2.py", line 27, in <module>
from _sqlite3 import *
ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。

Use --help to get usage information.

1-2 解决方法

  • 解决方法
    • 到系统环境变量PATH中添加...\Anaconda3\Library\bin变量。
    • 排序一定要在第三方库环境C:\...\Python39\Scripts变量上面。

1-3 Console报错

  • Console报错
    • 执行测试用例时,在Run运行区会以红色字体显示报错信息,报错信息如下。
    • 官方给出的回答是:RIDE还未完全支持最近发布的Robot Framework版本7。
    • 解决方法
      • 卸载:pip uninstall robotframework
      • 重装:pip install robotframework==6.1.1
1
2
3
[ ERROR ] Calling method 'log_message' of listener 
'D:\Anaconda3\lib\site-packages\robotide\contrib\testrunner\TestRunnerAgent.py'
failed: AttributeError: 'Output' object has no attribute '_xmllogger'

2 界面介绍

  • 界面介绍
    • 执行ride.py文件,或命令窗口定位到该文件目录,执行python ride.py,即可打开RIDE主界面。
    • 工具栏:点击界面介绍-关键字查找可查找关键字,或快捷键F5查找,点击界面介绍-测试用例查找可查找测试用例,或快捷键F3查找。
    • Editor是编辑区,Text Edit是代码格式区,Run是运行区。
    • Text Edit区记录的是Settings设置和测试用例文本信息,由RIDE自动生成,不需要用户进行编写。
    • Run运行区
      • Execution Profile:选择运行的方式,选项有custom script、pybot、jybot等,默认robot即可。
      • Report和Log:报告和日志,运行后才能点击,区别在于报告是结果展示,日志是过程的记录。
      • Autosave:若不勾选,修改用例后没保存,执行用例时将提示保存,勾选则在运行时自动保存。
      • Pause on failure:关键字执行失败立马暂停。
      • Start:运行用例。
        • 若该测试套件下的测试用例没有勾选,则默认执行该测试套件下所有的用例。
        • 若该测试套件下的测试用例勾选了,那么执行该测试套件下勾选的所有用例。
      • Stop:停止用例。
      • Only Run Tests with these Tags:只运行带有标记的测试用例。
      • Skip Tests with these Tags:指跳过带有标记的所有测试用例。

界面介绍-RIDE主界面

2-1 Settings部分

  • Settings部分
    • 项目
      • Documentation:给当前对象写一些文档说明。
      • Suite Setup:测试套件启动时,先执行指定的关键字,例如设置等待5秒,即Sleep | 5sec
      • Suite Teardown:测试套件结束时,先执行指定的关键字。
      • Test Setup:测试用例启动时,先执行指定的关键字。
      • Test Teardown:测试用例结束时,先执行指定的关键字。
      • Force Tags:给当前项目及项目下的套件及套件下的每个用例都加上Tag,只能在设置处删除。
    • 套件
      • Documentation、Suite Setup、Suite Teardown、Test Setup、Test Teardown、Force Tags同。
      • Test Template:测试模板。
        • 可以指定关键字为该测试套件下所有测试用例的模版。
        • 这样所有的用例只需设置指定关键字的传入参数即可。
      • Test Timeout:超时时间。
        • 设置每一个测试用例的超时时间,超时即失败并停止用例的运行。
        • 这是为了防止某些情况导致用例一直卡住不动,不停止也不失败。
      • Test Tags:给当前测试套件及套件下的每个测试用例都加上Tag,只能在设置处删除。
      • Default Tags:默认标记,给自身打上Tag,而不会给子集打上Tag(区分Force Tags)。
    • 用例
      • Setup:测试用例启动时,先执行指定的关键字。
      • Teardown:测试用例结束时,先执行指定的关键字。
      • Timeout:设置当前用例的超时时间,超时则失败并停止运行。
      • Template:测试模版,可以指定关键字为当前测试用例的模版。
      • Tags:标记当前测试用例,在Run的Tests filters中,将通过Tags来识别是否运行或跳过用例。

2-2 加载外部文件

  • 加载外部文件
    • Library:加载库,主要是Python目录\Lib\site-packages中的测试库,库字体标红则说明导入失败。
    • Resource:加载资源,主要是项目相关的资源文件。
    • Variables:加载变量文件,不怎么使用,可以忽略。

2-3 定义内部变量

  • 定义内部变量
    • Add Scalar:定义变量。
    • Add List:定义列表类型变量。
    • Add Dict:定义字典类型变量。
    • 内部变量是Robot Framework自身使用的变量,是在测试执行过程动态生成的,且无法直接修改。
    • Add Metadata:定义元数据,即关于测试套件的附加信息,如作者、版本、描述等(非内部变量)。

2-4 测试用例表格

  • 测试用例表格
    • 表格的第一列一般填写的是关键字,关键字来源包括Builtln库、第三方库、自定义库。
    • 表格的二三四等列一般输入参数,红色代表必填,浅灰代表选填,深灰代表无需填写。
    • 左侧的Test Suites区域,如果测试套件或测试用例名称左上角带*号,说明文件没保存。

3 常用类库

  • 常用类库
    • 标准库
      • 安装位置:Python路径\Lib\site-packages\robot\libraries。
      • Builtln(测试库)、Collections(集合库)、Datatime(时间库)。
      • 使用集合库的关键字没有成功引入时,需在测试套件中添加。
      • 在测试套件的Editor中,点击Library,直接输入名称,点OK。
    • 扩展库(通过PIP安装)
      • 安装位置:Python路径\Lib\site-packages。
      • 接口自动化:pip install robotframework-requests
      • APP自动化:pip install robotframework-appiumlibrary
      • WEB自动化:pip install robotframework-seleniumlibrary

3-1 F5查看

  • F5查看
    • Name(关键字名称)、Source(关键字的位置)。
    • Arguments(传入参数)、Examples(使用示例)。

常用类库-F5查看

3-2 关键字

  • 关键字
    • 代码注释Ctrl + #、取消注释Ctrl + $、撤销操作Ctrl + z、删除整行Ctrl + d
    • 关键字补全Ctrl + Shift + 空格,将鼠标放在关键字上按住Ctrl可查看关键字详情。
    • 常用关键字
      • 打印Log Hello world~、获取系统时间${time} Get Time
      • 强制等待3秒sleep 3、设置变量${num} Set Variable 66
      • 字符串拼接:${str1} Set Variable 今天${str2} Set Variable 周末
        • 用变量替换:${str3} Set Variable ${str1}${str2},打印Log ${str3}
        • Catenate关键字:${str4} Catenate ${str1}${str2},打印Log ${str4}
    • 集合关键字:在测试套件中点Library导入Collections集合库(标准库)。
      • 列表
        • 关键字格式1:${list1} Create List apple lemon mango
        • 打印关键字1:Log ${list1}
        • 关键字格式2:@{list2} Create List apple peach mango
        • 打印关键字2:Log Many @{list2}
      • 字典
        • 格式${dict} Create Dictionary 苹果=apple 柠檬=lemon、打印Log ${dict}
        • 获取字典中所有key值${keys} Get Dictionary Keys ${dict}、打印Log ${keys}
        • 获取所有value值${values} Get Dictionary Values ${dict}、打印Log ${values}
        • 通过key获取value值${key_value} Get From Dictionary ${dict} 苹果、打印Log ${key_value}

常用类库-关键字

3-3 格式区

Framework
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
*** Settings ***
Library Collections

*** Test Cases ***
测试用例
Log Hello world~
${time} Get Time
sleep 3
${num} Set Variable 66
${str1} Set Variable 今天
${str2} Set Variable 周末
${str3} Set Variable ${str1}${str2}
Log ${str3}
${str4} Catenate ${str1}${str2}
Log ${str4}

${list1} Create List apple lemon mango
Log ${list1}
@{list2} Create List apple peach mango
Log Many @{list2}
${dict} Create Dictionary 苹果=apple 柠檬=lemon
Log ${dict}
${keys} Get Dictionary Keys ${dict}
Log ${keys}
${values} Get Dictionary Values ${dict}
Log ${values}
${key_value} Get From Dictionary ${dict} 苹果
Log ${key_value}

4 调用方法

  • 调用方法
    • 调用方法,需要使用到Evaluate关键字,可以直接调用Python方法关键字。
    • 也可以调用外部Python文件关键字,通过Import Library导入外部文件。

4-1 外部文件

1
2
3
# C:/Users/Admin/Documents/sum.py
def sum(a, b):
return a + b

4-2 测试用例

调用方法-测试用例

4-3 格式代码

Framework
1
2
3
4
5
6
7
8
9
10
11
12
13
*** Test Cases ***
测试用例
${num} Evaluate random.randint(1, 10)
Log ${num}

Comment 调用外部的Python文件
Import Library C:/Users/Admin/Documents/sum.py
${a} Evaluate 10
${b} Evaluate 17
${total} sum ${a} ${b}
Log ${total}
${a_type} Evaluate type(${a})
Log ${a_type}

5 流程控制

  • 流程控制
    • 嵌套if需要创建一个.txt类型的资源文件,然后自定义关键字IF。
    • 格式:Run Keyword If ${arg}==100 Log 自定义关键字IF嵌套
    • 自定义关键字IF完成后,在测试套件中点击Resource导入资源文件。
    • 最后,在测试用例中调用自定义关键字嵌套IF。

5-1 自定义关键字

流程控制-自定义关键字

5-2 Resource导入

流程控制-Resource导入

5-3 调用关键字嵌套

流程控制-调用关键字嵌套

5-4 Text代码格式区

Framework
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
*** Settings ***
Resource 资源文件.txt

*** Test Cases ***
测试用例
Comment if...else if...else结构
${score} Set Variable 80
Run Keyword If ${score} < 60 Log 不及格
... ELSE IF ${score} <= 80 Log 一般
... ELSE Log 优秀
Comment if多条件判断使用and 如果a既不等于b又不等于c 则执行Log 1和Log 0 注意:AND只能大写
Run Keyword If 'a'!='b' and 'a'!='c' Run Keywords Log 1
... AND Log 0
Comment 嵌套if
${score} Set Variable 100
Run Keyword If ${score} < 60 Log 不及格
... ELSE IF ${score} <= 80 Log 一般
... ELSE IF ${score}

Comment for普通循环
FOR ${value} IN apple lemon mango
Log ${value}
END
Comment for循环容器
@{list} Create List peach mango apple
FOR ${value} IN @{list}
Log ${value}
END
Comment for循环加if
FOR ${value} IN RANGE 1 11
Run Keyword If ${value}==5 Exit For Loop
Log ${value}
END

6 WebUI应用

  • WebUI应用
    • WebUI应用以登录JForum论坛为例,论坛搭建过程可以参看“页面对象模型”。
    • Robot Framework使用的浏览器驱动和Selenium是一样的,驱动安装参考“Selenium概念”。
    • 新建项目:File—>New Project—>Name为“Robot Framework”,选择保存路径,类型必须选目录—>OK。
      • Type选择Directory(目录),则可以创建测试套件。
      • Type选择File(文件),只能创建用例,不利于管理。
    • 项目下创建测试套件:选中项目,鼠标右键—>New Suite,Name为“JForum登录”,类型必选文件—>OK。
      • Type选择Directory(目录),得再继续创建一个File类型的套件才能创建用例。
      • Type选择File(文件),测试用例只允许在Type为File类型的测试套件下创建。
      • 测试套件的Editor编辑区,点击Library输入SeleniumLibrary,导入第三方库。
    • 套件下创建测试用例:选中套件(File类型),鼠标右键—>New Test Case,Name设为“登录论坛”—>OK。

6-1 登录论坛

WebUI应用-登录论坛

6-2 代码格式

Framework
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
*** Settings ***
Library SeleniumLibrary

*** Test Cases ***
登录论坛
Comment 打开论坛首页,设置隐式等待
Open Browser http://127.0.0.1:8080/jforum-2.7.0/forums/list.page Edge
Set Browser Implicit Wait 10

Comment 设置浏览器大小
Sleep 3
Set Window Size 1920 1080

Comment 获得窗口大小
Sleep 3
${width} ${height} Get Window Size
Log ${width}
Log ${height}

Comment 获取标题
${title} Get Title
Log ${title}

Comment 点击登录
Click Element xpath=//*[@id="login"]

Comment 输入账号密码,点击登录按钮
Sleep 3
Input Text xpath=//*[@id="loginform"]/table[2]/tbody/tr[2]/td/table/tbody/tr[2]/td[2]/input admin
Input Text xpath=//*[@id="loginform"]/table[2]/tbody/tr[2]/td/table/tbody/tr[3]/td[2]/input 123456
Click Button xpath=//*[@id="loginform"]/table[2]/tbody/tr[2]/td/table/tbody/tr[5]/td/input[2]

Comment 关闭浏览器
Sleep 3
Close Browser

6-3 其他元素

  • 其他元素
    • 进入嵌套框架Select Frame、跳出框架Unselect Frame、RadioBox单选框Click
    • Option下拉框
      • 值定位:Select From List By Value
      • 下标定位:Select From List By Index
      • 文本定位:Select From List By Label
    • CheckBox复选框:判断框体是否存在于页面Page Should Contain Element(断言操作)。
      • ${checked} Get Element Attribute xpath=//input[@type='checkbox']@checked
      • Run Keyword If '${checked}' == 'true' Log 复选框被选中
      • Run Keyword If '${checked}' == 'false' or '${checked}' == '' Log 复选框未选中或不存在
    • 窗口切换:获取所有句柄${handles} Get Window Handles、切换窗口Switch Window ${handles[n]}
    • 执行Js脚本Execute Javascript、模拟按键Press Keys、文件上传Input text(不用AutoItLibrary库)。

7 项目模块分层

  • 项目的模块进行分层
    • 底层(公共类):针对元素的通用操作来进行实现,SeleniumLibrary库和其他通用库。
    • 模块层
      • 元素层:针对页面单个元素操作,统一定义为页面元素关键字,给业务层调用。
      • 业务逻辑层
        • 针对页面具体要实现的行为方法,调用元素层的单一操作进行组合。
        • 定义为单个业务关键字,业务即测试人员最终想要实现的测试用例。
        • 为了方便后续维护,也为了减少用例编写的步骤冗余,尽量把每个页面单独定义为关键字。
        • 例如:登录,需要打开首页,再点击登录,就可以把首页的操作,单独定义在首页模块里。
        • 其他地方需用到首页操作时,直接调用资源文件即可,不用每次都单独写一遍,减少冗余。
      • 测试用例层:调用业务逻辑层的方法,组合实现想要的用例。
    • 设置公共资源变量
      • 一些常量可以使用公共变量进行管理New Scalar,例如用户名、密码等。
      • 使用时,在相应的测试套件中导入资源文件,相应的测试用例中进行调用。

Robot Framework
https://stitch-top.github.io/2024/07/16/ce-shi-kuang-jia/tf06-robot-framework/tf01-robot-framework/
作者
Dr.626
发布于
2024年7月16日 22:30:30
许可协议