#################################################################
#author: 陳月白
#_blogs: http://www.cnblogs.com/chenyuebai/
#################################################################
一、環境搭建
概覽:win 7+ python 3.6 + pycharm + robotframework + IntelliBot + fireFox
1.安裝相關的庫
推薦使用pip安裝,如 pip install robotframework(以及selenium2library)
研發環境沒外網,采用離線安裝,down包后解壓--進入--python setup.py install
(1)WEB頁面測試:
https://pypi.python.org/pypi/robotframework
https://pypi.python.org/pypi/selenium#downloads #依賴包
https://pypi.python.org/pypi/robotframework-seleniumlibrary #依賴包
https://pypi.python.org/pypi/robotframework-selenium2library
(2)接口測試:
在線:pip install requests
離線:
https://pypi.python.org/pypi/certifi #依賴包
https://pypi.python.org/pypi/urllib3#downloads #依賴包
https://pypi.python.org/pypi/idna#downloads #依賴包
https://pypi.python.org/pypi/chardet/#downloads #依賴包
https://pypi.python.org/pypi/requests#downloads
- - - -
若想安裝RIDE(界面編輯工具)需安裝:
1.six https://pypi.python.org/simple/six/ 1.6.0 wxPython安裝依賴
2.wxPython: https://pypi.python.org/pypi/wxPython -- wxPython-4.0.0-cp36-cp36m-win_amd64.whl (md5, pgp)
3.發現RIRE不支持python3.X。。。打擾了
2.pycharm
開發IDE, 略
3.IntelliBot pycharm開發插件【語法高亮】
方法1:pycharm>File>setting>Plugins>Browse reponsitories
方法2:https://plugins.jetbrains.com/plugin/7386-intellibot 下載至本地
pycharm>File>setting>Plugins>install plugin from disk
4.pycharm配置執行器
File>setting>Tools>External tool,配置完成后即可在.robot文件中選擇使用該執行器執行
Parameters:當前文件路徑
Working directory:工作路徑,日志、結果輸出等,如下:
注:log.html 執行日志
output.xml 執行相關信息的xml,可用於后續二次解析
report.xml 執行結果報表
5.fireFox瀏覽器及對應驅動
(1)瀏覽器
https://www.mozilla.org/zh-CN/firefox/developer/
(2)驅動
https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-win64.zip
解壓(geckodriver.exe)拷貝至python安裝目錄
二、使用cmd執行
運行一條用例:
pybot --test test_case test_suit.robot
運行指定文件:
pybot test_suit.robot
運行當前目錄下以.robot為后綴名的測試文件
pybot *.robot
運行當前testpath目錄下的所有用例
pybot testpath
三、案例腳本(.robot文件)基本語法
1.基本語法
*** Settings *** Library MyLib #導入自定義的庫 Library SeleniumLibrary *** Test Cases *** #第一行為固定格式,標識 #建議同python一致,使用tab縮進對齊(pycharm中設置tab=4空格),否則可能報執行失敗,報 "Test case contains no keywords" case1 helloworld #案例名 log chenyuebai first rfw case #log 相當於python的print,可在生成的log.xml中查看 case 2 log #打異常日志,支持多種級別 log test line 2 ERROR case 3 varible ${myname} Set variable chen #定義變量 log my name is ${myname} #使用變量 #case 4 use varible #變量作用域為其定義所在的案例(case3),否則報"Variable '${myname}' not found." # log ${myname} case 5 Catenate ${hi1} Catenate hello world #定義變量方式2 連接兩個對象,支持自定義連接符 log ${hi1} ${hi2} Catenate SEPARATOR=---- hello world log ${hi2} case 6 list @{mylist} create list a b c #定義列表 log many @{mylist} #打印列表中的元素 case 7 get time ${currentTime} get time #獲取當前時間 2018-01-02 18:05:47 log ${currentTime} ${currentYear} get time format=year #支持多種傳參,詳情看函數定義 log current year is ${currentYear} case 8 sleep log get time sleep 1 #睡眠,等同於python的time.sleep(5) log get time case 9 if ${score} set variable 55 run keyword if ${score}>=90 log 優秀 ... ELSE IF ${score}>=70 log 良好 #ELSE/ELSE IF要大寫。。。語法很蛋疼。。為啥不直接套用python的語法。。 ... ELSE log 很差 # ... 不知道基於什么考慮的。。看起來像是標識屬於“run keyword if”這個判斷邏輯;類似python的tab? case 10 for #for循環,注意需要使用\來標識這個for循環范圍,感覺和上面的...類似 :FOR ${i} IN RANGE 5 # for in in range(5): \ log ${i} # print(i) case 11 allround the list @{myList} create list 1 2 3 4 # myList = [1,2,3,4] :FOR ${i} IN @{myList} # for i in myList: \ log ${i} # print(i) case 12 Evauate #調用python中的方法,很強大 ${randomNum} EVALUATE random.random() random #變量 關鍵字EVALUATE 調用python的方法 方法所在的庫名 log ${randomNum} case 13 call my python #導入自定義庫,下面有詳細說明 ${nowTime} get current time log ${nowTime} case 14 Comment log start #line 1 comment line 2 #標明注釋:使用關鍵字或者#均可 log end case 15 Selenium2Library #Selenium2Library庫,操作瀏覽器,可作web界面自動化,待細化 open_browser http://www.baidu.com firefox Input text id=kw 陳月白 click button id=su sleep 3 close Browser
2.robot文件中調用自定義庫
Selenium2Library提供了很多的方法,但在實際使用中仍有部分場景需要自行編寫,robotFramework支持導入用戶自定義的庫。
需注意文件名、類名的對應關系,否則會導入庫失敗;
在...\python安裝路徑\Lib\site-packages下:
(1)自定義方法所在的文件:MyKeywords.py
import time class MyKeywords(): def __init__(self): pass #獲取當前時間 def get_current_time(self): current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) return current_time
(2)創建__init__.py
""" 繼承自定義庫中的類,rfw會解析類中的函數作為關鍵詞 """ from .MyKeywords import * class MyRobotFwkLib(MyKeywords): ROBOT_LIBRARY_SCOPE = "GLOBAL"
(3).robot文件導入自定義類,即可使用類中的方法
*** Settings *** Library MyRobotFwkLib #導入自定義的庫 case 13 call my python ${nowTime} get current time log ${nowTime}
四、使用SeleniumLibrary庫進行web界面自動化測試
#todo
20180126
- - - -
SeleniumLibrary提供很多基礎關鍵字,基本可以模擬完成瀏覽器上大部分操作;
另外還支持將基礎關鍵字按業務邏輯封裝為高級關鍵字(可以理解為一個函數,下面有例子);
支持指定多種瀏覽器,按元素標識操作元素;
定位元素工具我用的火狐的插件:firePath、fireBug,很方便;
基礎關鍵字(SeleniumLibrary自帶) + 高級關鍵字(按實際業務對基礎關鍵字封裝) + 用戶自定義庫中的關鍵字(上面有配置實例),幾乎可以滿足大多數web應用各種業務場景;
ps:調試時發現許多關鍵字無法查看定義,不方便看用法及傳參,但實際執行時又沒問題;
看了下SeleniumLibrary庫的__init__.py,確定是因為多數涉及的關鍵字庫,都是在啟動執行時,初始化繼承過來的;
於是笨方法,直接全量引入,目前來看也沒什么影響。
實現項目后台登錄及校驗:
*** Settings *** #方便IDE調試,不添加無法找到關鍵字定義 Library browsermanagement Library AlertKeywords Library BrowserManagementKeywords Library CookieKeywords Library ElementKeywords Library FormElementKeywords Library FrameKeywords Library JavaScriptKeywords Library RunOnFailureKeywords Library ScreenshotKeywords Library SelectElementKeywords Library TableElementKeywords Library WaitingKeywords Library WindowKeywords Library SeleniumLibrary #配置套件級別的Setup和Teardown Suite Setup ... log now test start 1 #只執行一條 Suite Teardown Run Keywords ... close all browsers AND #執行多條 ... log now end 4 #全局變量 *** Variables *** ${loginPageUrl} http://10.XX.XX.232:9XX0/admin/index.do?index=1 ${validUsername} admin ${validloginPasswd} adminpasswd *** Test Cases *** case 1 correct login test #配置用例級別的Setup和Teardown [setup] log setup log 2 [teardown] log teardown log 3 correctLoginTest ${validUsername} ${validloginPasswd} #使用基礎關鍵字封裝出的高級關鍵字 #使用基礎關鍵字封裝高級關鍵字,類似python的一個函數,支持入參出參,很靈活 *** Keywords *** correctLoginTest [Arguments] ${uasename} ${passwd} open browser ${loginPageUrl} firefox setBrowser input text xpath=html/body/div[1]/form/input[1] ${uasename} input text xpath=html/body/div[1]/form/input[2] ${passwd} click element class=submit sleep 5 # ${page1_title} get title #獲取頁面title,可后續校驗頁面是否到達 # ${width} ${height} get window size #獲取瀏覽器窗口大小 # select window NEW #切換到新彈出窗口(視圖焦點) page should contain element xpath=//*[@id='topMenu4'] #系統管理菜單 sleep 2 close all browsers setBrowser set window size 1024 768 #設置瀏覽器窗口大小 maximize browser window #瀏覽器窗口最大化 sleep 1
20180201
- - - -
2018.02.06
五、數據驅動測試
數據驅動測試,適合相同流程、相同預期結果下,不同輸入組合的測試
比如測試異常登錄流程,用戶名、密碼在錯誤(或空)各種組合下的異常驗證
例子:
*** Settings *** Library SeleniumLibrary Test Template errorLoginTest #公共邏輯 *** Variables *** ${loginPageUrl} http://10.XX.XX.232:9XX0/admin/index.do?index=1 ${validUsername} admin ${validloginPasswd} adminpasswd *** Test Cases *** username passwd #異常登錄測試 case 2:Invalid Username invalidname ${validloginPasswd} case 3:Invalid Password ${validUsername} invalidPasswd case 4:Invalid Both invalidName invalidPasswd case 5:Empty Username ${EMPTY} ${validloginPasswd} case 6:Empty Password ${validUsername} ${EMPTY} case 7:Empty Both ${EMPTY} ${EMPTY} *** Keywords *** errorLoginTest [Arguments] ${uasename} ${passwd} open browser ${loginPageUrl} firefox input text xpath=html/body/div[1]/form/input[1] ${uasename} input text xpath=html/body/div[1]/form/input[2] ${passwd} click element class=submit sleep 5 page should contain element class=submit 5 error:預期應含登錄元素未找到【即跳轉失敗】 sleep 5 close all browsers
執行結果: