相对于Android来说,iOS比较封闭。这一点,在设计和评估自动化测试方案的时候感觉尤其强烈。iOS平台上没有特别好用的自动化测试工具。苹果针对iOS提供了UI Automation的Instruments工具,以及相配合使用的Javascript库,但是使用起来有很大的局限性。主要问题是必须使用Javascript来编写测试脚本,不支持其他语言,很难实现复杂的功能。而且,在一台mac机上同时只能运行一个Instruments实例,无法对多个设备同时进行测试。在多数游戏应用中,UI都不是使用标准控件的,所以不可避免的要使用图像识别技术。而iOS UI Automation API里面除了截屏的功能并没有提供多少帮助。

所幸的是我们找到了UIAHost.performTaskWithPathArgumentsTimeout()方法。这个方法是用来调用外部程序的。巧妙地利用这个方法可以实现比较复杂的功能。但是我仍然希望测试逻辑能用Python来写,因为Python用起来相当顺手而且有成熟的测试框架。

要让UI Automation的Javascript脚本听从Python脚本的指挥,可以把Javascript脚本写成一个服务器,接受来自Python脚本的指令,并调用相应的API完成任务。通信的任务可以使用socket。当然Javascript脚本本身无法完成这个任务,所以需要调用外部程序来实现。这个外部程序可以用Python来写,我称之为slave.py,而Javascript脚本就是master.js,因为是master创建的slave进程。当然实际上slave并不听命于master,master反而要听从slave从socket获得的指令。

这样一来,只需要写个驱动层,把API调用包装一下,通过socket传输到slave.py,再通过slave.py的stdout返回到master.js,再通过调用UI Automation API就实现了Python脚本的自动化测试。当然本文没有涉及很多细节实现问题,留给以后有时间再阐述。

以下是简化的master.js示例代码:

UIALogger.logMessage("Instruments started.")

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
var host = target.host(); var screenshotPath = "screen"; var python_path = host.performTaskWithPathArgumentsTimeout("/usr/bin/which", ['python'], 1).stdout.replace("\n", "");
if (python_path == "") {
UIALogger.logError("python is not found.");
}
else {
while(1) {
var result = host.performTaskWithPathArgumentsTimeout(
python_path,['InstrumentsSlave.py'], 30); var ins = ("" + result.stdout).split('\n'); if (ins[0] == 'exitApp')
break; switch (ins[0]) {
case 'tap':
var x = ins[1];
var y = ins[2];
target.tap({x:x, y:y})
break;
case 'input':
var s = ins[1];
app.keyboard().typeString(s)
break;
case 'captureScreen':
target.captureScreenWithName(screenshotPath);
break;
default:
break;
}
}
}

最新文章

  1. 在Android中如何获取视频的第一帧图片并显示在一个ImageView中
  2. [图文详解] Sublime Text在Windows/Ubuntu/Mac OSX中配置使用CTags
  3. 关于k-means聚类算法的matlab实现
  4. Android 网络通信框架Volley基本介绍
  5. PowerCLI: One-Liner to get VMs, Clusters, ESX Hosts and Datastores并导入数据库中
  6. 简单易懂的单元测试框架-gtest(二)
  7. @ControllerAdvice详解
  8. 论文阅读笔记三十一:YOLO 9000: Better,Faster,Stronger(CVPR2016)
  9. pfSense-2.4.4安装教程
  10. Linux CentOS 6.9 Minimal 编译 OpenJDK 7
  11. CentOS7安装配置PostgreSQL9.6
  12. 初识Netty
  13. jvm虚拟机---执行引擎子系统
  14. 1253 Dungeon Master
  15. 文本diff算法Patience Diff
  16. Dubbo -- 系统学习 笔记 -- 示例 -- 负载均衡
  17. Vue 框架-04-计算属性
  18. tensorflow windows
  19. Eclipse web工程 部署 三种方式 2
  20. 量化分析获取数据的3种姿势(压箱底的神器Tushare)

热门文章

  1. word中使用MathType能做什么
  2. C++ Base64编码解码、MD5及TEA加密解密
  3. iOS -转载-开发之个人开发者账号转公司开发者账号
  4. 动画间隔AnimationInterval 场景切换、图层叠加
  5. tornado详细介绍
  6. Yolo+Windows 配置(详细版)
  7. Java String.replaceAll() 与后向引用(backreference)
  8. Win10-64位 免安装版Mysql8下载安装运行
  9. 通过脚本同时运行几个spider
  10. create-trigger-insert-pwd