Robot Framework 关键字、

到哪里查找关键字

RF 的能力是由关键字提供的,所以,我们必须对 RF 的常用关键字有个了解,这样才能把 RF 用好。库关键字在 RF 官方文档中有详细的描述。我们打开下面的网址:

http://robotframework.org/robotframework/#standard-libraries

可以看到官方列出的标准库,如下所示。

image.png

想要查阅那个库里面提供的关键字详细信息,只要点击对应的 View 按钮即可。
我们这里点击 BuiltInView

image.png

关键字参数

第一列就是关键字的名称,第二列就是关键字参数。如下所示

image.png

关键字其实百分之八九十就是一个函数,可以理解成定义成了 Robot Framework 层级的函数,用法除了变量的使用方法有些差别之外还有定义的方法不用括号直接放在一个单元格后面写的,就这点差别。其它的没有什么差别。

比如大家看一下 Should Be Equal 关键字用法它是判断是否相等的。

image.png

其中,参数 first 、second 是必选参数,需要填写内容,而参数 msg,values,base是带缺省值的参数,不填表示使用缺省值 是可以选的,可以不填。 我们看个例子:

*** Settings ***
#Library  SeleniumLibrary

*** Test Cases ***
判断是否相等
    ${var}=     set variable  hello
    Log To Console      变量var的值为:${var}
    should be equal     ${var}  hello

我们用 set variable 来设置一个变量,用例的第一行执行完的效果是 ${var} 这个变量值等于 hello 它是字符串。Log To Console 就是把这个值打印出来,然后这个 should be equal 就来判断 ${var}hello 是不是相等。我们先看相等的例子执行一下。

image.png

这里是通过的,因为它的变量值就是 hello,我们看一下三个缺省的参数 msg、values、ignore_case 看一下文档If msg is not given, the error message is <first> != <second>.如果不相等的话,会提示<first> != <second>我们试一个不相等的情况。把 hello 改为 helle

*** Settings ***
#Library  SeleniumLibrary

*** Test Cases ***
判断是否相等
    ${var}=     set variable  hello
    Log To Console      变量var的值为:${var}
    should be equal     ${var}  helle

运行结果为:


image.png

大家可以看出差异了吧,这样我们就可以清楚的知道这个检查点不通过是那个检查点。我们继续看文档 If msg is given and values gets a true value (default), the error message is <msg>: <first> != <second>. 如果你提供了这个参数,value 参数是 True 的话, msg 参数有的话,这个 msg 就是出错提示。

*** Settings ***
#Library  SeleniumLibrary

*** Test Cases ***
判断是否相等
    ${var}=     set variable  hello
    Log To Console      变量var的值为:${var}
    should be equal     ${var}  helle    判断变量是否等于hello
image.png

这样的好处是可以清楚的知道不通过的是哪一个检查点,如果光写什么不等于什么,有时候看的很懵。加一句描述性的话就很清楚了。

还有一种可变参数,比如说 Catenate 它的参数有个 * ,如果有个星号加个参数名就是指这个参数是个可变参数。参数你可以放多个进去。

image.png

它的作用就是它可以提供多个不指定个数的参数, Catenate 它的目的是什么呢?就是把后面的这些参数字符串拼起来,拼成一个字符串。拼接的字符串可以一个都没有是空的。By default, items are catenated with spaces, 就是缺省情况下你提供的这些参数元素是用空格把它们拼起来,当然也可以 SEPARATOR= 来指定你用什么东西拼接。

*** Settings ***
#Library  SeleniumLibrary

*** Test Cases ***
拼接练习
    ${var}=     set variable  hello
    ${var2}=     catenate    hello    world
    Log To Console      变量var的值为:${var2}

运行截图


image.png

结果为 hello world 它就给拼起来了。中间空格隔开。指定符号拼接:

注意多个空格用 \ 表示,像这样

image.png

常用关键字

已经接触过的:

  • Import Library 导入库
  • Should Be Equal 判断是否相等
  • Should Contain 检查是否包含
  • set variable 设置变量
  • log to console 打印到屏幕上
  • log 打印在日志里
  • sleep 睡眠

其它一些

  • Convert To Integer 把一个字符串转换成 int 比如${num}= set variable 32返回的是一个字符串,这个 num 定义的是字符串32而不是数字32,如果想定义数字${num}= convert to integer 32

  • Convert To Number 定义成浮点数就是小数${num}= Convert To Number 32

如果有的时候想直接把数字作为参数传递的话,可以这样写$括号里面加数字。log to console ${32}

