自动化测试实战:基于TestNG/JUnit/Robot Framework/Selenium
上QQ阅读APP看书,第一时间看更新

4.2 Robot Framework关键字

如果环境不统一,那么可能会造成细微的差别,因此笔者首先罗列出本节需要用到的应用程序名称及其版本号。

Robot Framework的关键字分为4种。

(1)标准关键字

标准关键字由Robot Framework官方提供,共13个。

BuiltIn:提供常用的通用操作。Robot Framework默认会导入该关键字,无须手动导入。

Collections:提供处理Python列表和字典的能力。

DateTime:提供处理日期和时间转换的能力。

Dialogs:暂停执行,并需要人工介入。

Easter:该关键字库只有一个名为None Shall Pass的关键字,其作用是强制抛出断言异常。

OperatingSystem:允许在Robot Framework运行的系统中执行各种与系统相关的任务。

Process:提供在系统中运行进程的能力。

Remote:远程关键字库的本地代理。

Reserved:Robot Framework的保留关键字库。

Screenshot:提供截图功能。

String:提供字符串的各种操作。

Telnet:建立Telnet连接,并执行相关命令。

XML:提供XML文件的各种操作。

(2)外部关键字

外部关键字不由Robot Framework官方提供,外部关键字库数量很庞大,本节仅对SeleniumLibrary、AppiumLibrary和RequestsLibrary进行简单介绍。

(3)自定义关键字

自定义关键字由用户自定义并存储在自定义关键字库中,实际上也属于外部关键字。

(4)用户关键字

用户关键字是Robot Framework中的User Keyword。

4.2.1 BuiltIn关键字库

1.Hello World!

Robot Framework使用了一种DSL(Domain-Specific Language,领域特定语言)来构建自己的语法标准。既然是一套语法,下面就先介绍如何输出“Hello World!”。

打开RIDE,依次新建工程、测试套件和测试用例,在测试用例中输入“Log”和“Hello World!”,如图4-1所示。

图4-1 打印Hello World!

执行以上测试用例输出结果如下所示。

关键字Log用于打印内容,其作用与Python中的print()以及Java中的System.out.println()方法类似。

类似的有Log Many,它用于打印多个值,如图4-2所示。

图4-2 打印多个值

执行以上测试用例输出结果如下所示。

这些打印内容会出现在output.xml和log.html文件中,如果只想打印到控制台,可以使用Log To Console关键字。

2.变量和常量

Robot Framework有3种变量:Scalar、List和Dictionary,它们分别用$、@和&符号定义,如图4-3所示。

图4-3 Scalar、List和Dictionary

Log和Log Many此处用于演示这3种变量的引用方式,执行以上测试用例输出结果如下所示。

实际上Set Variable关键字可接受多个参数,因此也可用它替代Create List关键字用于给列表类型的变量赋值。

另外,变量的作用范围默认为当前测试用例,如需跨测试用例共享,可使用以下关键字共享变量。

1)Set Global Variable:将局部变量转换为全局变量。

2)Set Suite Variable:将局部变量转换为测试套件级变量,在同一个测试套件的多个测试用例之间共享。

3)Set Test Variable和Set Task Variable:Set Test Variable关键字将局部变量用于当前测试任务,比如在测试用例中定义了A、B两个用户关键字,那么用户关键字A中定义的变量可以在用户关键字B中引用。Set Task Variable为Robot Framework 3.1加入的新关键字,意在更合理地表达该意图。从源码可以看出,Set Task Variable关键字的内部是直接调用的Set Test Variable关键字。

Robot Framework还有许多内置变量,如下所示。

1)${SUITE_NAME}:表示测试套件名称。

2)${TEST_NAME}:表示测试用例名称。

3)${REPORT_FILE}:表示测试报告文件路径。

4)${LOG_FILE}:表示日志文件路径。

另外,Robot Framework默认将数字类型也当作字符串来处理,因此要使其成为真正的“数字”,则需要使用数字常量,数字常量使用“${}”进行包裹,比如${1.5}表示数字1.5。

3.分支

Robot Framework没有专门的分支语句,但可借助Run Keyword If关键字来实现,如图4-4所示。

图4-4 分支

Run Keyword If关键字支持多分支,即使用ELSE IF或ELSE增加多个分支,执行以上测试用例输出结果如下所示。

