在iOS自動化測試中UI Automation的對象,都是以UIAxxx的形式出現的,例如UIAButton等。UIA是UI Automation的縮寫,若是忽略掉前綴,直接看對象的名稱,在表達方面應該會明確。接下來對UI Automation所提供的API進行初步瞭解吧。微信
UIALogger日誌輸出ide
負責日誌輸出的對象是UIALogger,主要有兩部分的職責:記錄測試結果;負責各個級別的日誌結果輸出。函數
在記錄測試結果方面,有logFail()、logPass()方法和logStart()方法。logStart()方法會在測試即將開始的時候調用,而且在測試結束後,和logFail()或logPass()方法配對出現完成一個測試方法的開始部分和最後的完成部分的結果記錄,logPass()和logFail()是一對函數,分別表示方法測試經過和未經過。學習
在日誌輸出方面,通常經常使用的事logMessage()方法,日誌輸出是咱們調試UI Automation腳本惟一的手段,在編寫自動化測試腳本的時候,必定要掌握logMessage()方法。須要注意的是logMessage()只接受字符串類型的參數。例如:UIALogger.logMessage(「JUST TEST」)就是一個有效地輸出,可是若是這樣的:UIALogger.logMessage(123);就不會有任何輸出,這裏須要強制的是把數字類型轉化爲字符串類型就能夠有內容輸出了。測試
手勢動做的模擬spa
UI Automation的API給用戶提供了不少手勢操做的模擬方式,如今介紹幾種經常使用的手勢動做模擬方式,爲你們提供一個思路。若是但願更加全面的學習,建議參考Apple官方文檔。.net
模擬操做動做的方法主要由兩個主類提供,在API調用方式上也有一些其別,因此這裏再次細分了兩種方式,分別爲UIAElement方式和UIATarget方式。翻譯
1. UIAElement方式調試
(1)點擊日誌
tap()方法,一個button或者一個表單的某一行(UIATableViewCell)均可以使用tap方法操做。但若是是一個閱讀器的話,自己被操做的控件區域很大,在控件內部還會細分操做區域。不一樣區域的相同操做可能效果不一樣。在這樣的測試需求前面,只使用tap()方法明顯是不能知足需求的。這時須要使用更高級的操做方式tapWithOptions(option)。例如,UIAElement.tap
WithOptions({x:0.9,y:0.5})。
若是題詞點擊不能知足需求,還可使用doubleTap()方法來模擬雙擊的操做。若是單指的點擊不能知足需求,可使用twoFinger
Tap()來模擬雙指的點擊操做。
(2)滑動或拖拽
滑動和拖拽在UI Automation中區別不大,惟一區別在於操做時的延時時間不一樣。如今能夠從接口層面來查看滑動操做和拖拽操做的區別。
滑動實例:
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});
從上面兩個實例中能夠看出,拖拽比滑動函數多了一個duration參數,這個duration表示操做時手指和屏幕的接觸時間,duration參數通常只接收值爲0或1的傳入(你可能還會看到有些文檔裏賣弄傳入2或者3,但官方文檔中未對這些參數進行詳細說明,並且從實際操做的角度來看好像也沒有看出具體的差異),0表明flick方式接觸時間,1表明drag和pinch等操做的將誒出時間。還須要特別說明,duration參數有一個默認值而且爲0.也就是說dragInsideWithOptions方法若是沒有顯示傳入duration的值,dragInsideWithOptions和flickInsideWithOptions是等價的。這兩個方法都有一個參數爲touchCount,這個參數表示滑動或拖拽操做的手指個數,默認爲1。單指滑動或拖拽就能夠不用設置這個參數了。
2. UIATarget方式
(1)點擊
在點擊方面,UIATarget和UIAElement的方式同樣提供了兩種方法供開發者使用,即tap()和tapWithOptions()方法。惟一不一樣的是傳入的參數。Target的實例:
UIATarget.localTarget.tap({x:300,y:200});
UIATarget.localTarget.tapWithOptions({x:300,y:200}, {tapCount:1,touchCount:2,duration:1});
在tap方法裏面須要傳入點擊的具體座標,由於Target是一個全局對象,操做區域很是大,須要明確指定點擊的區域。在tapWithOptions方法中,還須要傳入點擊的次數(tapCount,默認值爲1),點擊時手指的個數(touchCount,默認值爲1),點擊時手指接觸時間(duration,默認值爲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(通常能夠翻譯爲捏合或縮放,但都不是很準確),通常pinch最經常使用的操做是,在瀏覽照片時能夠經過pinch對照片進行縮放。pinch根據移動的方式不一樣而被劃分爲兩種: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對象,並傳遞給變量,可是當這個UIAElement沒有子元素時,這個語句就會執行的很是慢,由於沒有子元素了,UI Automation是經過超時機制來處理這個異常的。在沒有任何設置的狀況下,UI Automation默認的超時時間爲5秒。頻繁地遇到這種狀況會使測試腳本的執行速度拖延,過慢的測試腳本運行會大幅度下降測試腳本的可用性。這時須要把超時時間設置的短一些。例如:
UIATarget.localTarget().setTimeout(1);
這樣就把超時時間設置爲1秒,從而提高了腳本的執行速度。可是使用setTimeout方法會有一個隱患,由於這種方式的設置是全局的一種方式,UIATarget.localTarget().setTimeout(1)會使得這個測試運行過程當中超時時間都被強制改成1秒,或許在有些函數方法內部還須要超時時間爲5秒。因此須要有一種更加優雅的方式來解決這個問題。UI Automation提供了這樣的方式,實例代碼以下:
UIATarget.localTarget().pushTimeout(1);
var elementArray = UIAElement.elements();
UIATarget.localTarget().popTimeout(1);
pushTimeout和popTimeout成對出現,在這兩個方法中間的代碼會被修改超時時間,不在這對語句中間出現的代碼,不會受到任何影響。
今天要介紹的都已經介紹完了,若是對上次介紹UI Automation的文章感興趣的話,能夠點擊左下方「閱讀原文」來了解詳情。
若是你對iOS自動化測試感興趣,或者像瞭解更多,那就回復「189:你想說的話」,把你問題告訴咱們吧!
本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。