robotframework框架(四)之RIDE图形化界面使用关键字

一、简介

Robot Framework是一款基于Python的开源自动化测试框架,具有良好的可扩展性和关键字驱动的特点。它主要用于验收测试(Acceptance Testing)和验收测试驱动开发(ATDD),同时也支持行为驱动开发(BDD)和机器人流程自动化(RPA),主要有以下特点:

  1. 关键字驱动:Robot Framework采用关键字驱动的方法来编写测试用例,这使得测试用例易于理解和维护。
  2. 易于使用的表格语法:测试数据通常以表格的形式输入,这种表格式的语法简单易用,并且可以方便地编辑和管理测试用例。
  3. 高度可扩展性:可以通过XML-RPC服务或其他编程语言(如Java)扩展框架的功能,从而满足不同的测试需求。
  4. 多客户端和接口支持:能够同时测试多种类型的客户端(Web、PC、移动端)或接口,适用于分布式、异构环境中的自动化测试。
  5. 丰富的库支持:提供了标准库和远程库,用户可以根据需要创建新的测试库,例如Selenium库用于Web应用测试,Remote Swing库用于Java应用测试等。
  6. 生成详细的报告和日志:提供易于阅读的结果报告和HTML格式的日志,帮助用户快速定位问题并进行分析。

二、RIDE使用常用关键字

(一)字符串操作

在Robot Framework框架中,字符串拼接可以使用catenate关键字。例如,要将"Hello"和"World"这两个字符串拼接起来,可以这样写:

${str1} = Catenate('Hello', ' World')

这将得到结果"Hello World"。

如果希望中间没有空格,可以使用SEPARATOR= none选项:

${str2} = Catenate('Hello', 'World', SEPARATOR= none)

*** Settings ***
Library           Collections

*** Test Cases ***

测试列表关键字
	#测试列表元素拼接并打印(无空格)
    @{list3}    Create List    this    is    a    boy
    ${joined_list}    Catenate    SEPARATOR=    @{list3}
    Log Many    joined_list is ${joined_list}
    
    #测试列表元素拼接并打印(下划线分割)
    @{list4}    Create List    this    is    a    girl
    ${joined_list}    Catenate    SEPARATOR=_    @{list4}
    Log Many    joined_list is ${joined_list}
    
    #测试列表元素拼接并打印(空格)
    @{list5}    Create List    this    is    a    girl
    ${joined_list}    Catenate    @{list5}
    Log Many    joined_list is ${joined_list}

(二)列表操作

*** Settings ***
Library           Collections

*** Test Cases ***

测试列表关键字
    #测试$创建列表
    ${list1}    Create List    aa    bb    cc
    Log    ${list1}
    
    #测试@创建列表
    @{list2}    Create List    apple    banana    orange
    Log Many    @{list2}
    
    #测试查看变量数据类型
    ${type}    Evaluate    str(type(@{list2}))
    Log    Variable type is ${type}
    
    #测试循环打印列表元素
    FOR    ${item}    IN    @{list2}
    Log    Item is ${item}
    END
    
    #测试获取列表第一个元素
    ${first_element}    Get From List    ${list2}    0
    Log    The first element is ${first_element}
    
    #测试获取列表最后一个元素
    ${last_index}    Evaluate    len(@{list2}\n)-1
    Log    Last element index is${last_index}
    ${last_element}    Get From List    ${list2}    ${last_index}
    Log    The last element is ${last_element}
    
    #测试列表倒序打印
    @{my_list}    Create List    1    2    3    4    5
    Log Many    my_list is @{my_list}
    Reverse List    ${my_list}
    Log Many    my_list is @{my_list}

需要注意

在Robot Framework中,使用 @{list}${list} 创建列表的区别在于变量的类型和用途:

  1. @{list}: 使用 @ 符号定义的变量是一个列表(List)类型的变量。这种变量可以存储多个值,每个值都是列表的一个元素。你可以使用索引来访问列表中的特定元素,或者在测试中进行迭代。

    例子:

    robot*** Settings ***
    Library    Collections
    
    *** Variables ***
    @{fruits}=  Create List  Apple  Banana  Cherry
    
    *** Test Cases ***
    Example Test
        Log  @{fruits}
        ${first_fruit}=  Get From List  ${fruits}  0
        Log  The first fruit is ${first_fruit}
    

    在这个例子中,@{fruits} 是一个列表变量,我们可以使用 Get From List 关键字来获取列表中的第一个元素。

  2. ${list}: 使用 $ 符号定义的变量是一个标量(Scalar)类型的变量,它只能存储单个值。如果你尝试使用 Create List 关键字并将结果赋值给一个标量变量,那么列表中的所有元素会被连接成一个字符串,通常以空格作为分隔符。

    例子:

    robot*** Settings ***
    Library    Collections
    
    *** Variables ***
    ${fruits}=  Create List  Apple  Banana  Cherry
    
    *** Test Cases ***
    Example Test
        Log  The fruits are ${fruits}
    

    在这个例子中,${fruits} 是一个标量变量,它实际上会存储一个由空格分隔的字符串 "Apple Banana Cherry"。

