到哪里查找關(guān)鍵字
RF 的能力是由關(guān)鍵字提供的,所以,我們必須對(duì) RF 的常用關(guān)鍵字有個(gè)了解,這樣才能把 RF 用好。庫(kù)關(guān)鍵字在 RF 官方文檔中有詳細(xì)的描述。我們打開(kāi)下面的網(wǎng)址:
http://robotframework.org/robotframework/#standard-libraries
可以看到官方列出的標(biāo)準(zhǔn)庫(kù),如下所示。

想要查閱那個(gè)庫(kù)里面提供的關(guān)鍵字詳細(xì)信息,只要點(diǎn)擊對(duì)應(yīng)的 View 按鈕即可。
我們這里點(diǎn)擊 BuiltIn 的 View 。

關(guān)鍵字參數(shù)
第一列就是關(guān)鍵字的名稱,第二列就是關(guān)鍵字參數(shù)。如下所示

關(guān)鍵字其實(shí)百分之八九十就是一個(gè)函數(shù),可以理解成定義成了 Robot Framework 層級(jí)的函數(shù),用法除了變量的使用方法有些差別之外還有定義的方法不用括號(hào)直接放在一個(gè)單元格后面寫的,就這點(diǎn)差別。其它的沒(méi)有什么差別。
比如大家看一下 Should Be Equal 關(guān)鍵字用法它是判斷是否相等的。

其中,參數(shù) first 、second 是必選參數(shù),需要填寫內(nèi)容,而參數(shù) msg,values,base是帶缺省值的參數(shù),不填表示使用缺省值 是可以選的,可以不填。 我們看個(gè)例子:
*** Settings ***
#Library SeleniumLibrary
*** Test Cases ***
判斷是否相等
${var}= set variable hello
Log To Console 變量var的值為:${var}
should be equal ${var} hello
我們用 set variable 來(lái)設(shè)置一個(gè)變量,用例的第一行執(zhí)行完的效果是 ${var} 這個(gè)變量值等于 hello 它是字符串。Log To Console 就是把這個(gè)值打印出來(lái),然后這個(gè) should be equal 就來(lái)判斷 ${var} 和 hello 是不是相等。我們先看相等的例子執(zhí)行一下。

這里是通過(guò)的,因?yàn)樗淖兞恐稻褪?hello,我們看一下三個(gè)缺省的參數(shù) msg、values、ignore_case 看一下文檔If msg is not given, the error message is <first> != <second>.如果不相等的話,會(huì)提示<first> != <second>我們?cè)囈粋€(gè)不相等的情況。把 hello 改為 helle
*** Settings ***
#Library SeleniumLibrary
*** Test Cases ***
判斷是否相等
${var}= set variable hello
Log To Console 變量var的值為:${var}
should be equal ${var} helle
運(yùn)行結(jié)果為:

大家可以看出差異了吧,這樣我們就可以清楚的知道這個(gè)檢查點(diǎn)不通過(guò)是那個(gè)檢查點(diǎn)。我們繼續(xù)看文檔 If msg is given and values gets a true value (default), the error message is <msg>: <first> != <second>. 如果你提供了這個(gè)參數(shù),value 參數(shù)是 True 的話, msg 參數(shù)有的話,這個(gè) msg 就是出錯(cuò)提示。
*** Settings ***
#Library SeleniumLibrary
*** Test Cases ***
判斷是否相等
${var}= set variable hello
Log To Console 變量var的值為:${var}
should be equal ${var} helle 判斷變量是否等于hello

這樣的好處是可以清楚的知道不通過(guò)的是哪一個(gè)檢查點(diǎn),如果光寫什么不等于什么,有時(shí)候看的很懵。加一句描述性的話就很清楚了。
還有一種可變參數(shù),比如說(shuō) Catenate 它的參數(shù)有個(gè) * ,如果有個(gè)星號(hào)加個(gè)參數(shù)名就是指這個(gè)參數(shù)是個(gè)可變參數(shù)。參數(shù)你可以放多個(gè)進(jìn)去。

它的作用就是它可以提供多個(gè)不指定個(gè)數(shù)的參數(shù), Catenate 它的目的是什么呢?就是把后面的這些參數(shù)字符串拼起來(lái),拼成一個(gè)字符串。拼接的字符串可以一個(gè)都沒(méi)有是空的。By default, items are catenated with spaces, 就是缺省情況下你提供的這些參數(shù)元素是用空格把它們拼起來(lái),當(dāng)然也可以 SEPARATOR= 來(lái)指定你用什么東西拼接。
*** Settings ***
#Library SeleniumLibrary
*** Test Cases ***
拼接練習(xí)
${var}= set variable hello
${var2}= catenate hello world
Log To Console 變量var的值為:${var2}
運(yùn)行截圖

