因為各種各樣的原因,回放指令碼的時候不會那麼順利,測試環境可能慢一些,被指令碼一催趕,立刻變得結結巴巴的,或者本來很伶俐的程式,突然一下就腦子短路,半天沒動靜了。反正一句話,常在河邊走,偶爾總會踩狗屎的。所以對象的等待問題很難繞過去。
首先說等待,等待誰?仔細琢磨下,應該是等待下一個動作的相應對象,比如你完成上一個步驟後,要在下一個表單的某個按鈕上點擊一下,這個表單老半天不出來,表面是表單不出來,表單真出來了,你就敢說那個按鈕一定能點得上?所以別傻傻的去等表單,得找正主,具體的那個按鈕。找到了正主,你就可以隨便選擇方法了。
可以玩狠的,直接死迴圈,你不出來我就死給你看:
while (not obj1.obj1.obj1.obj1.exists)
BuiltIn.delay 3000,"等待obj1。。。"
Wend
探討一下,這裡exists有沒有問題,如果這個對象已經在記憶體了,但是介面上沒有顯示出來,這句話就會有問題,會不會改成visible更好,那如果在記憶體了,又沒顯示出來,就白等了。那你寫日誌說對象在記憶體了,但是沒顯示出來就好啦。
還有種情況,會不會對象出來了,exists和visible都是true了,但是螢幕是刷白的狀態,你做點擊動作可能還是不行,會不會那麼邪呼的,真的,會有這種更變態的情況的。那咋辦,抓圖片比對吧,這個法子肯定沒問題了,都能看到了,還不能操作呀。
while (not Regions.Compare("obj1bmp", obj1.obj1.obj1.obj1. obj1bmp, False, False, True, 0))
BuiltIn.delay 3000,"等待obj1bmp。。。"
Wend
這個怎麼做的?錄製的時候選擇了圖片的checkpoint,然後就貼出代碼來。
這個做法比較山寨,一旦表單出不來,整個代碼就不用跑了。
什嗎?山寨?還有更山寨的!啥代碼都不用寫,直接設定一下:
菜單:Tools—Default project – properties
左面樹狀目錄:playback
右面第一排右邊的那項:Auto-wait timeout,ms: 10000
哦,原來是預設等待10秒。
懂了塞,直接搞個倆小時,我就不信你不出來了,如果不出來就是死了,你都死了,那我也不用動了。
你們這些做法都太山寨太江湖氣了。看看標準的做法,TestComplete提供了一系列的Wait函數。
舉個例子:
TestObj.WaitVBObject(Name, Timeout)
TestObj A variable, parameter or expression that specifies a reference to one of the objects listed in the Applies To section
Name [in] Required String
Timeout [in] Required Integer
Result Object
解釋:
是誰要等誰,通常來說都是父物件等待子物件,TestObj就是父物件,name就是子物件名字,timeout自然是要等多久,過時就代碼決定該何去何從了。Result就返回子物件的引用。
看出來了吧,名門正派就是講究的更清晰準確,誰等誰,等多久,用什麼Wait函數來等,沒等到可以代碼細節處理。
總結:
不同的情況採取不同方式,如果你只需要完成一個簡單的系統自動化,並不需要做很多控制,要求維護成本最低,那就直接配置個倆小時得了,如果你的系統需要精細化控制,就用wait函數來精確控制。至於死迴圈的那倆法子,你不想改變更配置置,又不想搞清楚是什麼wait函數來等,就直接山寨了吧。
夠用就好。大家自己選擇吧。