Robotframework技巧
基本语法
一、数据类型
robot framework中的数据类型都是通过变量来表达的,支持的数据类型包括:数值、字符串、元组、列表、布尔值等。
数值是通过${数值}来表示的,其中的数值可以是整形也可以是浮点型;
元组的表示${数值1,数值2,...};
列表的定义@{列表名称};
另外也有一些特定的变量来表示空、空格、布尔值等。
二、列表及其用法
列表是通过 Create List关键字来创建的,或者通过其他关键字获取到了多个元素统一放到一个列表中。定义时用的是@,但是引用是用的是$。列表中元素的获取是通过[]里面加序号,0开始
三、控制流之IF语句
robot framework中的 if 语句是使用关键字Run Keyword If 来实现的,语句内使用…来衔接。结构范例:
Run Keyword If 判断条件 其他关键字
... ELSE IF 判断条件 其他关键字
... ELSE 判断条件 其他关键字
- 如果是多个其他关键字使用Run Keywords 关键字 AND 关键字 AND 关键字 …
四、控制流之For循环
循环开始的关键字是FOR … END,txt文件中循环体是通过\作为改行的首关键字,新版本ride中已经可以自动缩进了。跳出循环可以使用Exit For Loop 或者 Exit For Loop If关键字。结构范例:
FOR 循环变量 IN XXX
关键字
END
FOR 循环变量 IN RANGE XXX
关键字
END
五、变量的使用
5.1 声明变量
- 使用 Set Test Variable 创建的变量,可以在该测试用例范围内的任何位置有效。例如,你在一个用户关键字中创建了变量,它将在测试用例级别有效及当前测试中的所有其他用户自定义关键字中有效。其他测试用例将看不到该变量。
- 使用 Set Suite Variable 创建的变量,可以在当前测试集范围内的任何位置有效。使用该关键字创建变量同使用测试数据文件的设置表格设置变量和引入变量文件相同。其他的关键字,包括可能的子测试集,都将不能看到该关键字创建的变量。
- 使用 Set Global Variable keyword 创建的变量, 在所有测试用例和测试集中有效。
5.2 内置变量
5.2.1 操作系统相关变量
内置的操作系统相关的变量,减少了测试数据对操作系统之间的差异性的关注
RF 中可用的操作系统相关的内置变量如下表:
*** Test Cases ***
Example
Create Binary File ${CURDIR}${/}input.data Some text here${\n}on two lines
Set Environment Variable CLASSPATH ${TEMPDIR}${:}${CURDIR}${/}foo.jar
5.2.2. 数字变量
如下面例子中所示,变量语法能用来创建 整型 和 浮点型 数据。当一个关键字需要 真实的数字而非对应的数字字符串作为参数时,这种创建数字变量的方法是很有用的。
*** Test Cases ***
Example 1A
Connect example.com 80 # Connect 获得两个字符串作为参数Example 1B
Connect example.com ${80} # Connect 获得一个字符串和一个整数作为参数Example 2
Do X ${3.14} ${‐1e‐4} # Do X 获得浮点数 3.14 和 ‐0.0001 作为参数
从二进制,八进制和十六进制值来创建整数也是可以的,创建时分别用: 0b, 0o 和 0x 作为相应的前缀,并且这种语法是大小写不敏感的。
*** Test Cases ***
Example
Should Be Equal ${0b1011} ${11}
Should Be Equal ${0o10} ${8}
Should Be Equal ${0xff} ${255}
Should Be Equal ${0B1010} ${0XA}
5.2.3. 布尔值和 None/ null变量
布尔值和 Python 的 None,Java 的 null 变量也可以用创建数字变量类似的语法创建:
*** Test Cases ***
Boolean
Set Status ${true} # Set Status 获得布尔值 true 作为参数
Create Y something ${false} # Create Y 获得字符串和布尔值 false 作为参数
NoneDo XYZ ${None} # Do XYZ 获得 Python None 作为参数 Null
${ret} = Get Value arg # Checking that Get Value returns Java null
Should Be Equal ${ret} ${null}
这些变量也是大小写不敏感的,所以 ${True} 和 ${true} 是一样的。此外 ${None} 和 ${null} 是同义词,因为用 Jython 解释器执行用例时, Jython 会自动将 None 和 null 转换成正确格式。
5.2.4. 空格和空(empty)变量
可以分别使用 ${SPACE} 和 ${EMPTY} 来创建空格和空字符串变量。这些变量很有用,如果不使用这些变量的话,就需要对空格或空单元格进行转义。如果需要一个以上的空格,也可以使用扩展变量语法来轻易获得,形如: ${SPACE * 5}。
下面的例子中,Should Be Equal 关键字得到的参数值是相等的,但很明显使用变量的方式比使用 ‘’ 转义的方式更易理解。
*** Test Cases ***
One Space
Should Be Equal ${SPACE} \ \ Four Spaces
Should Be Equal ${SPACE * 4} \ \ \ \ \ Ten Spaces
Should Be Equal ${SPACE * 10} \ \ \ \ \ \ \ \ \ \ \ Quoted Space
Should Be Equal "${SPACE}" " " Quoted Spaces
Should Be Equal "${SPACE * 2}" " \ " Empty
Should Be Equal ${EMPTY} \
还有两个变量 @{EMPTY} 和 &{EMPTY},他们分别表示 ‘空列表’ 和 ‘空字典’ 变量。 这两个变量也是有用的,例如在写测试模板的时候,模板关键字不带参数使用时。
*** Test Cases ***
Template
Some keyword @{EMPTY} Override
Set Global Variable @{LIST} @{EMPTY}
Set Suite Variable &{DICT} &{EMPTY}
5.2.5. 自动变量
还有一些自动变量可以在测试数据中使用。这些变量在测试过程中可能有不同的取值,其中有一些甚至不是一直可用的。
变量 | 解释 | 使用地点 |
---|---|---|
${TEST NAME} | 当前测试用例的名称 | 测试用例中 |
@{TEST TAGS} | 当前测试用例被打上的所有标记,按字母顺序排列。可以使用 Set Tags 和 Remove Tags 关键字动态的修改 | 测试用例中 |
${TEST DOCUMENTATION} | 当前测试用例的说明文档,可以使用 Set Test Documentation 关键字动态的修改 | 测试用例中 |
${TEST STATUS} | 当前测试用例的执行状态,PASS 或 FAIL | 测试用例 teardown时 |
${TEST MESSAGE} | 当前测试用例的信息 | 测试用例 teardown时 |
${PREV TEST NAME} | 前一个测试用例的名字,如果还没有测试用例被执行,则该值为空 | 所有地方 |
${PREV TEST STATUS} | 前一个测试用例的执行状态,PASS/FAIL,如果还没有测试用例被执行,则该值为空 | 所有地方 |
${PREV TEST MESSAGE} | 前一个测试用例执行所产生的可能的错误信息 | 所有地方 |
${SUITE NAME} | 当前测试套件的全称 | 所有地方 |
${SUITE SOURCE} | 当前测试套件文件或目录的绝对路径 | 所有地方 |
${SUITE DOCUMENTATION} | 当前测试套件的说明文档,可以使用 Set Suite Documentation 关键字动态的改变 | 所有地方 |
&{SUITE METADATA} | 当前测试套件的元数据 | 所有地方 |
${SUITE STATUS} | 当前测试套件的执行状态, PASS 或 FAIL | 测试套件 teardown |
${SUITE MESSAGE} | 当前测试套件的全部信息,包括统计 | 测试套件 teardown |
${KEYWORD STATUS} | 当前关键的执行状态,PASS 或 FAIL | 用户关键字 teardown |
${KEYWORD MESSAGE} | 当前关键字执行时可能产生的错误信息 | 用户关键字 teardown |
${LOG LEVEL} | 当前日志级别 | 所有地方 |
${OUTPUT FILE} | 到输出文件的绝对路径 | 所有地方 |
${LOG FILE} | 到日志文件的绝对路径,或者为NONE 当没有创建日志文件时 | 所有地方 |
${REPORT FILE} | 到测试报告文件的绝对路径,或者为NONE 当没有创建测试报告文件时 | 所有地方 |
${DEBUG FILE} | 到debug文件的绝对路径,或者为NONE 当没有创建debug文件时 | 所有地方 |
${OUTPUT DIR} | 到输出目录的绝对路径 | 所有地方 |
六、简单正则表达式
很多参数后可接正则表达式的参数值。
“*”和“?”可替代具体的字符,
“*”可匹配任何包括空值在内的字符串,
“?” 可以匹配任何单个字符。
例如:
- “–include prefix-*” 匹配所有以 “prefix-” 开头的 tag,
- “–includea???” 匹配所有以“a”开头 4 个字符的 tag。
语法实践
创建变量
$:创建字符串变量
@:创建列表变量
&:创建字典变量
debug
Comment 创建字符串变量
${text} Set Variable valuestring
Comment 创建列表
@{texts1} Create List value1 value2 value3
${texts2} Create List value1 value2 value3
Log ${texts1}[0]
Log ${texts2}[1]
Comment 创建字典
${text_dict1} Create Dictionary key1 value1 key2 value2 key3 value3
&{text_dict2} Create Dictionary key1 value1 key2 value2 key3 value3
Log ${text_dict1}[key1]
Log ${text_dict2}[key2]
获取字典/列表值
debug
${texts} Create List value1 value2 value3
Log ${texts}[0]
Log ${texts}[1]
Log ${texts}[2]
&{text_dict} Create Dictionary key1 value1 key2 value2 key3 value3
Log ${text_dict}[key1]
Log ${text_dict}[key2]
Log ${text_dict}[key3]
计算布尔值
真
*** Variables ***
${temp} eg
*** Test Cases ***
debug
${texts} Create List value1 value2 value3
Log ${texts}[0]
Log ${texts}[1]
Log ${texts}[2]
&{text_dict} Create Dictionary key1 value1 key2 value2 key3 value3
Log ${text_dict}[key1]
Log ${text_dict}[key2]
Log ${text_dict}[key3]
${result} Evaluate "${temp}" and "${texts}[1]" == "${text_dict}[key2]"
Log ${result}
${result1} Evaluate "va" in "${text_dict}[key1]" or "lue" in "${text_dict}[key2]"
Log ${result1}
假
*** Variables ***
${temp}
*** Test Cases ***
debug
${texts} Create List value1 value2 value3
Log ${texts}[0]
Log ${texts}[1]
Log ${texts}[2]
&{text_dict} Create Dictionary key1 value1 key2 value2 key3 value3
Log ${text_dict}[key1]
Log ${text_dict}[key2]
Log ${text_dict}[key3]
${result} Evaluate "${temp}" and "${texts}[1]" == "${text_dict}[key2]"
Log ${result}
执行python方法
使用Evaluate关键字
demo
${c_path} Evaluate os.getcwd() os
demo
${response} Get Requests http://www.demo.com/eg
${result} Evaluate type($response)
Log ${result}
调用对象方法
使用Call Method关键字
demo
&{text_dict} Create Dictionary key1 value1 key2 value2 key3 value3
${result} Call Method ${text_dict} get key3
Log ${result}
上面示例中效果等同于python源码
text_dict = {"key1": "value1", "key2": "value2", "key3": "value3"}
result = text_dict.get("key3")
print(result)
python字符串对象方法调用示例
demo
${orgin_str} Set Variable example for demo # 声明字符串变量
Log prefix${orgin_str}suffix # 字符串拼接
Log ${orgin_str}[1:10] # 字符串截取
${new_str} Replace String ${orgin_str} m M # 替换字符串指定字符
${new_str} Set Variable ${orgin_str.replace(" ","")} # 替换字符串指定字符
python字典对象方法调用示例
demo
&{text_dict} Create Dictionary key1 value1 key2 value2 key3 value3
${sub_key} Get Dictionary Keys ${text_dict}
Log ${sub_key}
@{kyes} Set Variable ${text_dict.keys()}
FOR ${value} IN @{kyes}
Log ${value}
END
# 这里区分一下 @ $ 符号的使用区别,
# 声明变量:没有明确声明返回类型时用@
# 声明变量:有明确声明返回类型时可以用@或$,如关键字:Convert To List, Create List, @{obj.method()}等
# 调用变量:遍历时一定用@
# 下面新增两种正确的写法
${kyes} Convert To List ${text_dict.keys()}
FOR ${value} IN @{kyes}
Log ${value}
END
${kyes} Set Variable @{text_dict.keys()}
FOR ${value} IN @{kyes}
Log ${value}
END
Built-in内置变量
内置变量(Built-In Variable) 点击查看
web自动化
设置浏览器下载路径
demo
${download} Evaluate os.getcwd() os
${options} Evaluate sys.modules['selenium.webdriver.chrome.options'].Options() sys,selenium.webdriver.chrome.options
${prefs} Create Dictionary download.default_directory ${download} profile.password_manager_enabled False
Call Method ${options} add_experimental_option prefs ${prefs}
# 启动浏览器
Create Webdriver Chrome chrome_options=${options}
Go To https://www.baidu.com/
设置浏览器默认最大化
demo
${options} Evaluate sys.modules['selenium.webdriver.chrome.options'].Options() sys,selenium.webdriver.chrome.options
Call Method ${options} add_argument start-maximized
# 启动浏览器
Create Webdriver Chrome chrome_options=${options}
Go To https://www.baidu.com/
屏蔽浏览器密码保存提示
demo
${options} Evaluate sys.modules['selenium.webdriver.chrome.options'].Options() sys,selenium.webdriver.chrome.options
${prefs} Create Dictionary profile.password_manager_enabled False
Call Method ${options} add_experimental_option prefs ${prefs}
# 启动浏览器
Create Webdriver Chrome chrome_options=${options}
Go To https://www.baidu.com/
屏蔽提示 禁用“Chrome正受控制”
demo
${options} Evaluate sys.modules['selenium.webdriver.chrome.options'].Options() sys,selenium.webdriver.chrome.options
${useAutomationExtension} Evaluate False
Call Method ${options} add_experimental_option useAutomationExtension ${useAutomationExtension}
${automation} Create List enable-automation
Call Method ${options} add_experimental_option excludeSwitches ${automation}
# 启动浏览器
Create Webdriver Chrome chrome_options=${options}
Go To https://www.baidu.com/
模拟手机浏览器
demo
${options} Evaluate sys.modules['selenium.webdriver.chrome.options'].Options() sys,selenium.webdriver.chrome.options
${mobileEmulation} Create Dictionary deviceName iPhone X
Call Method ${options} add_experimental_option mobileEmulation ${mobileEmulation}
# 启动浏览器
Create Webdriver Chrome chrome_options=${options}
Go To https://www.baidu.com/
接口自动化
multipart/form-data发送无文件的参数
接口说明
url:http://www.demo.com
uri: /test/address
mothed: Post
params:
{ "param1": "aaaaa",
"param2": "bbbbb",
"param3": 1,
"param4": {"ccc": "ddd"}
}
**实现:要点是需要将键值对的值换为元组,且元组第一个值必须是None。**
demo
${param1} Evaluate (None, "aaaaa")
${param2} Evaluate (None, "bbbbb")
${param3} Evaluate (None, 1)
${param4} Evaluate (None, '{"ccc": "ddd"}')
&{data} Create Dictionary param1 ${param1} param2 ${param2} param3 ${param3} param4 ${param4}
Create Session session http://www.demo.com
${response} Post Request session /test/address files=&{data}
ride.py启动错误和解决
- img = wx.Image(path, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
解决:
site-packages\robotide\application\application.py文件中插入如下代码
self.local = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
-
UnicodeDecodeError
Python编译环境的路径有中文,修改为纯英文路径 -
wxSystemSettingsNative::GetFont
Lib\site-packages\robotide\contrib\testrunner\testrunnerplugin.py文件的_create_font()代码如下:font=wx.SystemSettings.GetFont(wx.SYS_ANSI_FIXED_FONT)
对照如上修改GetFont()的参数后尝试运行 -
ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块
https://www.sqlite.org/download.html 下载系统对应的 “sqlite-dll、sqlite-tools” ,
然后解压到python安装目录的 Scripts 文件夹下