ELSE IF也可简写为ELIF。

还有一些Run Keyword If开头的关键字,它们被用于清理操作。

1)Run Keyword If All Critical Tests Passed:如果Critical级别的测试用例全部执行通过,则执行指定关键字。用于测试套件的清理操作。

2)Run Keyword If All Tests Passed:如果测试用例全部执行通过,则执行指定关键字。用于测试套件的清理操作。

3)Run Keyword If Any Critical Tests Failed:如果任一Critical级别的测试用例执行失败,则执行指定关键字。用于测试套件的清理操作。

4)Run Keyword If Any Tests Failed:如果任一测试用例执行失败,则执行指定关键字。用于测试套件的清理操作。

5)Run Keyword If Test Failed:如果测试用例执行失败,则执行指定关键字。用于测试用例的清理操作。

6)Run Keyword If Test Passed:如果测试用例执行通过,则执行指定关键字。用于测试用例的清理操作。

7)Run Keyword If Timeout Occurred:如果测试用例执行超时,则执行指定关键字。用于测试用例的清理操作。

另外,还有一个Run Keyword Unless关键字,该关键字与Run Keyword If相反,即不满足条件才执行指定的关键字。但与Run Keyword If不同的是,它不支持多分支。

4.循环

Robot Framework早期使用:FOR作为循环的关键字,新版本的Robot Framework已经将其废弃,换用更简洁的关键字FOR。

循环的写法与Python语言非常相似,使用IN或IN RANGE来限定范围,IN后面可以直接跟多个值,也可以是一个变量,如图4-5所示。

图4-5 循环

执行以上测试用例输出结果如下所示。

Robot Framework的循环语句中也支持继续循环(即跳过当次循环)和中止循环,如图4-6所示。执行该测试用例,可以看到3并没有打印出来,而等于5时就提前中止了循环,因此打印的值只有0、1、2和4。

图4-6 继续循环和中止循环

还有一种比较笨拙的方式也能达到该效果,那就是配合Run Keyword If来使用,如图4-7所示。

图4-7 使用Run Keyword If实现继续循环和中止循环

5.执行Python代码

有时候现有的关键字不满足使用需求,可以借助Evaluate关键字来直接执行Python代码,如图4-8所示。

图4-8 Evaluate关键字的用法

这里使用了模块random的randint()函数,该函数返回一个指定范围的随机整数,执行以上测试用例输出结果如下所示。

Evaluate关键字支持导入多个模块,模块之间以英文逗号分隔即可。

如果想调用实例中的方法,可使用Call Method关键字,如图4-9所示。

图4-9 Call Method关键字的用法

以上测试用例使用了Call Method关键字调用字串符里的index()方法,查找子字符串在父字符串中出现的位置索引,执行以上测试用例输出结果如下所示。

6.断言

Robot Framework内置了许多断言关键字,具体如下。

● Should Be Empty:断言指定对象为空。

● Should Not Be Empty:断言指定对象非空。

● Should Be Equal:断言两个对象相等。

● Should Not Be Equal:断言两个对象不相等。

● Should Be Equal As Integers:断言两个对象转换为整型后相等。

● Should Not Be Equal As Integers:断言两个对象转换为整型后不相等。

● Should Be Equal As Numbers:断言两个对象转换为数字类型后相等。

● Should Not Be Equal As Numbers:断言两个对象转换为数字类型后不相等。

● Should Be Equal As Strings:断言两个对象转换为字符串后相等。

● Should Not Be Equal As Strings:断言两个对象转换为字符串后不相等。

● Should Be True:断言条件为真。

● Should Not Be True:断言条件为假。

● Should Contain:断言容器中包含指定元素,容器可以是字符串、列表等。

● Should Not Contain:断言容器中不包含指定元素,容器可以是字符串、列表等。

● Should Contain Any:断言容器中包含指定的任一元素,容器可以是字符串、列表等。

● Should Not Contain Any:断言容器中不包含指定的任一元素,容器可以是字符串、列表等。

● Should Contain X Times:断言字符串1包含X次字符串2。

Should Contain X Times关键字相对较难理解,来看一个具体示例,如图4-10所示。

图4-10 Should Contain X Times关键字的用法

执行以上测试用例,执行失败了,原因是“Hello World!”字符串只包含2个“o”,期望是包含3个。这一点从以下输出结果中也可以看出来。

