Instuments工具
| instruments -t Desktop/sample1.tracetemplate -w "iPad - Simulator - iOS 7.1" "/Users/username/Library/Developer/Xcode/DerivedData/SOTC-LocalizationExample-dlqskvetzmqvcnbrpwdtldgtpubp/Build/Products/Debug-iphonesimulator/SOTC-LocalizationExample.app" -AppleLanguages "(en)" -AppleLocale en |
| instruments -t Desktop/sample2.tracetemplate -w ac5c5801UDIDf2ca5e9e88a9db <app_name, e.g. QuickEdit> -AppleLanguages "(de)" -AppleLocale de |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xcode中自带的Instuments工具可以用来进行APP的自动化测试, 以及用于进行内存泄露, 文件读写操作等的性能分析.
第一部分: 熟悉Instruments的UIAutomation.
首先, 选取xcode->Open Developer Tool->Instruments打开Instruments工具, 然后在左上角可以选取设备及被测APP(如下图):

在这里, 我选取了iPhone 5s的一个模拟浓ky"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcsINLUvLDWrsewseDQtLXE0ru49rzytaW1xNaquvXI1bGoQVBQLjwvcD4KPHA+uNW/qsq8vdO0pVVJQXV0b21hdGlvbrXEu7AsIL2o0unRodTxwrzWxr3Fsb61xLe9yr3AtMrsz6S4w7mkvt+1xMq508MuIMjnz8LNvLXEtdeyv7XEyP249rC0xaW31rHwyseypbfFLCDCvNbGLCDNo9a5LjwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141229/20141229084253128.png" alt="\">
点击中间的红色按钮开始录制, 录制过程中, 代码框中会实时更新自动化脚本, 点击停止后, 就录制成功了一段自动化测试脚本了. 然后可以点击左边执行即可看到iPhone 5s模拟器中的执行结果了, 跟录制的动作是一致的.
|
1
|
|
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
可以看出, 使用UIAutomation对IOS的APP进行自动化测试, 使用的是JavaScript语言.
以上的target, app是建立特定的执行环境, 然后通过app.mainWindow()获取APP的UIWindow.
也可以通过var navBar = app.navigationBar()来获取APP的导航栏navigationBar.
使用target.logElementTree()可以建立APP的层级结构树(类似于Android自动化中的getHierarchyView()方法). 一个简单的结构如下:

第二部分: 控件的获取及操作
获取UI控件的方法也非常简便:
|
1
2
3
4
|
var tableViews = window.tableViews() // 可以获取所有的tableView组成的数组.var cells = tableViews[0].cells() // 则获取到第一个tableView中的所有cell元素.var textFields = window.textFields()textFields[0].value() // 获取该textField中的值 |
其他控件的获取都是类似的方法, 如buttons(), images(), webViews().
对控件的操作如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
window.textFields()[0].setValue("name"); // 向textField中填充value.cells[0].tap() // 对某个cell执行tap操作.target.tap({x: 100, y: 200}); // 通过坐标执行tap操作target.doubleTap({x: 100, y: 200});target.twoFingerTap({x: 100, y: 200});// 缩放target.pinchOpenFromToForDuration({x:20, y:200}, {x:300, y:200}, 2);target.pinchCloseFromToForDuration({x:20, y:200}, {x:300, y:200}, 2);// 拖拽滑动:target.dragFromToForDuration({x:160, y:200}, {x:160, y:400}, 1);target.flickFromTo({x:160, y:200}, {x:160, y:400}); |
导航栏navigationBar与tabBar的获取及操作如下:
|
1
2
3
4
5
6
7
|
var navBar = app.navigationBar();navBar.leftButton().tap()var tabBar = app.tabBar();var selectedTabName = tabBar.selectedButton().name();if (selectedTabName != "First") { tabBar.buttons()["First"].tap();} |
打印调试log的方式如下:
|
1
2
3
4
|
UIALogger.logStart("mainTest");UIALogger.logMessage( "Select the cells" );UIALogger.logPass("PASS"); UIALogger.logFail("FAIL"); |
第三部分: 自定义自动化脚本
熟悉了基本的UIAutomation相关的规则之后, 我们就可以来编写自定义的自动化脚本了.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var target = UIATarget.localTarget();var app = target.frontMostApp();var window = app.mainWindow();var navBar = app.navigationBar();target.logElementTree();UIALogger.logStart("mainTest");UIALogger.logMessage( "Select the cells" );var cells = window.tableViews()[0].cells();for (var index in cells) {// window.tableViews()[0].cells()[0].tap(); UIALogger.logMessage(cells[index]); cells[index].tap(); navBar.leftButton().tap()} |
在这里, 我简单的取出tableView上的所有cell, 并依次点击该cell, 然后跳转至每个cell的详细界面, 最后返回.
log栏里, 会呈现所有的执行结果, 分析起来也是非常方便的.

怎么样, 使用起来是不是蛮简单的. 但是, 在这里, 只是简单总结了Instruments中UIAutomation的基本用法, 真正精髓的东西还要自己去慢慢琢磨.
所有的技术都是易学难精, 大家加油.
Instuments工具的更多相关文章
- Unity3d入门 - 关于unity工具的熟悉
上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...
- 细说前端自动化打包工具--webpack
背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...
- Web Api 入门实战 (快速入门+工具使用+不依赖IIS)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...
随机推荐
- iOS 两个App之间调起通信
前言 假设需求是这样的:由一个app1跳转到app2之后,app2完成某项任务之后,怎么把app2的完成信息传到app1(自己的程序是app1),传的是什么类型的数据,怎么进行解析? 逻辑 本文章使用 ...
- 欢快的使用Unity JSON吧
0x01:前言 Unity 5.3加入了UnityUtility类,意味着Unity终于有了自己原生态的JSON库.Unity主要用来游戏开发,JSON做为游戏开发中最受欢迎的配置文件.在官方没有库支 ...
- webstorm svn 报错
webstorm svn 报错Cannot run program "svn": CreateProcess error=2, The system cannot find ...
- golang的cgo支持调用C++的方法
1)swift,貌似官网的推荐 2)extern "C" 我使用后者,用起来比较爽,上代码 c.h #pragma once #ifdef __cplusplus extern & ...
- SET TEXTSIZE number
When you using sqlcmd to export some data by a query, you will found some column data is truncated i ...
- Leetcode: Maximum XOR of Two Numbers in an Array
Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- session跟cookies区别
Session和Cookie的使用总结: Session和cookie都是asp.Net中的内置对象,至于他们有什么区别,在这里就不在多说,现在来说说一些比较实用点的东西: 我们知道网站都有一个后台管 ...
- 【实践】纯jquery实现图片滑动无缝轮播,带左右按钮及控制按钮
在此随笔之前,博主已经做过一次图片滑动轮播,如过你也有看过就会知道里面的效果在自动轮播的时候有一个不太美观的效果,就是当最后一张图片滑动切换到第一张图片的时候会看到一个快速向左滑动的效果,这是很不美观 ...
- PowerDesigner反向工程,根据Oracle数据库结构生成ER图(2014-3-25记)
01.添加数据服务端 02. PowerDesigner 1. 新建PDM:选择菜单File->New Model,[Model type]选择Physical Data Model,[DBMS ...
- JSON 格式说明
一维json { "sn" : "CS20160918095444121640", "suitstypes_id" : "47&q ...