本文章轉(zhuǎn)載于搜狗測試
在iOS自動化測試中UI Automation的對象继榆,都是以UIAxxx的形式出現(xiàn)的,例如UIAButton等纲岭。UIA是UI Automation的縮寫猜扮,如果忽略掉前綴,直接看對象的名稱糟需,在表達(dá)方面應(yīng)該會明確。接下來對UI Automation所提供的API進(jìn)行初步了解吧谷朝。
UIALogger日志輸出
負(fù)責(zé)日志輸出的對象是UIALogger洲押,主要有兩部分的職責(zé):記錄測試結(jié)果;負(fù)責(zé)各個級別的日志結(jié)果輸出圆凰。
在記錄測試結(jié)果方面杈帐,有l(wèi)ogFail()、logPass()方法和logStart()方法专钉。logStart()方法會在測試即將開始的時候調(diào)用娘荡,并且在測試結(jié)束后,和logFail()或logPass()方法配對出現(xiàn)完成一個測試方法的開始部分和最后的完成部分的結(jié)果記錄驶沼,logPass()和logFail()是一對函數(shù),分別表示方法測試通過和未通過争群。
在日志輸出方面回怜,一般常用的事logMessage()方法,日志輸出是我們調(diào)試UI Automation腳本唯一的手段换薄,在編寫自動化測試腳本的時候玉雾,一定要掌握logMessage()方法。需要注意的是logMessage()只接受字符串類型的參數(shù)轻要。例如:UIALogger.logMessage(“JUST TEST”)就是一個有效地輸出复旬,但是如果這樣的:UIALogger.logMessage(123);就不會有任何輸出,這里需要強(qiáng)制的是把數(shù)字類型轉(zhuǎn)化為字符串類型就可以有內(nèi)容輸出了冲泥。
手勢動作的模擬
UI Automation的API給用戶提供了很多手勢操作的模擬方式驹碍,現(xiàn)在介紹幾種常用的手勢動作模擬方式,為大家提供一個思路凡恍。如果希望更加全面的學(xué)習(xí)志秃,建議參考Apple官方文檔。
模擬操作動作的方法主要由兩個主類提供嚼酝,在API調(diào)用方式上也有一些其別浮还,所以這里再次細(xì)分了兩種方式,分別為UIAElement方式和UIATarget方式闽巩。
1. UIAElement方式
(1)點擊
tap()方法钧舌,一個button或者一個表單的某一行(UIATableViewCell)都可以使用tap方法操作担汤。但如果是一個閱讀器的話,本身被操作的控件區(qū)域很大洼冻,在控件內(nèi)部還會細(xì)分操作區(qū)域崭歧。不同區(qū)域的相同操作可能效果不同。在這樣的測試需求前面碘赖,只使用tap()方法明顯是不能滿足需求的驾荣。這時需要使用更高級的操作方式tapWithOptions(option)。例如普泡,UIAElement.tap
WithOptions({x:0.9,y:0.5})播掷。
如果題詞點擊不能滿足需求,還可以使用doubleTap()方法來模擬雙擊的操作撼班。如果單指的點擊不能滿足需求歧匈,可以使用twoFinger
Tap()來模擬雙指的點擊操作。
(2)滑動或拖拽
滑動和拖拽在UI Automation中區(qū)別不大砰嘁,唯一區(qū)別在于操作時的延時時間不同〖現(xiàn)在可以從接口層面來查看滑動操作和拖拽操作的區(qū)別。
滑動實例:
UIAElement.flickInSideWithOption({touchCount:2,startOffset:{x:0.5,y:0.9}, endOffset:{x:1.0, y:0.9}});
拖拽實例:
UIAElement.dragInsideWithOptions({touchCount:2,startOffset:{x:0.5,y:0.9}, endOffset:{x:1.0, y:0.9}, duration:1});
從上面兩個實例中可以看出矮湘,拖拽比滑動函數(shù)多了一個duration參數(shù)斟冕,這個duration表示操作時手指和屏幕的接觸時間,duration參數(shù)一般只接收值為0或1的傳入(你可能還會看到有些文檔里賣弄傳入2或者3缅阳,但官方文檔中未對這些參數(shù)進(jìn)行詳細(xì)說明磕蛇,而且從實際操作的角度來看好像也沒有看出具體的差別),0代表flick方式接觸時間十办,1代表drag和pinch等操作的將誒出時間秀撇。還需要特別說明,duration參數(shù)有一個默認(rèn)值并且為0.也就是說dragInsideWithOptions方法如果沒有顯示傳入duration的值向族,dragInsideWithOptions和flickInsideWithOptions是等價的呵燕。這兩個方法都有一個參數(shù)為touchCount,這個參數(shù)表示滑動或拖拽操作的手指個數(shù)件相,默認(rèn)為1再扭。單指滑動或拖拽就可以不用設(shè)置這個參數(shù)了。
2. UIATarget方式
(1)點擊
在點擊方面夜矗,UIATarget和UIAElement的方式一樣提供了兩種方法供開發(fā)者使用霍衫,即tap()和tapWithOptions()方法。唯一不同的是傳入的參數(shù)侯养。Target的實例:
UIATarget.localTarget.tap({x:300,y:200});
UIATarget.localTarget.tapWithOptions({x:300,y:200}, {tapCount:1,touchCount:2,duration:1});
在tap方法里面需要傳入點擊的具體坐標(biāo)敦跌,因為Target是一個全局對象,操作區(qū)域非常大,需要明確指定點擊的區(qū)域柠傍。在tapWithOptions方法中麸俘,還需要傳入點擊的次數(shù)(tapCount,默認(rèn)值為1)惧笛,點擊時手指的個數(shù)(touchCount从媚,默認(rèn)值為1),點擊時手指接觸時間(duration患整,默認(rèn)值為0)拜效。
同樣,UIATarget方式也有doubleTap方法和twoFingerTap方法各谚。
(2) 滑動和拖拽
在UIATarget方式中紧憾,滑動的方法為:flickFromTo;拖拽的方法為:fragFromToForDuration昌渤。雖然方法名字有所變化赴穗,但是用法和UIAElement方式完全相同,我們直接給出實際的例子:
UIATarget.localTarget().flickFromTo({x:160,y:200},{x:160,y:400})
UIATarget.localTarget().dragFromToDuration({x:160,y:200},{x:160,y:200}, 1);
在Target方式中膀息,還有一種操作般眉,非常類似于滑動和拖拽,在官方文檔中稱為pinch(一般可以翻譯為捏合或縮放潜支,但都不是很準(zhǔn)確)甸赃,一般pinch最常用的操作是,在瀏覽照片時可以通過pinch對照片進(jìn)行縮放冗酿。pinch根據(jù)移動的方式不同而被劃分為兩種:pinchOpen和pinchClose埠对。實例如下:
UIATarget.localTarget().pinchOpenFromToForDuration({x:20,y:200}, {x:300,y:200}, 1);
UIATarget.localTarget().pinchCloseFromToForDuration({x:20,y:200}, {x:300,y:200}, 1);
延時處理
在延時處理方面,有delay()方法已烤,在腳本中使用起來非常簡單、方便妓羊。在延時處理時胯究,還有更加高級的方法需要介紹一下。
在遍歷控件樹時躁绸,一般會采用這樣的方式遍歷控件樹:
var elementArray = UIAElement.elements();
正常情況下裕循,這段代碼很快就會返回一個UIAElementArray對象,并傳遞給變量净刮,但是當(dāng)這個UIAElement沒有子元素時剥哑,這個語句就會執(zhí)行的非常慢,因為沒有子元素了淹父,UI Automation是通過超時機(jī)制來處理這個異常的株婴。在沒有任何設(shè)置的情況下,UI Automation默認(rèn)的超時時間為5秒。頻繁地遇到這種情況會使測試腳本的執(zhí)行速度拖延困介,過慢的測試腳本運(yùn)行會大幅度降低測試腳本的可用性大审。這時需要把超時時間設(shè)置的短一些。例如:
UIATarget.localTarget().setTimeout(1);
這樣就把超時時間設(shè)置為1秒座哩,從而提升了腳本的執(zhí)行速度徒扶。但是使用setTimeout方法會有一個隱患,因為這種方式的設(shè)置是全局的一種方式根穷,UIATarget.localTarget().setTimeout(1)會使得這個測試運(yùn)行過程中超時時間都被強(qiáng)制改為1秒姜骡,或許在有些函數(shù)方法內(nèi)部還需要超時時間為5秒。所以需要有一種更加優(yōu)雅的方式來解決這個問題屿良。UI Automation提供了這樣的方式圈澈,實例代碼如下:
UIATarget.localTarget().pushTimeout(1);
var elementArray = UIAElement.elements();
UIATarget.localTarget().popTimeout(1);
pushTimeout和popTimeout成對出現(xiàn),在這兩個方法中間的代碼會被修改超時時間管引,不在這對語句中間出現(xiàn)的代碼士败,不會受到任何影響。