● Should Start With:断言字符串1以字符串2开头。

● Should Not Start With:断言字符串1不以字符串2开头。

● Should End With:断言字符串1以字符串2结尾。

● Should Not End With:断言字符串1不以字符串2结尾。

● Should Match:断言字符串匹配指定的模式(使用Glob匹配模式)。

● Should Not Match:断言字符串不匹配指定的模式(使用Glob匹配模式)。

● Should Match Regexp:断言字符串匹配指定的模式(使用正则表达式匹配模式)。

● Should Not Match Regexp:断言字符串不匹配指定的模式(使用正则表达式匹配模式)。

现对4种匹配断言给出使用示例,如图4-11所示。

图4-11 匹配断言关键字的用法

第一个Glob匹配模式表示匹配任意数量任意字符;第二个Glob匹配模式表示匹配一个任意字符;第一个正则表达式匹配模式表示匹配一个除换行符外的任意字符;第二个正则表达式匹配模式表示匹配0~9其中一个字符。

有关Glob匹配和正则表达式匹配,有兴趣的读者可自行查阅相关资料进行了解。

Robot Framework还有个类似TestNG中fail()方法的关键字,即Fail关键字,执行它会直接抛出断言异常。

7.其他

有两个常用关键字不属于以上类别,这里单独介绍一下:Comment关键字提供注释功能,相当于Python的井号(#)或Java的双斜杠(//);Wait Until Keyword Succeeds关键字用于等待指定的关键字执行成功,它可指定超时时间(或重试次数)和失败后等待重试的时间间隔,如图4-12所示。

图4-12 Wait Until Keyword Succeeds关键字的用法

如果在指定的超时时间(或重试次数)后仍然执行失败,那Wait Until Keyword Succeeds关键字被认为执行失败,执行以上测试用例输出结果如下所示。

以上为BuiltIn关键字库中常用的关键字,整个BuiltIn关键字库中的关键字多达100多个,所以在此不一一介绍。有兴趣的读者可自行查阅相关资料了解其他关键字的用法。

4.2.2 Collections关键字库

Collections关键字库提供处理Python列表和字典的能力,本节对其中一些常用的关键字进行介绍。

1.列表操作

可使用Get From List关键字通过索引获取列表元素,还可使用Get Slice From List关键字进行切片操作,如图4-13所示。

图4-13 获取列表元素和切片

如果定义的变量为列表或字典,在引用时会被展开,因此在以上两个关键字中换用美元符号($)来引用变量。执行以上测试用例输出结果如下所示。

Insert Into List关键字用于在指定列表的指定位置索引处插入元素;Append To List关键字用于在指定列表末尾追加元素;Set List Value关键字用于修改指定位置索引的元素。它们的用法如图4-14所示。

图4-14 修改列表元素

执行以上测试用例输出结果如下所示。

Remove From List和Remove Values From List关键字分别用于删除列表中指定位置索引和指定值的元素,它们的用法如图4-15所示。

列表中有3个元素,分别使用以上关键字删除其中一个,最后只剩下一个元素,执行该测试用例输出结果如下所示。

图4-15 删除列表元素

列表操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

List Should Contain Value:断言列表中包含指定元素。

List Should Not Contain Value:断言列表中不包含指定元素。

List Should Contain Sub List:断言列表1包含列表2中的所有元素。

List Should Not Contain Duplicates:断言列表中不包含重复元素。

Lists Should Be Equal:断言列表1与列表2相等。

Should Contain Match:断言列表中包含指定匹配模式的元素。

Should Not Contain Match:断言列表中不包含指定匹配模式的元素。

2.字典操作

Get Dictionary Keys和Get Dictionary Values关键字分别用于获取指定字典的所有键和所有值。也可使用Get From Dictionary关键字通过指定键获取对应的值。它们的用法如图4-16所示。

图4-16 获取字典元素

执行以上测试用例输出结果如下所示。

Set To Dictionary关键字用于修改字典中指定键对应的值,用法如图4-17所示。

图4-17 修改字典元素

执行以上测试用例,从输出结果可以看出字典中键b的值已经被修改为222。

Remove From Dictionary和Pop From Dictionary关键字均通过指定键删除指定的元素,后者还会返回被删除的元素。Keep In Dictionary关键字用于指定需保留元素的键,其余元素将被删除。它们的用法如图4-18所示。

图4-18 删除字典元素

执行以上测试用例输出结果如下所示。

字典操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用:

Dictionary Should Contain Key:断言字典中包含指定Key。

Dictionary Should Not Contain Key:断言字典中不包含指定Key。

Dictionary Should Contain Value:断言字典中包含指定Value。

Dictionary Should Not Contain Value:断言字典中不包含指定Value。

Dictionary Should Contain Item:断言字典中包含指定Key-Value。

Dictionary Should Contain Sub Dictionary:断言字典1包含字典2中的所有元素。

Dictionaries Should Be Equal:断言字典1与字典2相等。

4.2.3 DateTime关键字库

DateTime关键字库提供处理日期和时间转换的能力。

Get Current Date关键字用于获取日期;Convert Date和Convert Time关键字分别用于日期和时间的格式转换。它们的用法如图4-19所示。

图4-19 获取日期和时间

以上测试用例使用Convert Date关键字将日期转换为时间戳,使用Convert Time关键字将3660s转换为01:01:00.000。执行以上测试用例输出结果如下所示。

DateTime关键字库还提供了对日期和时间进行加减运算的便捷操作。Add Time To Date和Add Time To Time关键字分别将时间与日期和时间相加。Subtract Date From Date、Subtract Time From Date和Subtract Time From Time关键字则用于相减的操作。它们的用法如图4-20所示。

图4-20 日期和时间的加减运算

以上代码中的timer为返回的格式,如果使用默认值,那么返回秒。使用Subtract Date From Date关键字时就未覆盖该默认值,因此返回10.0(秒)。

4.2.4 Dialogs关键字库

Dialogs关键字库提供人工介入的功能。既然是自动化测试,自然不提倡人工介入,因此除非万不得已,否则不要使用该关键字库中的关键字。

Dialogs关键字库中的关键字共5个。

1)Pause Execution:显示一个提示对话框,只有“OK”按钮,如图4-21所示。

