Robot Framework 關(guān)鍵字、

到哪里查找關(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ù),如下所示。

image.png

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

image.png

關(guān)鍵字參數(shù)

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

image.png

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

比如大家看一下 Should Be Equal 關(guān)鍵字用法它是判斷是否相等的。

image.png

其中,參數(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í)行一下。

image.png

這里是通過(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é)果為:


image.png

大家可以看出差異了吧,這樣我們就可以清楚的知道這個(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
image.png

這樣的好處是可以清楚的知道不通過(guò)的是哪一個(gè)檢查點(diǎn),如果光寫什么不等于什么,有時(shí)候看的很懵。加一句描述性的話就很清楚了。

還有一種可變參數(shù),比如說(shuō) Catenate 它的參數(shù)有個(gè) * ,如果有個(gè)星號(hào)加個(gè)參數(shù)名就是指這個(gè)參數(shù)是個(gè)可變參數(shù)。參數(shù)你可以放多個(gè)進(jìn)去。

image.png

它的作用就是它可以提供多個(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)行截圖


image.png

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

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

image.png

常用關(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 32

  • Convert 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)鍵字,我們看下它的用法。

image.png

它有一個(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)行下。

image.png

它的運(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ì)算器。


image.png
image.png

細(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)

image.png

它打印的是 args 參數(shù)是字符串123,我們把它變成整數(shù)

${var}=    convert to integer    123

打印結(jié)果:


image.png

就變成了數(shù)字123了,不帶引號(hào)了。注意 關(guān)鍵字里面的 print 都是打印在日志文件里面,不是打印在界面上的。

**kwargs 參數(shù)怎么傳呢?直接寫 name=123 就可以了.

*** Settings ***
Library  mylib3.py

*** Test Cases ***
測(cè)試
    printarg    name=123

日志截圖:


image.png

它是一個(gè)字典,它會(huì)把每一個(gè)元素都打印出來(lái)。

庫(kù)的導(dǎo)入

除了除了 RFbuiltin 庫(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)擊去看一下。

image.png

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

image.png

假如有一個(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,這里要了解下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,235評(píng)論 0 38
  • Introduction This document gives coding conventions for t...
    wuutiing閱讀 4,797評(píng)論 0 9
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,918評(píng)論 0 9
  • 原文 原文下載之后的格式略有點(diǎn)不友好,利用簡(jiǎn)述的markdown,編輯一下.版權(quán)歸原作者 PEP Index > ...
    大飛哥閱讀 2,612評(píng)論 0 0
  • 第二天早上九點(diǎn)多鐘,賓館女經(jīng)理來(lái)敲門: “燕芬,燕芬,鬼女伢子還不起床,快起來(lái),領(lǐng)導(dǎo)們要在會(huì)議室開(kāi)會(huì)?!?...
    紫翼惠瑄閱讀 491評(píng)論 0 0

友情鏈接更多精彩內(nèi)容