鉆研小白學(xué)習(xí)instrument之一周左右润梯,總結(jié)在網(wǎng)上找了一些零零散散和蘋(píng)果官網(wǎng)給出的官方文檔介紹,總結(jié)了一下自己的學(xué)習(xí)心得,分享一下吧。
UI Automation就是UI自動(dòng)化的意思跋炕,這個(gè)大家都應(yīng)該明白。既然是自動(dòng)化工具律适,那肯定需要有自動(dòng)化的腳本去支撐辐烂,而UI Automation它所支持的腳本語(yǔ)言除了自己原生的swift語(yǔ)言外,還支持JavaScript語(yǔ)言捂贿。
我說(shuō)一下本人第一次見(jiàn)到這個(gè)工具的情景吧纠修,自從xcode5版本開(kāi)始(具體是5點(diǎn)幾版本就不知道了),UI Automation就支持錄制用戶操作厂僧,自動(dòng)生成為腳本的功能扣草。當(dāng)初自己對(duì)app就進(jìn)行一些操作,發(fā)現(xiàn)它自動(dòng)就自動(dòng)生成了一段腳本颜屠,感覺(jué)好神奇啊辰妙,但當(dāng)自己想去解讀腳本語(yǔ)言,發(fā)現(xiàn)自己根本對(duì)此(八竅通七竅汽纤,一竅不通)上岗,為了讓自己看懂這些腳本的意思和加強(qiáng)一些操作福荸,就去學(xué)習(xí)JavaScript語(yǔ)言蕴坪。學(xué)了兩周左右時(shí)間后,基本的JavaScript語(yǔ)句會(huì)寫(xiě)了,也能大概根據(jù)代碼去了解其功能背传,然后又花了2天時(shí)間專(zhuān)門(mén)去了解UI Automation一些特定的操作呆瞻,就著手寫(xiě)上自己的第一個(gè)正式的UI Automation腳本。
//聲明變量,減少代碼量
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var main = app.mainWindow();
//登錄流程
app.tabBar().buttons()["我"].tap();
main.tableViews()[0].cells()[" "].tap();//點(diǎn)擊默認(rèn)頭像區(qū)域
//因?yàn)閍pp已經(jīng)記住了用戶名径玖,這段代碼屏蔽
//main.textFields()[0].textFields()[0].tap();
//var name = "skk"
//main.textFields()[0].textFields()[0].setValue(name);
main.secureTextFields()[0].secureTextFields()[0].tap();
//給密碼聲明變量痴脾,并賦予輸入框變量的值
var passwd = "123456";
main.secureTextFields()[0].secureTextFields()[0].setValue(passwd);
main.buttons()["登錄"].tap();
target.delay(1);//延遲1秒后操作
app.tabBar().buttons()["首頁(yè)"].tap();
target.delay(5);//延遲5秒后操作
//登錄完成
//退出登錄流程
app.tabBar().buttons()["我"].tap();
main.tableViews()[0].tapWithOptions({tapOffset:{x:0.60, y:0.85}});//點(diǎn)擊【設(shè)置】
main.buttons()["退出登錄"].tap();
app.actionSheet().collectionViews()[0].cells()["退出"].buttons()["退出"].tap();
app.tabBar().buttons()["首頁(yè)"].tap();
//退出登錄成功
UIALogger.logMessage("登錄腳本都運(yùn)行通過(guò)");
//腳本運(yùn)行完成,輸入該內(nèi)容
這個(gè)是我們公司一個(gè)產(chǎn)品的登錄流程梳星,寫(xiě)的比較簡(jiǎn)單赞赖,沒(méi)有特意去優(yōu)化它。
?就如同標(biāo)題一樣冤灾,我就是小白前域,要我這個(gè)小白去自己獨(dú)立去寫(xiě)出這段腳本,那是不可能的韵吨,腳本的所有的操作都是錄制得到的匿垄,我只是把錄制得到的腳本進(jìn)行一些優(yōu)化而已。
下面說(shuō)一些干貨吧归粉,先說(shuō)一下?UI Automation的結(jié)構(gòu)吧椿疗,拿一段腳本代碼來(lái)說(shuō)說(shuō)我的見(jiàn)解吧,官網(wǎng)給出控件樹(shù)圖沒(méi)有實(shí)時(shí)更新與實(shí)際操作上會(huì)有點(diǎn)差別糠悼,大家明白一個(gè)大概意思即可届榄。推薦一本書(shū)《ios測(cè)試指南》這個(gè)本的第56頁(yè)有對(duì)這個(gè)控件數(shù)的結(jié)構(gòu)有很詳細(xì)的解釋。
UI Automation所有的操作事件都必須以UIATargt開(kāi)頭绢掰,如圖所示UIATargt是整個(gè)控件樹(shù)的根節(jié)點(diǎn)???痒蓬;
UIATarget.localTarget().frontMostApp();應(yīng)用程序是最前面的應(yīng)用程序(或應(yīng)用程序的目標(biāo)),也就是指這個(gè)app滴劲。
UIATarget.localTarget().frontMostApp().mainWindow();到達(dá)你的應(yīng)用程序的主窗口中攻晒,也就是指這個(gè)被測(cè)app下面的主窗口。
列舉一些比較常用的操作代碼
要點(diǎn)擊兩次相同的位置班挖,你可以使用此代碼:
?示例鲁捏,點(diǎn)擊兩次100、200坐標(biāo)置
UIATarget.localTarget().doubleTap({X:100,Y:200});
測(cè)試點(diǎn)擊圖片放大和縮小功能
UIATarget.localTarget().twoFingerTap({X:100,Y:200});
放大和縮小手勢(shì)萧芙,你提供的坐標(biāo)的起始位置和結(jié)束位置给梅,以及持續(xù)時(shí)間,以秒為單位双揪。?
下面的示例指定位置动羽,從20、200的位置放大與縮小手勢(shì)渔期,經(jīng)過(guò)2秒:
UIATarget.localTarget().pinchOpenFromToForDuration({X:20,Y:200},{X:300,Y:200},2);?
UIATarget.localTarget().pinchCloseFromToForDuration({X:20,Y:200},{X:300,Y:200},2);
拖動(dòng)和輕彈运吓。如果你需要滾動(dòng)表或移動(dòng)元素在屏幕上渴邦,你可以使用dragFromToForDuration方法。你提供的坐標(biāo)的起始位置和結(jié)束位置拘哨,以及持續(xù)時(shí)間谋梭,以秒為單位。??
下面的示例指定位置倦青,從160瓮床、200的位置拖動(dòng)手勢(shì)到160、400的位置产镐,過(guò)了一段1秒:
UIATarget.localTarget().dragFromToForDuration({X:60,Y:200},{X:160,Y:400},1);
這個(gè)與拖動(dòng)手勢(shì)是相似的隘庄,但它被設(shè)定為一個(gè)快速動(dòng)作,因此它不要求一個(gè)持續(xù)時(shí)間參數(shù)癣亚。
UIATarget.localTarget().flickFromTo({X:160,Y:200},{X:160,Y:400});
輸入文字:您的腳本可能需要測(cè)試您的應(yīng)用程序正確地處理文本輸入峭沦。要做到這一點(diǎn),就可以通過(guò)簡(jiǎn)單地指定目標(biāo)文本字段并用其值設(shè)置輸入文本的文本字段的setValue方法逃糟。
下面的示例使用一個(gè)局部變量吼鱼,以提供一個(gè)長(zhǎng)字符串作為測(cè)試用例的第一個(gè)文本字段(索引[0])在當(dāng)前屏幕:var recipeName = " ";?
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0].setValue(recipeName);
操作延時(shí),單位為秒U(xiǎn)IATarget.localTarget().delay(2);
timeout:返回當(dāng)前的超時(shí)值绰咽,應(yīng)用如下
UIATarget.localTarget().timeout();
setTimeout:設(shè)置一個(gè)新的超時(shí)值菇肃,應(yīng)用如下
UIATarget.localTarget().setTimeout();
pushTimeout:保存在堆棧的當(dāng)前超時(shí)值,并設(shè)置一個(gè)新的超時(shí)值取募,應(yīng)用如下
UIATarget.localTarget().pushTimeout();
popTimeout:從堆棧檢索以前的超時(shí)值琐谤,恢復(fù)其作為當(dāng)前的超時(shí)值,并將其返回玩敏,應(yīng)用如下UIATarget.localTarget().popTimeout();
打印日志斗忌,與document.write()一樣,只是這個(gè)是打印在ui autoaction工具內(nèi)UIALogger.logMessage("需要打印出的信息");?//這個(gè)可以用來(lái)進(jìn)行判斷
模擬app返回桌面旺聚,并且從后臺(tái)再次進(jìn)入app织阳,其中的操作間隔以秒為單位?//下面示例返回桌面,并且10秒后進(jìn)入ios后臺(tái)砰粹,返回app內(nèi)?
UIATarget.localTarget().deactivateAppForDuration(10);
?
這有個(gè)簡(jiǎn)單的示例唧躲,感興趣的去去看看:
http://www.minroad.com/?p=799