图4-21 提示对话框

2)Execute Manual Step:显示一个选择对话框,提供“PASS”和“FAIL”按钮,若单击“PASS”按钮测试用例执行成功,如图4-22所示。

3)Get Value From User:显示一个输入对话框,提供输入框、“OK”和“Cancel”按钮,如图4-23所示。

图4-22 选择对话框

图4-23 输入对话框

4)Get Selection From User:用于单选,提供选项、“OK”和“Cancel”按钮,如图4-24所示。

5)Get Selections From User:用于多选,提供选项、“OK”和“Cancel”按钮,如图4-25所示。

图4-24 单选对话框

图4-25 多选对话框

生成以上弹窗的测试用例如图4-26所示。

图4-26 对话框关键字的用法

4.2.5 Easter关键字库

Easter关键字库只有一个名为None Shall Pass的关键字,其作用是强制抛出断言异常,如图4-27所示。

图4-27 None Shall Pass关键字的用法

执行以上测试用例输出结果为失败。

4.2.6 OperatingSystem关键字库

OperatingSystem关键字库允许在Robot Framework运行的系统中执行各种与系统相关的任务,本节对其中一些常用的关键字进行介绍。

1.文件操作

Create File关键字用于创建文件;Get File关键字用于读取文件;Append To File关键字用于在文件中追加内容。它们的用法如图4-28所示。

执行以上测试用例,从输出结果可以看到,追加内容默认是不会增加换行符的,如需将追加的内容换行,需要手动增加换行符。

图4-28 读写文件

执行以上测试用例后,到E盘根目录打开名为“testfile”的txt文件,文件内容与上述打印结果一致。

对文件进行复制、移动和删除操作分别使用Copy File、Move File和Remove File关键字。它们的用法如图4-29所示。

图4-29中的代码先将testfile.txt文件复制到了D盘根目录,然后再将testfile.txt文件移动到C盘根目录,最后删除了这些文件。

文件操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

1)File Should Exist:断言文件存在。以上测试用例已演示其用法。

2)File Should Not Exist:断言文件不存在。以上测试用例已演示其用法。

3)File Should Be Empty:断言文件为空。

4)File Should Not Be Empty:断言文件非空。

2.目录操作

