使用Python实现基于图像识别的iOS自动化测试
相对于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;
}
}
}
使用Python实现基于图像识别的iOS自动化测试的更多相关文章
- [python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计 // */ // ]]> [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...
- python中基于descriptor的一些概念
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- python实现基于CGI的Web应用
python实现基于CGI的Web应用 本文用一个“网上书店”的web应用示例,简要介绍如何用Python实现基于CGI标准的Web应用,介绍python的cgi模块.cigtb模块对编写CGI脚本提 ...
- 零成本实现Android/iOS自动化测试:基于Appium和Test Perfect
https://item.taobao.com/item.htm?spm=a230r.1.14.14.42KJ3L&id=527677900735&ns=1&abbucket= ...
- 【python图像处理】图像的缩放、旋转与翻转
[python图像处理]图像的缩放.旋转与翻转 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图 ...
- 接口自动化 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
基于python实现的http+json协议接口自动化测试框架(实用改进版) by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436 目录 1. ...
- python中基于descriptor的一些概念(上)
@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2 ...
- python中基于descriptor的一些概念(下)
@python中基于descriptor的一些概念(下) 3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3 ...
随机推荐
- 【BZOJ】3401: [Usaco2009 Mar]Look Up 仰望(单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=3401 还能更裸一些吗.. 维护一个递减的单调栈 #include <cstdio> #i ...
- [转]NBehave行为驱动测试关于story和scenarios
原文: Behavior-Driven Development with NBehave 这里模拟了一个"银行账户"的类 一个余额属性,一个存款方法,一个撤销账户的方法,一个转账的 ...
- 编写高质量代码--改善python程序的建议(三)
原文发表在我的博客主页,转载请注明出处! 建议十三:警惕eval()的安全漏洞 相信经常处理文本数据的同学对eval()一定是欲罢不能,他的使用非常简单: eval("1+1==2" ...
- UVALive 6560 The Urge to Merge
题目链接:传送门 题目大意:有一个 3*n 的矩阵,每个格子里有一个数,你可以选择相邻的两个格子合并成一个,并且权值变为两数乘积,若一个数未合并,权值变为0,求最后权值总和最大值. 题目思路:以 2^ ...
- Entity Frameword 查询 sql func linq 对比
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更多在用Func形式,l ...
- jpa单向一对多关联映射
如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...
- CodeFores 665D Simple Subset(贪心)
D. Simple Subset time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 《挑战程序设计竞赛》2.3 动态规划-基础 POJ3176 2229 2385 3616 3280
POJ3176 Cow Bowling 题意 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个 ...
- Replay attack 回放攻击
w http://baike.baidu.com/item/重放攻击 重放攻击(Replay Attacks)又称重播攻击.回放攻击或新鲜性攻击(Freshness Attacks),是指攻击者发送一 ...
- wsgi pep333
转自:https://www.aliyun.com/jiaocheng/444966.html?spm=5176.100033.1.11.559a7C 摘要:wsgi介绍参考:pep333wsgi有两 ...