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 声明变量

  1. 使用 Set Test Variable 创建的变量,可以在该测试用例范围内的任何位置有效。例如,你在一个用户关键字中创建了变量,它将在测试用例级别有效及当前测试中的所有其他用户自定义关键字中有效。其他测试用例将看不到该变量。
  2. 使用 Set Suite Variable 创建的变量,可以在当前测试集范围内的任何位置有效。使用该关键字创建变量同使用测试数据文件的设置表格设置变量和引入变量文件相同。其他的关键字,包括可能的子测试集,都将不能看到该关键字创建的变量。
  3. 使用 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}     ${1e4}     # 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 文件夹下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值