Create Directory、List Directory和Empty Directory关键字分别用于创建目录、列出目录中的内容和清空目录。它们的用法如图4-30所示。

图4-29 复制、移动和删除文件

图4-30 创建、遍历和清空目录

执行以上测试用例输出结果如下所示。

目录还可以进行复制、移动和删除操作,它们分别使用Copy Directory、Move Directory和Remove Directory关键字完成。使用方法与文件的复制、移动和删除操作一致,在此不再演示。

目录操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用:

Directory Should Exist:断言目录存在。

Directory Should Not Exist:断言目录不存在。

Directory Should Be Empty:断言目录为空。以上测试用例已演示其用法。

Directory Should Not Be Empty:断言目录非空。以上测试用例已演示其用法。

另外,还有两个断言关键字同时适用于文件和目录。

Should Exist:断言文件或目录存在。

Should Not Exist:断言文件或目录不存在。

3.环境变量操作

Set Environment Variable关键字用于增加或修改环境变量;Append To Environment Variable关键字用于追加环境变量;Get Environment Variable关键字用于获取指定的环境变量;Remove Environment Variable关键字用于删除环境变量。它们的方法如图4-31所示。

图4-31 环境变量关键字的用法

执行以上测试用例输出结果如下所示。

环境变量操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

Environment Variable Should Be Set:断言环境变量已设置。

Environment Variable Should Not Be Set:断言环境变量未设置。

4.2.7 Process关键字库

Process关键字库用于提供在系统中运行进程的能力。

Run Process和Start Process关键字分别用于在前台和后台运行进程;Get Process Id和Get Process Result关键字分别用于获取进程ID和进程执行结果;Terminate Process关键字用于终止进程。它们的用法如图4-32所示。

执行该测试用例,可看到第一个进程正常结束,因此返回码为0,另一个进程被终止了,因此返回码非0(示例中为3221225794)。执行结果如下所示。

图4-32 进程关键字的用法

进程操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

Process Should Be Running:断言进程运行中。

Process Should Be Stopped:断言进程已停止。

4.2.8 Remote关键字库

Remote关键字库是远程关键字库的本地代理,而远程关键字库的实例需要作为参数传递给远程服务器。

1.创建远程关键字库

创建一个简单的自定义关键字库作为远程关键字库。

由于本节的目的是介绍Remote关键字库的使用,因此创建的自定义关键字库很简单。关于自定义关键字库详见4.2.15节。

2.安装远程服务器

在存放远程关键字库的机器上安装远程服务器,安装命令如下。

3.启动远程服务器

首先将RemoteLibrary的实例作为参数传递给RobotRemoteServer,为此新建remotelibraryserver模块,其代码如下。

然后执行以上代码即可启动远程服务器,执行后控制台输出如下,则表示启动成功。

由于笔者是在本机启动远程服务器,因此IP地址为127.0.0.1。另外,远程服务器的默认端口为8270,可在创建RobotRemoteServer实例时传入端口号覆盖该默认值。

4.使用远程关键字

导入Remote关键字库即可间接使用RemoteLibrary关键字库中的关键字了,如图4-33所示。

图4-33中的Stop Remote Server关键字为Remote关键字库自带的关键字,用于关闭远程服务器。Sum即为RemoteLibrary关键字库中的关键字。

图4-33 RemoteLibrary关键字库的关键字

另外,在导入Remote关键字库时可使用别名RemoteLibrary,这样在图4-33中的Source列会显示成别名RemoteLibrary,这样可更便于理解。

4.2.9 Reserved关键字库

Reserved关键字库中为Robot Framework的保留关键字,应避免使用。Reserved关键字库中一共有10个保留关键字,它们都有替代方案。

Break:替代关键字为Exit For Loop或Exit For Loop If。

Continue:替代关键字为Continue For Loop或Continue For Loop If。

Elif:替代关键字为ELIF。

Else:替代关键字为ELSE。

Else If:替代关键字为ELSE IF。

End:替代关键字为END。

For:替代关键字为FOR。

If:替代关键字为Run Keyword If。

Return:无通用替代方案。关键字中若需要返回值,在编写关键字时使用return返回即可;用户关键字中若需要返回值,可在编写用户关键字时使用Return Value、Return From Keyword或Return From Keyword If返回值。

While:无直接替代方案。可使用for循环替代while循环。