結(jié)果為 hello world 它就給拼起來(lái)了。中間空格隔開(kāi)。指定符號(hào)拼接:

注意多個(gè)空格用 \ 表示,像這樣

常用關(guān)鍵字
已經(jīng)接觸過(guò)的:
- Import Library 導(dǎo)入庫(kù)
- Should Be Equal 判斷是否相等
- Should Contain 檢查是否包含
- set variable 設(shè)置變量
- log to console 打印到屏幕上
- log 打印在日志里
- sleep 睡眠
其它一些
Convert To Integer 把一個(gè)字符串轉(zhuǎn)換成 int 比如
${num}= set variable 32返回的是一個(gè)字符串,這個(gè) num 定義的是字符串32而不是數(shù)字32,如果想定義數(shù)字${num}= convert to integer 32Convert To Number 定義成浮點(diǎn)數(shù)就是小數(shù)
${num}= Convert To Number 32
如果有的時(shí)候想直接把數(shù)字作為參數(shù)傳遞的話,可以這樣寫$括號(hào)里面加數(shù)字。log to console ${32}。
內(nèi)置庫(kù)用的最多的就是檢查點(diǎn),should Be Equal、Should End With、Should Start With 等等很多,大家會(huì)發(fā)現(xiàn)內(nèi)置庫(kù)里面有很多 should 方法記起來(lái)會(huì)很麻煩,其實(shí)我們做檢查點(diǎn)的時(shí)候只記住 Should Be True 這個(gè)關(guān)鍵字,我們看下它的用法。

它有一個(gè) condition 參數(shù),這個(gè)參數(shù)很特殊他它跟其他它的 should Be 之類不一樣,其它的should Be 參數(shù)一般都有兩個(gè)參數(shù)比較的某個(gè)參數(shù)是否包含的,它這個(gè)參數(shù) condition 如果大家以后看 Robot Framework 文檔一旦參數(shù)是 condition 就要注意了,它是什么意思呢,If condition is a string (e.g. ${rc} < 10)如果是字符串的話it is evaluated as a Python expression as explained它會(huì)把他的參數(shù)當(dāng)成一個(gè) python 表達(dá)式去計(jì)算,然后計(jì)算它的返回值是不是 True ,如果是 True 就通過(guò),如果不是 True 就不通過(guò)。我們前面講的所有檢查點(diǎn) should Be Equal 等都可以用它來(lái)代替。
我們舉個(gè)例子:檢查數(shù)字是不是等于20
#*** Settings ***
#Library mylib1
*** Test Cases ***
驗(yàn)證
${num}= convert to integer 20
should be equal ${num} 20
之前我們想檢查數(shù)字是不是等于20的話只能這樣寫,我們運(yùn)行下。

