小白学习instrument之UI Automation(1)

钻研小白学习instrument之一周左右,总结在网上找了一些零零散散和苹果官网给出的官方文档介绍,总结了一下自己的学习心得,分享一下吧。

UI Automation就是UI自动化的意思,这个大家都应该明白。既然是自动化工具,那肯定需要有自动化的脚本去支撑,而UI Automation它所支持的脚本语言除了自己原生的swift语言外,还支持JavaScript语言。

我说一下本人第一次见到这个工具的情景吧,自从xcode5版本开始(具体是5点几版本就不知道了),UI Automation就支持录制用户操作,自动生成为脚本的功能。当初自己对app就进行一些操作,发现它自动就自动生成了一段脚本,感觉好神奇啊,但当自己想去解读脚本语言,发现自己根本对此(八窍通七窍,一窍不通),为了让自己看懂这些脚本的意思和加强一些操作,就去学习JavaScript语言。学了两周左右时间后,基本的JavaScript语句会写了,也能大概根据代码去了解其功能,然后又花了2天时间专门去了解UI Automation一些特定的操作,就着手写上自己的第一个正式的UI Automation脚本。

//声明变量,减少代码量
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var main = app.mainWindow();

//登录流程
app.tabBar().buttons()["我"].tap();
main.tableViews()[0].cells()[" "].tap();//点击默认头像区域


//因为app已经记住了用户名,这段代码屏蔽
//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()["首页"].tap();
target.delay(5);//延迟5秒后操作
//登录完成

//退出登录流程
app.tabBar().buttons()["我"].tap();
main.tableViews()[0].tapWithOptions({tapOffset:{x:0.60, y:0.85}});//点击【设置】
main.buttons()["退出登录"].tap();
app.actionSheet().collectionViews()[0].cells()["退出"].buttons()["退出"].tap();
app.tabBar().buttons()["首页"].tap();
//退出登录成功
UIALogger.logMessage("登录脚本都运行通过");
//脚本运行完成,输入该内容

这个是我们公司一个产品的登录流程,写的比较简单,没有特意去优化它。

​就如同标题一样,我就是小白,要我这个小白去自己独立去写出这段脚本,那是不可能的,脚本的所有的操作都是录制得到的,我只是把录制得到的脚本进行一些优化而已。

下面说一些干货吧,先说一下​UI Automation的结构吧,拿一段脚本代码来说说我的见解吧,官网给出控件树图没有实时更新与实际操作上会有点差别,大家明白一个大概意思即可。推荐一本书《ios测试指南》这个本的第56页有对这个控件数的结构有很详细的解释。

UI Automation所有的操作事件都必须以UIATargt开头,如图所示UIATargt是整个控件树的根节点​​​;
UIATarget.localTarget().frontMostApp();应用程序是最前面的应用程序(或应用程序的目标),也就是指这个app。
UIATarget.localTarget().frontMostApp().mainWindow();到达你的应用程序的主窗口中,也就是指这个被测app下面的主窗口。

[ ](javascript:;)苹果官方给出的控件树图

列举一些比较常用的操作代码
要点击两次相同的位置,你可以使用此代码:
​示例,点击两次100、200坐标置
UIATarget.localTarget().doubleTap({X:100,Y:200});

测试点击图片放大和缩小功能
UIATarget.localTarget().twoFingerTap({X:100,Y:200});

放大和缩小手势,你提供的坐标的起始位置和结束位置,以及持续时间,以秒为单位。​
下面的示例指定位置,从20、200的位置放大与缩小手势,经过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);

拖动和轻弹。如果你需要滚动表或移动元素在屏幕上,你可以使用dragFromToForDuration方法。你提供的坐标的起始位置和结束位置,以及持续时间,以秒为单位。​​

下面的示例指定位置,从160、200的位置拖动手势到160、400的位置,过了一段1秒:
UIATarget.localTarget().dragFromToForDuration({X:60,Y:200},{X:160,Y:400},1);

这个与拖动手势是相似的,但它被设定为一个快速动作,因此它不要求一个持续时间参数。
UIATarget.localTarget().flickFromTo({X:160,Y:200},{X:160,Y:400});

输入文字:您的脚本可能需要测试您的应用程序正确地处理文本输入。要做到这一点,就可以通过简单地指定目标文本字段并用其值设置输入文本的文本字段的setValue方法。
下面的示例使用一个局部变量,以提供一个长字符串作为测试用例的第一个文本字段(索引[0])在当前屏幕:var recipeName = " ";​
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0].setValue(recipeName);

操作延时,单位为秒UIATarget.localTarget().delay(2);

timeout:返回当前的超时值,应用如下
UIATarget.localTarget().timeout();

setTimeout:设置一个新的超时值,应用如下
UIATarget.localTarget().setTimeout();

pushTimeout:保存在堆栈的当前超时值,并设置一个新的超时值,应用如下
UIATarget.localTarget().pushTimeout();

popTimeout:从堆栈检索以前的超时值,恢复其作为当前的超时值,并将其返回,应用如下UIATarget.localTarget().popTimeout();

打印日志,与document.write()一样,只是这个是打印在ui autoaction工具内UIALogger.logMessage("需要打印出的信息");​//这个可以用来进行判断

模拟app返回桌面,并且从后台再次进入app,其中的操作间隔以秒为单位​//下面示例返回桌面,并且10秒后进入ios后台,返回app内​
UIATarget.localTarget().deactivateAppForDuration(10);


这有个简单的示例,感兴趣的去去看看:
http://www.minroad.com/?p=799

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容