4.2.10 Screenshot关键字库

Screenshot关键字库提供截图功能。

Set Screenshot Directory关键字用于设置截图目录;Take Screenshot和Take Screenshot Without Embedding关键字用于截图,区别在于前者会将截图嵌入log文件中,而后者不会。它们的用法如图4-34所示。

图4-34 截图关键字的用法

执行以上测试用例后打开E:\img目录,可以看到有“嵌入的图片_1.jpg”和“不嵌入的图片_1.jpg”两个图片文件。打开log.html文件,可以看到只有“嵌入的图片_1.jpg”被嵌入log中,如图4-35所示。

图4-35 嵌入log中的截图

4.2.11 String关键字库

String关键字库提供字符串的各种操作,本节对其中一些常用的关键字进行介绍。

Convert To Uppercase和Convert To Lowercase关键字分别用于将字符串转换为大写和小写;Get Substring关键字用于获取子字符串;Remove String关键字用于移除子字符串;Replace String关键字用于替换指定子字符串。它们的用法如图4-36所示。

图4-36 字符串关键字的用法(1)

以上测试用例中的${SPACE}为Robot Framework的内置变量,用于表示空格。执行该测试用例输出结果如下所示。

Format String关键字用于格式化字符串,占位符为一对花括号({});Strip String关键字用于去掉首尾的指定字符串;Split String关键字用于使用分隔符分隔字符串。它们的用法如图4-37所示。

执行该测试用例输出结果如下所示。

图4-37 字符串关键字的用法(2)

字符串操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

Should Be String:断言给定对象为字符串。

Should Not Be String:断言给定对象非字符串。

Should Be Uppercase:断言字符串为大写。

Should Be Lowercase:断言字符串为小写。

Should Be Titlecase:断言字符串为首字母大写。

Should Be Unicode String:断言字符串为Unicode字符串。

Should Be Byte String:断言字符串为Byte字符串。

4.2.12 Telnet关键字库

Telnet关键字库用于建立Telnet连接,并执行相关命令,本节对其中一些常用的关键字进行介绍。

Open Connection关键字用于建立Telnet连接;Login关键字用于登录;Execute Command关键字用于执行命令;Close Connection关键字用于断开Telnet连接。它们的用法如图4-38所示。