内置库用的最多的就是检查点,should Be Equal、Should End With、Should Start With 等等很多,大家会发现内置库里面有很多 should 方法记起来会很麻烦,其实我们做检查点的时候只记住 Should Be True 这个关键字,我们看下它的用法。

image.png

它有一个 condition 参数,这个参数很特殊他它跟其他它的 should Be 之类不一样,其它的should Be 参数一般都有两个参数比较的某个参数是否包含的,它这个参数 condition 如果大家以后看 Robot Framework 文档一旦参数是 condition 就要注意了,它是什么意思呢,If condition is a string (e.g. ${rc} < 10)如果是字符串的话it is evaluated as a Python expression as explained它会把他的参数当成一个 python 表达式去计算,然后计算它的返回值是不是 True ,如果是 True 就通过,如果不是 True 就不通过。我们前面讲的所有检查点 should Be Equal 等都可以用它来代替。

我们举个例子:检查数字是不是等于20

#*** Settings ***
#Library  mylib1

*** Test Cases ***
验证
    ${num}=     convert to integer  20
    should be equal      ${num}     20

之前我们想检查数字是不是等于20的话只能这样写,我们运行下。

image.png

它的运行结果却是不通过,因为should be equal ${num} 20这种写法20是个字符串,在 Robot Framework 中如果说传进去的直接写一个像这种内容在里面,不管你写的是数字还是字符串他都当字符串处理,${num}= convert to integer 20这里是一个这里的20数字20,第二个20字符串20,所以两个对象不相等,如果你要判断这里就需要用这个方法should be equal as integers ${num} 20都把他们变成字符串比较,这种有点麻烦如果有们不是判断他是不是20而是不是大于20,这个时候就可以用Should Be True,上面我们判断是不是等于20就可以用这种写法。

*** Test Cases ***
验证
    ${num}=     convert to integer  20
    should be true      ${num}==20 

should be true 后面是 python 表达式,按道理讲按 python 表达式的写法就要这样写了${num}==20我们执行也可以通过,但是这里跟大家讲一旦用 should be true 建议把所有的变量都要把 {} 去掉,因为这样写才是正宗 python 表达式的写法,如果变量还是加花括号, Robot Framework 首先会把表达式里面${num}替换成${num}= convert to integer 20这个变量所对应的数值20,就是把这个变量${num}==20num直接替换成数值20,然后检查它是不是等于20,对应的 python 表达是这个样子的,其实我们想表达的是这样一个结果:

num = 20 
num == 20

如果加上{}就变成

20 == 20

有的人会疑问这有什么问题,这个 num 值本来就是20,这样是非常不好的,假如他不是整数${num}= set variable 20这个 num 就是字符串 20 了,那这个时候我们判断是不是20的话应该这样 ${num}=='20',这样就会出错了。注意:如果参数是python表达式里面所有的变量就用$加变量名,其他和 python 写法一样,但是这里不能有很多空格,如果有很多空格就被当成第二个参数了 这样有一个好处,有了 should be true 就不用记那么多的检查点,他几乎可以涵盖所有的检查点比如我要检查这个 num 是不是大于 20 怎么写,那就很简单了,python 怎么写我们怎么写

*** Test Cases ***
验证
    ${num}=     convert to integer  20
        should be true      $num>20

不仅仅这种简单的表达式,任何的写法都可以比如定义一个字符串 hello,我们检查这个hello 是否包含字符 e,在 Robot Framework 里面就要用should contain ${str1} e,这样写比较麻烦,我们可以用 should be true

*** Test Cases ***
验证
    ${str1}=    set variable  hello
    should be true      $str1=='hello'
#    should contain      ${str1}     e
    should be true      'e' in $str1

是不是已h开头

 should be true $str1.startswith('h')

检查字符串的长度是不是等于5

should be true      len($str1)==5

认识测试库

通常,关键字是由测试库提供的。 其实测试库就是 python 模块文件。关键字就是 Python 库里面的函数和类的方法。RF 就是本身就是个 Python 程序, 所以它的寻找库文件的原理和 python 是一样的。最终是通过 sys.path。 我们在哪个目录下面运行robot,那个目录就是当前工作目录当前工作目录就是在 sys.path 里面的。所以,我们放在当前目录下面的 python 模块文件,直接就能被找到。

RF 脚本使用函数名、方法名 大小写不敏感。现在我们自己写一个函数实现一个关键字试一下

import os,sys


def opencalc():
    os.system('calc')

def printarg(*args,**kwargs):
    if len(args) == 0:
        print('** no args **')
    else:
        print('** args are **')
        print('----------------')
        for one in args:
            print(repr(one))
        print('----------------')
    if len(kwargs) == 0:
        print('** no args **')
    else:
        print('** kwargs are **')
        print('----------------')
        for k,v in kwargs.items():
            print(repr(k) + ':' + repr(v))

        print('------------------')