总结:使用 @{list} 创建的是列表类型的变量,可以存储多个值;而使用 ${list} 创建的是标量类型的变量,只能存储单个值,即使使用 Create List 关键字,结果也会被转换为一个字符串。在需要处理多个值时,应该使用列表变量(@{list}),在只需要单个值时,使用标量变量(${list})。

(三)字典操作

*** Settings ***
Library           Collections

*** Test Cases ***
测试字典关键字
    #测试创建字典
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    Log    ${my_dict}
    Log Dictionary    ${my_dict}
    
    &{my_dict1}    Create Dictionary    a=11    b=22    c=33
    Log Many    &{my_dict1}
    Log Dictionary    ${my_dict1}

其他操作

*** Settings ***
Library           Collections

*** Test Cases ***
测试字典关键字
    #测试创建字典
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    Log    ${my_dict}
    Log Dictionary    ${my_dict}
    &{my_dict1}    Create Dictionary    a=11    b=22    c=33
    Log Many    &{my_dict1}
    Log Dictionary    ${my_dict1}
    
    #测试字典中获取一个键对应的值
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    ${value}    Get From Dictionary    ${my_dict}    a
    Log    Dictionary Values is ${value}
    
    #在字典中设置一个键的值
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    Set To Dictionary    ${my_dict}    d=4
    Log    ${my_dict}
    
    #在字典中删除一个键的值
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    Remove From Dictionary    ${my_dict}    a
    Log    ${my_dict}
    
    #复制一个字典
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    ${copy_dict}    Copy Dictionary    ${my_dict}
    Log    ${copy_dict}
    
    #获取字典中键值对
    ${my_dict}    Create Dictionary    a=1    b=2    c=3
    ${length}    Get Dictionary Items    ${my_dict}
    Log    ${length}

(四)控制流程操作

在Robot Framework中,IF控制流程是测试用例中常见的逻辑结构,用于根据条件执行不同的操作。以下是一些与IF相关的关键字,以及它们在Robot Framework和Python中的使用示例:

1、IF

IF - 根据条件执行代码块,强烈建议在 IF 块中缩进关键字,但不是强制性的要求。

  • Robot Framework:

    #Robot Framework 4.0之后的推荐写法
    IF    ${condition}
        Do something
    END
    
    #Robot Framework 4.0之前的写法,现在不推荐
    ${score}    Set Variable    int(59)
    Run Keyword If    ${score}<int(60)    Log    C
    ...    ELSE IF    int(60)<=${score}<int(90)    Log    B
    ...    ELSE    ${score}>=int(90)    Log    A
    

    注意:Robot Framework 4.0引入了内置的IF/ELSE支持,通常建议使用IF/ELSE而不是使用Run Keyword If此关键字。

  • Python:

    if condition:
        do_something()
    

2、ELSE

ELSE - 如果IF条件不满足,执行ELSE代码块。

  • Robot Framework:

    IF    ${condition}
        Do something
    ELSE
        Do something else
    END
    
  • Python:

    if condition:
        do_something()
    else:
        do_something_else()
    

3、ELSE IF

ELSE IF - 如果第一个IF条件不满足,可以检查另一个条件。

  • Robot Framework:

    *** Test Cases ***
    Example
        IF    $rc > 0
            Positive keyword
        ELSE IF    $rc < 0
            Negative keyword
        ELSE IF    $rc == 0
            Zero keyword
        ELSE
            Fail    Unexpected rc: ${rc}
        END
    
  • Python:

    if condition1:
        do_something()
    elif condition2:
        do_something_else()
    

注意:

END IF - 结束IF条件块。

  • Robot Framework: 通常不需要显式写出,由END关键字隐式表示。
  • Python: 不需要,Python的if-else结构自动结束。

4、FOR