图4-38中的测试用例中由于使用了root用户登录,因此提示符为井号(#)。执行该测试用例输出结果如下所示。

图4-38 Telnet关键字的用法

4.2.13 XML关键字库

XML关键字库提供XML文件的各种操作,本节对其中一些常用的关键字进行介绍。

在E盘根目录新增testxml.xml文件,文件内容如下。

Parse Xml和Save Xml关键字分别用于读取和保存XML文件;Get Element、Get Element Attribute和Get Element Text关键字分别用于获取元素、元素属性值和元素文本;Add Element关键字用于增加元素。它们的用法如图4-39所示。

图4-39 读取XML文件内容和增加XML元素

执行以上测试用例输出结果如下所示。

执行后查看testxml.xml文件,该文件已经增加了一个名为“Selenium自动化测试”的<book>元素。

Set Element Attribute、Set Element Text和Set Element Tag关键字分别用于修改元素属性值、元素文本和元素标签。它们的用法如图4-40所示。

执行该测试用例成功后,查看testxml.xml文件,文件内容如下所示。

图4-40 修改XML文件内容

上述文件中的第一个<book>元素对应的category属性值、<title>标签名及其文本均已被修改。

Remove Element和Remove Element Attribute关键字分别用于删除元素和元素属性。它们的用法如图4-41所示。

图4-41 删除XML文件内容

执行以上测试用例后,查看testxml.xml文件,文件内容如下所示。

可以看到之前加入的<book>已经被删除,且第一个<book>元素的category属性也被删除了。

以上获取、修改和删除关键字均有对应的复数形式。

Get Element:对应的复数形式为Get Elements,用于获取多个元素。

Get Element Attribute:对应的复数形式为Get Element Attributes,用于获取元素多个属性值。

Get Element Text:对应的复数形式为Get Elements Texts,用于获取多个元素文本。

Set Element Attribute:对应的复数形式为Set Elements Attribute,用于批量修改元素属性值。

Set Element Text:对应的复数形式为Set Elements Text,用于批量修改元素文本。

Set Element Tag:对应的复数形式为Set Elements Tag,用于批量修改元素标签。

Remove Element:对应的复数形式为Remove Elements,用于批量删除元素。

Remove Element Attribute:对应的复数形式为Remove Elements Attribute,用于批量删除多个元素的指定属性。另外,还有Remove Element Attributes和Remove Elements Attributes关键字,分别用于批量删除单个和多个元素的所有属性。

XML操作中有一些断言关键字,可结合BuiltIn中的断言关键字一起使用。

Element Should Exist:断言元素存在。

Element Should Not Exist:断言元素不存在。

Element Attribute Should Be:断言XML的某属性值等于期望的属性值。

Element Attribute Should Match:断言XML的某属性值匹配期望的属性值。

Element Should Not Have Attribute:断言元素不存在某属性。

Element Text Should Be:断言元素的文本值等于期望的文本值。

Element Text Should Match:断言元素的文本值匹配期望的文本值。

Elements Should Be Equal:断言元素相等。

Elements Should Match:断言元素匹配。

4.2.14 外部关键字库

本节对SeleniumLibrary、AppiumLibrary和RequestsLibrary关键字库进行简单介绍,开始之前需要先安装对应的关键字库,可执行以下命令安装。

1.SeleniumLibrary

SeleniumLibrary关键字库是对Selenium Python函数库的一个封装,用于Web测试。其常用关键字如表4-1所示。

表4-1 SeleniumLibrary关键字库的常用关键字

(续)

2.AppiumLibrary

AppiumLibrary关键字库是对Appium Python函数库的一个封装,用于Android和iOS测试。其常用关键字如表4-2所示。

表4-2 AppiumLibrary关键字库的常用关键字

(续)

表4-2中“Android专用”的关键字仅适用于Android,“iOS专用”的关键字仅适用于iOS,其他关键字同时适用于Android和iOS。

3.RequestsLibrary

RequestsLibrary关键字库是对Requests函数库的一个封装,用于HTTP接口测试。

RequestsLibrary关键字库中有多种方式可以建立一个会话,但最常用的是直接使用Create Session关键字建立会话。为了便于使用JSON数据,该库还提供了To Json关键字用于将字符串转换为JSON对象。最后可使用Delete All Sessions关键字断开所有会话。

RequestsLibrary关键字库支持各种HTTP请求形式。

Get Request:发送Get请求。

Post Request:发送Post请求。

Put Request:发送Put请求。

Delete Request:发送Delete请求。

Head Request:发送Head请求。

Options Request:发送Options请求。

Patch Request:发送Patch请求。

外部关键字库中通常会包含其特定的断言关键字,它们均可结合Robot Framework标准断言关键字一起使用,在此不再赘述。

4.2.15 自定义关键字库

可使用模块(Python)或类(Python或Java)来实现关键字库,鉴于Robot Framework由Python开发,笔者就以Python为例介绍关键字库的实现。

1.实现逻辑

首先实现关键字库的逻辑,即按照平时编程的习惯来编写代码即可。新增一个名为calculator的模块,在模块中新增加、减、乘和除4个函数。

注意:Python中的函数(或方法)注释可显示在Robot Framework中,出于简化目的,以上代码未提供注释。

2.规范关键字库的命名

关键字库名与模块名(或类名)一致。参考之前的外部关键字库命名方式,有必要使用更为直观的命名方式来重命名calculator模块,这里将calculator模块重命名为CalculatorLibrary。

3.设置新建关键字库实例的策略

新建关键字库实例的策略是指Robot Framework在何种情况下新建一个关键字库的实例,有以下几种策略。

1)TEST CASE:每个测试用例新建一个关键字库的实例。默认采用该方式。

2)TEST SUITE:每个测试套件新建一个关键字库的实例。

3)GLOBAL:在整个测试执行生命周期只创建一个关键字库的实例。对于Python而言,关键字库可以使用模块或类来实现。如果使用模块来实现,那么该关键字库总是使用GLOBAL作为新建关键字库实例的策略。

如果要更改新建关键字库实例的策略,那么需要使用类属性ROBOT_LIBRARY_SCOPE,并将以上策略之一以字符串形式为其赋值。

作为示例,笔者将CalculatorLibrary的范围设置为TEST SUITE,因此需要先新建一个CalculatorLibrary类,然后将加、减、乘和除4个函数移到该类中,并增加ROBOT_LIBRARY_SCOPE属性。

