緣由
最近工作中,有大量web頁面上的重復操作,實在麻煩,就想利用selenium ide錄制出一些操作集合,以便復用。新版本的selenium ide 3目前只支持firefox最新的版本,而且代碼導出功能還不完備,就想試試舊版本2.7。為了能使用2.7版本,還安裝了舊版本的火狐瀏覽器。弄好后,發現不太好用,錄制起來很不順手。於是就想找找替代方案。搜到了兩個結果,一是kantu,另外一個是katalon recorder。我覺得katalon recorder很順手,也的確為我省了不少事,作一下簡單記錄。
簡介
katalon recorder是基於selenium的瀏覽器插件,支持火狐和chrome。它可以錄制web頁面的操作,並且能實現基本的數據驅動測試,還能導入腳本,可說是體量雖小,功能足夠。對功能有更高要求的,還可以去試試同出一門的katalon studio,也是免費軟件,支持web和mobile端的測試,並集成了許多強大的功能。
安裝后界面如下:

創建test suite后,里面可以包含多個測試用例(test case),每個測試用例又有若干步驟(command)。點擊record,可以快速對當前的活動頁面進行錄制,點擊pllay則是回放。web自動化測試費時費力的一部分就是元素定位,錄制正是解決這一問題的利器。錄制完成后,點擊右上角的export,還可以導出不同語言的代碼,方便進行下一步的開發。
每個測試步驟分為三部分,分別是coommand,target和value。錄制后,可以自己看看命令是什么樣子的,也可以選擇元素的定位方式,避免默認的定位方式無法在其它頁面復用(比如換了登錄用戶,通過登錄用戶名文本來定位顯然就無法復用了)。
官方有提供sample suite,包含了recorder的各個功能,可以下載導入后查看。
工作中遇到的問題
1.頁面上有一些input輸入框,在自己測試時通常是輸入固定的值,於是就想能不能錄制下來,省些力氣。

首先用了錄制功能,但發現一直無效。查看步驟,發現是定位到input后,以type方法鍵入值。
如圖:

於是我想到能不能模擬自己實際操作的步驟,來鍵入值呢?也就是使用sendKeys方法,鍵入想用的值后,按下Enter鍵,再點擊頁面空白處。
這樣做,的確是值能輸進去,但是再操作時,值又會自動消失。查了一圈后,覺得應該是輸入框要有input或者change事件發生時,才會更改綁定的值。
Katalon Recorder支持js腳本,也試試這個吧。(jquery有段時間沒用,又稍稍回憶了下,完全忘了對jquery對象取第0個元素就是原生DOM對象,卡了一小會兒)
代碼如下:
$('#product_list_table2 > tbody').find('td:nth-child(2) > input').each(
function(){
$(this)[0].value = '100';
})
由於要輸入的值在表格中,只要遍歷表格的子元素,找到輸入框,改變其值即可。
成了嗎?是寫進去了,但一樣去操作其他地方值又會變為原來的值。
又查了一番,應該再改變值后把input或change事件觸發才行,代碼如下:
$('#product_list_table2 > tbody').find('td:nth-child(2) > input').each(
function(){
$(this)[0].value = '100';
this.dispatchEvent(new Event('change'));
})
// 不知道為什么,這里觸發input事件沒用,必須要觸發change事件才行。而另外一些input卻得綁定input事件,有些不解
再進一步,可以把要輸入的值參數化,在腳本中以${param}引入即可。如圖:

以后再需要對input輸入值的地方,都可以用類似的方法處理。
2.又用了一段時間,發現還是有場景可以實現自動化。比方說,有一個訂單,需要四層審批,每級審批的人都不一樣,但通過管理員查看流程,都可以切換到相應的角色。
於是就把流程錄制了下,拿另外一個訂單試驗了下,果然沒那么容易就可以。主要有幾個小問題:
1)找訂單時,是根據位置定位的,一直點擊的是列表中的第一個。對於新訂單倒還好,但是如果要審批舊單子,這個方法就行不通了
2)有些點擊動作太快。頁面元素並不是一下全都加載好的,單純以元素出現判斷是否點擊,並不可靠。
3)若以審批人分類,每個審批人都要單獨錄一遍流程,太過麻煩
4)頁面上根據訂單金額不同,會出現不同的彈框。不點擊的話,就無法繼續。
為了讓錄制的腳本更加靈活,我做了以下調整:
1)參數化。將訂單號存儲起來,每次不再是點擊訂單列表的第一個,而是先進行搜索,出現結果時,再點擊第一個,這樣就可以保證進入想要審批的訂單。
另外也將審批人參數化,這樣就避免重復錄制,更靈活也更省事。
可使用store方法,target是要存儲的值,value是參數名。之后要應用,可以${param}的形式引用。

2)增加暫停。在一些數據交互多的頁面中增加暫停時間,比如加載訂單、搜索這些場景都應當添加,讓腳本更穩定。時長從500毫秒到1500毫秒不等。
可使用pause方法,target為要暫停的時間,單位是毫秒。

3)增加元素是否存在的判斷。對於不是任何時候都出現的彈框,可先判斷其是否存在,是則點擊,否則跳過,讓腳本更靈活。
Katalon Recorder中並不能簡單使用if判斷,因為if只能更布爾表達式。這也是簡易工具的限制,但也是其它方式實現。
我用的方法是先用storeElementPresent方法,判斷元素是否存在,存入變量中,再放到if的布爾表達式中,中間放入要執行的語句。

至此腳本就修改完成了,使用起來也很穩定,填入參數后,不再需要人工干預。
到這一步,再往下走,可以將幾個審批人的流程合並到test suite,這樣一次點擊,所有審批流程都可以完成。
小問題
每個測試用例都有隱含的第一步,就是跳轉到katalon的主頁,導出代碼后,就會里面設置的base url是katalon主頁。每次執行都會先跳轉到這個頁面,然后才會往下走,會耽擱一小會兒。目前還沒有找到設置base url的地方,解決方法是加載主頁幾秒后,停止加載,就會跳轉到自己設定的頁面。
參考
katalon主頁:https://www.katalon.com/
katalon文檔:https://docs.katalon.com/katalon-studio/docs/index.html
sample suite下載頁面: https://github.com/katalon-studio/katalon-recorder-samples