FOR - 循环结构,可以结合IF使用。

  • Robot Framework:

    FOR    ${i}    IN    @{list}
        IF    ${i} > 0
            Log    Item ${i} is positive
        END
    END
    
  • Python:

    for i in list:
        if i > 0:
            print(f"Item {i} is positive")
    

5、WHILE

WHILE - 循环结构,可以结合IF使用。

  • Robot Framework:

    ${counter}=    Set Variable    0
    WHILE    ${counter} < 10
        IF    ${counter} % 2 == 0
            Log    Even number
        END
        ${counter}=    Evaluate    ${counter} + 1
    END
    
  • Python:

    counter = 0
    while counter < 10:
        if counter % 2 == 0:
            print("Even number")
        counter += 1
    

6、RETURN

RETURN - 根据条件返回值或退出测试用例。

  • Robot Framework:

    IF    ${condition}
        RETURN    Something
    END
    
  • Python:

    if condition:
        return "Something"
    

7、BREAK/CONTINUE

FOR 和 WHILE 循环执行都可以用 BREAKCONTINUE 语句来控制。前者提前退出整个循环,后者停止执行当前循环迭代并继续下一个循环。在实践中,它们与 Python、Java 和许多其他编程语言中的 breakcontinue 语句具有相同的语义。

BREAKCONTINUE 通常与 IF/ELSE 或 TRY/EXCEPT 结构有条件地一起使用,尤其是内联 IF 语法通常对它们很方便。这些语句必须在循环体中使用,可能在上述控制结构中使用,并且在循环体中调用的关键字中使用它们是无效的。

FOR循环中运用BREAK、CONTINUE

*** Test Cases ***
BREAK with FOR
    ${text} =    Set Variable    zero
    FOR    ${var}    IN    one    two    three
        IF    '${var}' == 'two'    BREAK
        ${text} =    Set Variable    ${text}-${var}
    END
    Should Be Equal    ${text}    zero-one

CONTINUE with FOR
    ${text} =    Set Variable    zero
    FOR    ${var}    IN    one    two    three
        IF    '${var}' == 'two'    CONTINUE
        ${text} =    Set Variable    ${text}-${var}
    END
    Should Be Equal    ${text}    zero-one-three
*** Test Cases ***
CONTINUE and BREAK with WHILE
    WHILE    True
        TRY
             ${value} =    Do Something
        EXCEPT
            CONTINUE
        END
        Do something with value    ${value}
        BREAK
    END

8、TRY/EXCEPT

当关键字失败时,Robot Framework 的默认行为是停止当前测试并执行其可能的拆解。但是,在执行过程中也可能需要处理这些故障。为此,Robot Framework 5.0 引入了本机 TRY/EXCEPT 语法,但也有其他处理错误的方法。

可以有多个 EXCEPT 分支。在这种情况下,它们将逐个匹配,并执行第一个匹配的分支。一个 EXCEPT 也可以有多个消息要匹配,如果其任何消息匹配,则执行此类分支。

*** Test Cases ***
Multiple EXCEPT branches
    TRY
        Some Keyword
    EXCEPT    Error message    # Try matching this first.
        Error Handler 1
    EXCEPT    Another error    # Try this if above did not match.
        Error Handler 2
    EXCEPT    ${message}       # Last match attempt, this time using a variable.
        Error Handler 3
    END

Multiple messages with one EXCEPT
    TRY
        Some Keyword
    EXCEPT    Error message    Another error    ${message}    # Match any of these.
        Error handler
    END

也可以有 EXCEPT 而不带消息,在这种情况下,它与任何错误匹配。只能有一个这样的 EXCEPT ,并且它必须跟在可能的其他 EXCEPT 个分支后面:

*** Test Cases ***
Match any error
    TRY
        Some Keyword
    EXCEPT               # Match any error.
        Error Handler
    END

Match any after testing more specific errors
    TRY
        Some Keyword
    EXCEPT    Error message    # Try matching this first
        Error Handler 1
    EXCEPT                     # Match any that did not match the above.
        Error Handler 2
    END

三、参考

  1. selenium官网:https://www.selenium.dev/
  2. driver下载地址:https://www.selenium.dev/zh-cn/documentation/selenium_manager/
  3. chromedriver下载镜像地址(版本不一定最新):https://registry.npmmirror.com/binary.html?path=chromedriver/
  4. chromedriver下载地址(最新):https://googlechromelabs.github.io/chrome-for-testing/
  5. firefoxdriver下载:https://github.com/mozilla/geckodriver
  6. robotframework手册:https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html
posted @ 2024-08-30 14:20  xyztank  阅读(120)  评论(0编辑  收藏  举报