背景:
在Katalon中,我們通過Spy抓取的控件,保存在Object Repository中,其中的定位的屬性是固定的
如果把這些固定的定位屬性參數化呢,一種方式是直接通過Xpath路徑,創建Test Object,另外一種
方法是把,獲取到的控件定位屬性參數化
如何進行參數化呢?
定位屬性參數化:
所謂控件定位屬性參數化,就是當這個控件運行的時候,動態給定位屬性參數具體的值,如text
用一個實際的例子來看
假設APP啟動的時候有一個引導界面,其中需要我們從六個興趣標簽中點擊選擇
通過Spy Mobile,我們可以看到這幾個興趣標簽,但無法通過resource-id來區分,因為resource-id都一樣
但Text是不一樣的,那么我們就是需要把這個Text進行參數化,在運行的時候,給不同的Text值,從而選擇
不同的控件
捕獲到的控件如下,其中一共有六個控件,其中resource-id其實都是一樣的
如果我們要把其中的text修改為動態的屬性
此時我們需要把text的vlaue修改為 ${textname}
此時表示這個屬性為動態的
並且關聯的動態變量的名字為testname

在testcase中的命令中選擇使用這個控件,此時打開Test Object Input
在這個Test Object選擇中,下面有一個“Variables"
在這個Variables中可以創建一個變量,同時指定變量的值
指定的變量名,需要和Object Repository中,控件屬性中指定的變量名要一致,即設置為"testname"
此時切換到Scripts中,可以看到詳細的命令
Mobile.tap(findTestObject('tag_label', [('textname') : '軍事知識']), 0)
當然這個動態的變量,可以支持文本,數字,或者Katalon中的變量,全局變量等
如可以在Variables中,添加了一個變量,如叫label
此時,命令就變成了
Mobile.tap(findTestObject('tag_label', [('textname') : label]), 0)
通過這種方式,我們可以在運行的時候,參數化控件的定位屬性
那么,在一開始六個相似的Text控件,我們可以在Object Repository,只保留一個
而不需要創建六個相似的控件,但只是Text屬性不同
如果依次點擊,可以通過傳遞不同的Text的值來分別動態定位
在腳本中,可能就是這樣的
Mobile.tap(findTestObject('tag_label', [('textname') : '軍事知識']), 0)
Mobile.tap(findTestObject('tag_label', [('textname') : '史前巨獸']), 0)
Mobile.tap(findTestObject('tag_label', [('textname') : '動物天地']), 0)
Mobile.tap(findTestObject('tag_label', [('textname') : '恐龍世界']), 0)
如果有多個動態的屬性,其實是一樣的
如添加resource-id也同樣變成了動態的屬性
那么命令如下:
Mobile.tap(findTestObject('tag_label', [('textname') : '軍事知識', ('resouceid') : 'com.mxr.dreambook:id/tv_tag']), 0)
這部分的內容,Katalon的幫助中有說明
可以參考
定位序列:
現在還是思考這個六個相似的TextView,已經實現通過Text屬性來動態定位,但如果要循環點擊這六個標簽
我們必須先創建一個數值,類似['軍事知識','恐龍世界','動物世界'],然后通過循環來遍歷
但如果Text的內容修改了,則會失效,並且通過文本數組來遍歷有些笨重
我們想是否可以通過序列來遍歷呢?
一開始觀察的時候,想到是否可以通過instance的屬性
因為這六個不同的TextView,其中的instance的屬性分別是3,4,5,6,...
實際嘗試后發現通過instance無法定位,因為instance屬性是無法生效的,
我們在xpath中,如果定位到多個,是可以通過[i]來區分
此時可以在Object Repository中,修改那個控件的定位方式為xpath
Xpath屬性為
(//*[@class = 'android.widget.TextView' and @resource-id = 'com.mxr.dreambook:id/tv_tag'])[${index}]
其中,我們把這個index作為一個動態的參數,類似之前的方法
在腳本中,我們就可以通過1到6的循環來循環點擊這個標簽
//選擇六個興趣標簽
for (def i : (1..6)) {
Mobile.tap(findTestObject('4Dapp/flashpage/tagselect/tag_Text', [('index') : i]), 5)
}
這樣就實現了動態的循環
這部分的實現,可以參考Katalon的說明
參考項目
Katalon官方參考項目