它的運(yùn)行結(jié)果卻是不通過(guò),因?yàn)?code>should be equal ${num} 20這種寫法20是個(gè)字符串,在 Robot Framework 中如果說(shuō)傳進(jìn)去的直接寫一個(gè)像這種內(nèi)容在里面,不管你寫的是數(shù)字還是字符串他都當(dāng)字符串處理,${num}= convert to integer 20這里是一個(gè)這里的20是數(shù)字20,第二個(gè)20是字符串20,所以兩個(gè)對(duì)象不相等,如果你要判斷這里就需要用這個(gè)方法should be equal as integers ${num} 20都把他們變成字符串比較,這種有點(diǎn)麻煩如果有們不是判斷他是不是20而是不是大于20,這個(gè)時(shí)候就可以用Should Be True,上面我們判斷是不是等于20就可以用這種寫法。
*** Test Cases ***
驗(yàn)證
${num}= convert to integer 20
should be true ${num}==20
should be true 后面是 python 表達(dá)式,按道理講按 python 表達(dá)式的寫法就要這樣寫了${num}==20我們執(zhí)行也可以通過(guò),但是這里跟大家講一旦用 should be true 建議把所有的變量都要把 {} 去掉,因?yàn)檫@樣寫才是正宗 python 表達(dá)式的寫法,如果變量還是加花括號(hào), Robot Framework 首先會(huì)把表達(dá)式里面${num}替換成${num}= convert to integer 20這個(gè)變量所對(duì)應(yīng)的數(shù)值20,就是把這個(gè)變量${num}==20num直接替換成數(shù)值20,然后檢查它是不是等于20,對(duì)應(yīng)的 python 表達(dá)是這個(gè)樣子的,其實(shí)我們想表達(dá)的是這樣一個(gè)結(jié)果:
num = 20
num == 20
如果加上{}就變成
20 == 20
有的人會(huì)疑問(wèn)這有什么問(wèn)題,這個(gè) num 值本來(lái)就是20,這樣是非常不好的,假如他不是整數(shù)${num}= set variable 20這個(gè) num 就是字符串 20 了,那這個(gè)時(shí)候我們判斷是不是20的話應(yīng)該這樣 ${num}=='20',這樣就會(huì)出錯(cuò)了。注意:如果參數(shù)是python表達(dá)式里面所有的變量就用$加變量名,其他和 python 寫法一樣,但是這里不能有很多空格,如果有很多空格就被當(dāng)成第二個(gè)參數(shù)了 這樣有一個(gè)好處,有了 should be true 就不用記那么多的檢查點(diǎn),他幾乎可以涵蓋所有的檢查點(diǎn)比如我要檢查這個(gè) num 是不是大于 20 怎么寫,那就很簡(jiǎn)單了,python 怎么寫我們?cè)趺磳?/p>
*** Test Cases ***
驗(yàn)證
${num}= convert to integer 20
should be true $num>20
不僅僅這種簡(jiǎn)單的表達(dá)式,任何的寫法都可以比如定義一個(gè)字符串 hello,我們檢查這個(gè)hello 是否包含字符 e,在 Robot Framework 里面就要用should contain ${str1} e,這樣寫比較麻煩,我們可以用 should be true
*** Test Cases ***
驗(yàn)證
${str1}= set variable hello
should be true $str1=='hello'
# should contain ${str1} e
should be true 'e' in $str1
是不是已h開(kāi)頭
should be true $str1.startswith('h')
檢查字符串的長(zhǎng)度是不是等于5
should be true len($str1)==5
認(rèn)識(shí)測(cè)試庫(kù)
通常,關(guān)鍵字是由測(cè)試庫(kù)提供的。 其實(shí)測(cè)試庫(kù)就是 python 模塊文件。關(guān)鍵字就是 Python 庫(kù)里面的函數(shù)和類的方法。RF 就是本身就是個(gè) Python 程序, 所以它的尋找?guī)煳募脑砗?python 是一樣的。最終是通過(guò) sys.path。 我們?cè)谀膫€(gè)目錄下面運(yùn)行robot,那個(gè)目錄就是當(dāng)前工作目錄當(dāng)前工作目錄就是在 sys.path 里面的。所以,我們放在當(dāng)前目錄下面的 python 模塊文件,直接就能被找到。
RF 腳本使用函數(shù)名、方法名 大小寫不敏感。現(xiàn)在我們自己寫一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)關(guān)鍵字試一下
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'
}
我們有個(gè)函數(shù)叫mylib3.py里面定義了這幾個(gè)函數(shù),我們每第定義一個(gè)函數(shù)都可以在 Robot Framework 用例里面使用這個(gè)庫(kù)文件,使用里面的函數(shù)作為關(guān)鍵字,不需要什么特殊的處理,但是使用之前我們要導(dǎo)入這個(gè)庫(kù),就像在 python 里面用另外一個(gè)模塊的東西要用 import 是一樣的,我們?cè)?Robot Framework 里面要用 Library ,Library 類似python 里面的 import 所以說(shuō)它和 python 帶入庫(kù)的規(guī)則是一模一樣的
*** Settings ***
Library mylib3.py
*** Test Cases ***
測(cè)試
OPENCALC
我們來(lái)運(yùn)行一下,他就會(huì)先導(dǎo)入mylib3.py剛才寫的庫(kù)文件然后執(zhí)行里面的 OPENCALC ,我們看一下 OPENCALC 對(duì)應(yīng)的代碼
def opencalc():
os.system('calc')
調(diào)用外部程序打開(kāi)計(jì)算器,函數(shù)是可以傳入?yún)?shù)的。運(yùn)行一下它打開(kāi)了計(jì)算器。


細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),我這次執(zhí)行的命令跟上次不一樣,多輸入了 --pythonpath .(小數(shù)點(diǎn)兩邊是有空格的),是因?yàn)槲覜](méi)有加這段代碼的時(shí)候運(yùn)行報(bào)錯(cuò)了,找不到 mylib3 的模塊,加上 --pythonpath . 就運(yùn)行成功了,如果找不到就在前面加上 --pythonpath . 把它設(shè)置為你當(dāng)前的路徑,設(shè)置為 pythonpath . ,.代表當(dāng)前路徑,這個(gè) pythonpath . 其實(shí)就是 mylib3.py 所在的這個(gè)路徑,也是 exp1.robot 所在的路徑他倆是同級(jí)的,這樣就不會(huì)有問(wèn)題。
我們寫的第一個(gè)函數(shù)它是沒(méi)有參數(shù)的,實(shí)際上我們可以傳入?yún)?shù)給函數(shù),比如我們看第二個(gè)函數(shù) def printarg(*args,**kwargs):,*args是可變參數(shù),**kwargs這個(gè)是關(guān)鍵字可變參數(shù),printarg 這個(gè)函數(shù)起到的作用是把參數(shù)打印出來(lái),我們寫這個(gè)函數(shù)的目的就是為了在 RF 里面調(diào)用它的時(shí)候能把參數(shù)是什么顯示出來(lái)。我們舉個(gè)例子:就是把它變量的值打印出來(lái)
*** Settings ***
Library mylib3.py
*** Test Cases ***
測(cè)試
${var}= set variable 123
printarg ${var} #打印在log文件里面,終端上看不到
這個(gè)打印是打印在日志文件里面的,把日志文件打開(kāi)

它打印的是 args 參數(shù)是字符串123,我們把它變成整數(shù)
${var}= convert to integer 123
打印結(jié)果:

就變成了數(shù)字123了,不帶引號(hào)了。注意 關(guān)鍵字里面的 print 都是打印在日志文件里面,不是打印在界面上的。
**kwargs 參數(shù)怎么傳呢?直接寫 name=123 就可以了.
*** Settings ***
Library mylib3.py
*** Test Cases ***
測(cè)試
printarg name=123
日志截圖:

它是一個(gè)字典,它會(huì)把每一個(gè)元素都打印出來(lái)。
庫(kù)的導(dǎo)入
除了除了 RF 的 builtin 庫(kù)的關(guān)鍵字不需要導(dǎo)入聲明,其它庫(kù)必須要聲明導(dǎo)入庫(kù)的名稱自己開(kāi)發(fā)的第三方的, 在 RF 里面是大小寫敏感的,有的庫(kù)導(dǎo)入是可以提供參數(shù)的,通常是在庫(kù)的實(shí)現(xiàn)是用類實(shí)現(xiàn)的時(shí)候比如 SeleniumLibrary 它的庫(kù)實(shí)現(xiàn)就是用類實(shí)現(xiàn)的,我們可以點(diǎn)擊去看一下。

比如這個(gè) class SeleniumLibrary 它導(dǎo)入庫(kù)里面的參數(shù)其實(shí)就是這個(gè)類的初始化函數(shù)的參數(shù)

假如有一個(gè)庫(kù)它的實(shí)現(xiàn)是類實(shí)現(xiàn)的它里面又有初始化函數(shù),你導(dǎo)入的時(shí)候就要提供初始化函數(shù)所需要的參數(shù),因?yàn)槊看螌?dǎo)入庫(kù)的時(shí)候 Robot Framework 就會(huì)生成類的實(shí)例,底下再調(diào)用這個(gè)庫(kù)里面的關(guān)鍵字的時(shí)候,其實(shí)就是針對(duì)實(shí)例調(diào)用這個(gè)方法,所以一定要實(shí)例化,大家還記得面向?qū)ο髥?,?shí)例化的話如果說(shuō)這個(gè)類有初始化函數(shù)的話實(shí)例化的時(shí)候一定要提供初始化函數(shù)的參數(shù),所以我們 Robot Framework 就是這樣導(dǎo)入這個(gè)庫(kù),這個(gè)庫(kù)是類實(shí)現(xiàn)他的初始化函數(shù)有參數(shù)那你一定要提供參數(shù),這個(gè)參數(shù)就是給初始化函數(shù)用的。
比如 SeleniumLibrary 我們看下他的參數(shù)def __init__(self, timeout=5.0, implicit_wait=0.0, run_on_failure='Capture Page Screenshot', screenshot_root_directory=None),注意他全部是帶缺省值的參數(shù)就是我們也可以不提供,不提供就使用缺省值,但是有的實(shí)現(xiàn)這種關(guān)鍵字所對(duì)應(yīng)的這個(gè)類不是缺省參數(shù)沒(méi)有缺省值,就一定要提供參數(shù),這邊有缺省值就可以不提供他自動(dòng)的使用缺省值了,當(dāng)然也可以提供提供就不使用缺省值,比如這個(gè)里面 Library SeleniumLibrary 10 20 第一個(gè)值是10第二個(gè)參數(shù)是20,實(shí)例化的時(shí)候就會(huì)把 timeout 設(shè)置成10,implicit_wait 設(shè)置成20,這里要了解下。