钻研小白学习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下面的主窗口。
列举一些比较常用的操作代码
要点击两次相同的位置,你可以使用此代码:
示例,点击两次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