注意:为了方便直接导入关键字库,需要将类名与模块名保持一致。因为如果类名与模块名不一致,导入关键字库时需使用“模块名.类名”的形式才能导入。

CalculatorLibrary模块重构后的代码如下所示。

4.指定关键字库的版本

关键字库的版本可供Robot Framework用于调试信息,且Libdoc工具还会将版本号写入它生成的关键字文档中。因此给关键字库指定版本号是有一定意义的。

可使用ROBOT_LIBRARY_VERSION或__version__属性来指定关键字库的版本。Robot Framework会先查找ROBOT_LIBRARY_VERSION,如果没找到则会查找__version__。它们都可以用于模块或类中。

笔者使用ROBOT_LIBRARY_VERSION属性将CalculatorLibrary的版本号设置为1.0。

5.将方法暴露为关键字

方法与关键字具有对应关系,即方法名对应关键字名(但可使用robot_name属性或@keyword装饰器自定义关键字名),方法的参数对应关键字的参数。如果该方法为构造方法,则其参数将对应导入关键字库时,在Agrs输入框中填写的内容。如果不想将方法暴露为关键字,有两种方法。

1)将方法定义为私有的(以下划线开头),但从Robot Framework 3.0.2开始,具有robot_name属性的私有方法也会被暴露为关键字。

2)使用__all__属性,只有在__all__列表中出现的方法才会被Robot Framework识别为关键字。

另外,Robot Framework对关键字名称的大小写不敏感,比如CalculatorLibrary关键字库中的add()方法,在Robot Framework中使用时,可使用“Add”或“add”来引用。

6.使用自定义关键字库

Python与Java类似,它也有自己的应用程序共享平台,比如PyPI。当然也可以使用私有仓库来共享Python应用程序。关于Python应用程序的打包和共享超出了本书的讨论范围,有兴趣的读者可自行查阅相关资料进行了解。

为了演示CalculatorLibrary关键字库的使用,笔者采用了一种最简单的方式,即将CalculatorLibrary.py文件复制到Python的其中一个搜索路径即可,推荐复制到C:\P rogram Files\P ython37\Lib\site-packages目录。其中C:\P rogram Files为笔者P ython的安装目录,读者应根据实际情况进行替换。

复制完成后导入CalculatorLibrary关键字库,即可使用其中的关键字,如图4-42所示。

图4-42 使用CalculatorLibrary关键字库的关键字

4.2.16 用户关键字

用户关键字是由关键字库中的关键字和(或)其他用户关键字组合而成的,编写它的语法与编写测试用例类似。

图4-43中定义了一个用户关键字,该关键字提供了与4.2.8节的RemoteLibrary关键字库中Sum关键字相同的功能。

用户关键字中的Documentation、Teardown、Timeout和Tags与测试用例中的类似,Arguments用于指定用户关键字的形参,Return Value用于指定用户关键字的返回值。

图4-43 定义用户关键字

4.2.17 关键字的优先级

当标准关键字、外部关键字、自定义关键字和用户关键字混合使用时,对于相同名称的关键字Robot Framework应该调用哪一个呢?要回答这个问题,需要了解关键字的优先级。

1)第1优先级:在同一个文件中定义和调用用户关键字时,该用户关键字具有最高优先级。

2)第2优先级:Resource文件中定义的用户关键字具有第2优先级。

3)第3优先级:外部关键字库中定义的外部关键字具有第3优先级。

4)第4优先级:标准关键字库中定义的标准关键字具有最低优先级。

如果重名的关键字处于以上不同的优先级,那么Robot Framework会自动处理,但如果出现在同一优先级,那就会出现关键字冲突。

有两种方法可以解决关键字冲突:

1)用“关键字库名.关键字名”或“Resource文件名.关键字名”来引用该关键字,比如:

注意:有一个在SeleniumLibrary和AppiumLibrary关键字库中都存在的关键字Capture Page Screenshot,它不仅同时存在于两个关键字库,还刚好被这两个关键字库的构造方法用作参数的默认值。解决方法是在导入关键字库时覆盖其默认值即可,即在Args中填写如下内容。

2)使用Set Library Search Order关键字指定关键字库或Resource文件的搜索顺序。