正式開(kāi)始寫Web自動(dòng)化測(cè)試吧。
Xebium腳本分為2部分,一部分為Scenario部分,其作用是把頁(yè)面操作步驟變?yōu)闇y(cè)試場(chǎng)景,具體寫法為:
| scenario | 主頁(yè)元素展示驗(yàn)證 |
| do | open | on | /index.html |
| ensure | do | waitForElementPresent | on | //h2 |
| check | is | verifyText | on | //h2 | 暢銷產(chǎn)品 |
在頁(yè)面上就渲染為:

但是scenario并不是執(zhí)行的部分(可以點(diǎn)擊頁(yè)面導(dǎo)航欄內(nèi)的“Test”按鈕執(zhí)行用例),具體的測(cè)試部分是用如下腳本來(lái)實(shí)現(xiàn)的:
| script |
| 主頁(yè)元素展示驗(yàn)證 |
| scenario2 |
|...... |
script 表格才是真正執(zhí)行的部分。當(dāng)然,如果script表格中也用scenario表的執(zhí)行步驟來(lái)寫也是可以的,Xebium并不限制你的寫法。但scenario和script分離的好處就是我可以在script中重復(fù)執(zhí)行scenario。比如我定義了一個(gè)search控件的搜索,包括輸入和點(diǎn)擊搜索控件操作(前提是search控件在不同頁(yè)面間都能用某種方式定位),那么給這些步驟一個(gè)scenario名稱,那么在不同用例的script表格部分加入這個(gè)scenario名稱,就達(dá)到了步驟復(fù)用的目的,是不是更加省力呢?
我們?cè)偕钊胂氯?,我們?huì)看到每一個(gè)步驟的第一列都是一個(gè)關(guān)鍵詞來(lái)驅(qū)動(dòng)的,那么有多少關(guān)鍵詞達(dá)到驅(qū)動(dòng)的目的呢?
1.?| start browser | ${BROWSER} | on url | ${url} |?
這句腳本用來(lái)啟動(dòng)瀏覽器,${BROWSER} 是Xebium獨(dú)特的變量調(diào)用方法,用!define BROWSER {firefox}來(lái)定義即可,熟悉英文的話,這句話就變的很容易理解。瀏覽器只要按selnium的webdriver設(shè)置,可以用iexplore,chrome,opera,opera-mobile-phone等。
在源碼中,相對(duì)應(yīng)的方法參數(shù)如下:

通常來(lái)說(shuō),這個(gè)命令直接放入script在測(cè)試用例的SetUp或者測(cè)試集的SuiteSetUp內(nèi)寫入,啟動(dòng)待測(cè)試頁(yè),等待之后的用例執(zhí)行。
2.?| stop browser |?
相對(duì)于啟動(dòng)瀏覽器,關(guān)閉瀏覽器就方便多了,一般就把行直接放在測(cè)試用例的TearDown或者測(cè)試集的SuiteTearDown內(nèi)寫入。
3.?| do | open | on | / |? 或者??| ensure | do | click | on | id=kw |
其實(shí)兩者都是用于執(zhí)行某個(gè)selenium命令操作,區(qū)別在于do開(kāi)頭的不做任何檢驗(yàn),只是要求Xebium去執(zhí)行命令,ensure開(kāi)頭表示做這件事后判斷是否執(zhí)行完成,ensure根據(jù)返回值是否符合給定的值來(lái)判斷是否正確,這里最后一個(gè)單元格校驗(yàn)數(shù)據(jù)不給的情況下,執(zhí)行成功就是pass。
那么可執(zhí)行的selenium命令有哪些呢?
"addSelection"
"altKeyDown"
"altKeyUp"
"assignId"
"attachFile"
"click"
"check"
"chooseCancelOnNextConfirmation"
"chooseOkOnNextConfirmation"
"close"
"createCookie"
"controlKeyDown"
"controlKeyUp"
"deleteAllVisibleCookies"
"deleteCookie"
"doubleClick"
"dragdrop"
"dragAndDrop"
"dragAndDropToObject"
"fireEvent"
"focus"
"goBack"
"highlight"
"keyDown"
"keyPress"
"keyUp"
"metaKeyDown"
"metaKeyUp"
"mouseOver"
"mouseOut"
"mouseDown"
"mouseDownAt"
"mouseMove"
"mouseMoveAt"
"mouseUp"
"mouseUpAt"
"open"
"openWindow"
"refresh"
"removeAllSelections"
"removeSelection"
"runScript"
"select"
"selectFrame"
"selectWindow"
"shiftKeyDown"
"shiftKeyUp"
"submit"
"type"
"typeKeys"
"uncheck"
"waitForFrameToLoad"
"waitForPageToLoad"
"waitForPopUp"
"windowFocus"
"windowMaximize"
.......................?
還有很多命令不一一列舉了,可以說(shuō)囊括了所有網(wǎng)頁(yè)上支持的操作命令(可以查看源碼:ExtendedSeleniumCommand.java)。
4.?| check | is | assertTitle | test_百度搜索 |
check檢查返回值是否是true或者false,如果是true則pass;reject則相反,返回false為pass,selenium的assert基本用check/reject來(lái)判斷檢查結(jié)果。
測(cè)試腳本如下:

