robotframework框架(四)之RIDE图形化界面使用关键字
一、简介
Robot Framework是一款基于Python的开源自动化测试框架,具有良好的可扩展性和关键字驱动的特点。它主要用于验收测试(Acceptance Testing)和验收测试驱动开发(ATDD),同时也支持行为驱动开发(BDD)和机器人流程自动化(RPA),主要有以下特点:
- 关键字驱动:Robot Framework采用关键字驱动的方法来编写测试用例,这使得测试用例易于理解和维护。
- 易于使用的表格语法:测试数据通常以表格的形式输入,这种表格式的语法简单易用,并且可以方便地编辑和管理测试用例。
- 高度可扩展性:可以通过XML-RPC服务或其他编程语言(如Java)扩展框架的功能,从而满足不同的测试需求。
- 多客户端和接口支持:能够同时测试多种类型的客户端(Web、PC、移动端)或接口,适用于分布式、异构环境中的自动化测试。
- 丰富的库支持:提供了标准库和远程库,用户可以根据需要创建新的测试库,例如Selenium库用于Web应用测试,Remote Swing库用于Java应用测试等。
- 生成详细的报告和日志:提供易于阅读的结果报告和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}
创建列表的区别在于变量的类型和用途:
-
@{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
关键字来获取列表中的第一个元素。 -
${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 循环执行都可以用 BREAK
和 CONTINUE
语句来控制。前者提前退出整个循环,后者停止执行当前循环迭代并继续下一个循环。在实践中,它们与 Python、Java 和许多其他编程语言中的 break
和 continue
语句具有相同的语义。
BREAK
和 CONTINUE
通常与 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
三、参考
- selenium官网:https://www.selenium.dev/
- driver下载地址:https://www.selenium.dev/zh-cn/documentation/selenium_manager/
- chromedriver下载镜像地址(版本不一定最新):https://registry.npmmirror.com/binary.html?path=chromedriver/
- chromedriver下载地址(最新):https://googlechromelabs.github.io/chrome-for-testing/
- firefoxdriver下载:https://github.com/mozilla/geckodriver
- robotframework手册:https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html