def returnlist():
    return [1,2,3]

def returndict():
    return {
        'ele1': 'male',
        'ele2': 'female'
    }

我们有个函数叫mylib3.py里面定义了这几个函数,我们每第定义一个函数都可以在 Robot Framework 用例里面使用这个库文件,使用里面的函数作为关键字,不需要什么特殊的处理,但是使用之前我们要导入这个库,就像在 python 里面用另外一个模块的东西要用 import 是一样的,我们在 Robot Framework 里面要用 LibraryLibrary 类似python 里面的 import 所以说它和 python 带入库的规则是一模一样的

*** Settings ***
Library  mylib3.py

*** Test Cases ***
测试
    OPENCALC

我们来运行一下,他就会先导入mylib3.py刚才写的库文件然后执行里面的 OPENCALC ,我们看一下 OPENCALC 对应的代码

def opencalc():
    os.system('calc')

调用外部程序打开计算器,函数是可以传入参数的。运行一下它打开了计算器。


image.png
image.png

细心的同学会发现,我这次执行的命令跟上次不一样,多输入了 --pythonpath .(小数点两边是有空格的),是因为我没有加这段代码的时候运行报错了,找不到 mylib3 的模块,加上 --pythonpath . 就运行成功了,如果找不到就在前面加上 --pythonpath . 把它设置为你当前的路径,设置为 pythonpath ..代表当前路径,这个 pythonpath . 其实就是 mylib3.py 所在的这个路径,也是 exp1.robot 所在的路径他俩是同级的,这样就不会有问题。

我们写的第一个函数它是没有参数的,实际上我们可以传入参数给函数,比如我们看第二个函数 def printarg(*args,**kwargs):*args是可变参数,**kwargs这个是关键字可变参数,printarg 这个函数起到的作用是把参数打印出来,我们写这个函数的目的就是为了在 RF 里面调用它的时候能把参数是什么显示出来。我们举个例子:就是把它变量的值打印出来

*** Settings ***
Library  mylib3.py

*** Test Cases ***
测试
    ${var}=    set variable    123
    printarg    ${var}      #打印在log文件里面,终端上看不到

这个打印是打印在日志文件里面的,把日志文件打开

image.png

它打印的是 args 参数是字符串123,我们把它变成整数

${var}=    convert to integer    123

打印结果:


image.png

就变成了数字123了,不带引号了。注意 关键字里面的 print 都是打印在日志文件里面,不是打印在界面上的。

**kwargs 参数怎么传呢?直接写 name=123 就可以了.

*** Settings ***
Library  mylib3.py

*** Test Cases ***
测试
    printarg    name=123

日志截图:


image.png

它是一个字典,它会把每一个元素都打印出来。

库的导入

除了除了 RFbuiltin 库的关键字不需要导入声明,其它库必须要声明导入库的名称自己开发的第三方的, 在 RF 里面是大小写敏感的,有的库导入是可以提供参数的,通常是在库的实现是用类实现的时候比如 SeleniumLibrary 它的库实现就是用类实现的,我们可以点击去看一下。

image.png

比如这个 class SeleniumLibrary 它导入库里面的参数其实就是这个类的初始化函数的参数

image.png

假如有一个库它的实现是类实现的它里面又有初始化函数,你导入的时候就要提供初始化函数所需要的参数,因为每次导入库的时候 Robot Framework 就会生成类的实例,底下再调用这个库里面的关键字的时候,其实就是针对实例调用这个方法,所以一定要实例化,大家还记得面向对象吗,实例化的话如果说这个类有初始化函数的话实例化的时候一定要提供初始化函数的参数,所以我们 Robot Framework 就是这样导入这个库,这个库是类实现他的初始化函数有参数那你一定要提供参数,这个参数就是给初始化函数用的。

比如 SeleniumLibrary 我们看下他的参数def __init__(self, timeout=5.0, implicit_wait=0.0, run_on_failure='Capture Page Screenshot', screenshot_root_directory=None),注意他全部是带缺省值的参数就是我们也可以不提供,不提供就使用缺省值,但是有的实现这种关键字所对应的这个类不是缺省参数没有缺省值,就一定要提供参数,这边有缺省值就可以不提供他自动的使用缺省值了,当然也可以提供提供就不使用缺省值,比如这个里面 Library SeleniumLibrary 10 20 第一个值是10第二个参数是20,实例化的时候就会把 timeout 设置成10,implicit_wait 设置成20,这里要了解下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容