點(diǎn)Test后可以運(yùn)行,運(yùn)行結(jié)果如下:

自己總結(jié)的一些測(cè)試經(jīng)驗(yàn)和思想:
1. 是否這樣寫太累了,有沒(méi)有更簡(jiǎn)便的工具呢?答案是有的,很多人在寫前都會(huì)用firefox的selenium ide來(lái)錄制回放,其實(shí)只要安裝Selenium Xebium Formatter的firefox插件就可以把錄制回放結(jié)果直接轉(zhuǎn)換成Xebium格式,這樣寫起來(lái)就更得心應(yīng)手了。
2. selenium測(cè)試回放時(shí)會(huì)出現(xiàn)很多控件未找到的錯(cuò)誤,如何解決呢?首先,我們把執(zhí)行步驟的間隔時(shí)間調(diào)大,還記得之前一章提到的
|set step delay to|slow |?
這個(gè)命令,主要就是把間隔時(shí)間調(diào)大,當(dāng)頁(yè)面全部加載完再去操作可以避免很多問(wèn)題。另外,如果能和開(kāi)發(fā)溝通,盡量有唯一不變的id或固定的xpath和properties來(lái)標(biāo)識(shí)控件,這樣也可以避免在不斷迭代期間,控件位置的變化而導(dǎo)致無(wú)法識(shí)別,減少腳本修改的花費(fèi)。
3. 減少自動(dòng)化測(cè)試消耗的另一個(gè)原則是,盡量保持scenario的短小精悍,不要面面俱到的測(cè)試,不要把所有測(cè)試用例都自動(dòng)化,不要在web設(shè)計(jì)都沒(méi)有定的情況下開(kāi)始自動(dòng)化,不要在沒(méi)有任何數(shù)據(jù)準(zhǔn)備的情況下開(kāi)發(fā)大量腳本,在開(kāi)發(fā)期也盡量少用當(dāng)某個(gè)控件waitForElementPresent來(lái)判斷(很多時(shí)候,控件定位就發(fā)生了變化,這個(gè)判斷會(huì)失效)。一個(gè)web自動(dòng)化測(cè)試用例,用于regression測(cè)試,一般保證頁(yè)面導(dǎo)航、搜索、或者主流程能正常走通即可,花最少的人力物力情況下把產(chǎn)出最大化。
Web自動(dòng)化測(cè)試介紹到這,大家心里應(yīng)該有底了,那么如何再進(jìn)一步開(kāi)發(fā)自己的測(cè)試套件來(lái)擴(kuò)展Xebium用途呢?我們?cè)谙乱徽玛U述。