苹果公司已经为开发者们提供了一套Instruments工具,它被包含在Xcode中。因此只需下载安装Xcode就可以使用UI Automation。
下图为UI Automation的图形界面
本文接下来介绍的测试将在iPhone 6模拟器下进行,激活方式如下图
选择要测试的app(本文以“开源中国”为例)
在Script面板点击右键,选择“Export”,可以导出写好的脚本。
打开“开源中国”app,我们看到如下界面
我们开始编写第一个脚本,这个脚本的目标是点击导航栏左侧的有三条白色横线的按钮。
var target = UIATarget.localTarget(); //UIATarget是最上层的类,表示真实设备或模拟器 var app = target.frontMostApp(); //取得设备(模拟器)最前端的app var navigationBar = app.navigationBar(); //取得导航栏 var leftButton = navigationBar.leftButton(); //取得导航栏的左侧按钮 leftButton.tap(); //点击左侧按钮
运行脚本有两种方式,一种是点击左上方的红色圆圈按钮,效果相当于重新启动app,然后执行脚本内容;
还有一种是点击最下面的三角形形状的播放按钮,若待测app已经启动,则继续在该app上执行脚本内容。
上面这段代码的编程风格非常清晰,但是可能会显得繁琐,我们也可以用一行代码实现相同的效果。
UIATarget.localTarget().frontMostApp().navigationBar().leftButton().tap();
运行上述脚本后,我们发现app页面变成了下图,这说明脚本完成了目标。
打开Trace Log面板,我们发现输出日志与上面这一行代码非常相似。
接下来,我们要在点击导航栏左侧按钮的基础上,点击左侧的“技术问答”。
var window = app.mainWindow(); //取得app的主窗口 var tableView = window.tableViews()[0]; //取得主窗口中的第一个tableView var cells = tableView.cells(); //取得tableView中所有cells,返回一个数组 var techCell = cells[0]; //取得第一个cell techCell.tap(); //点击"技术问答"
将这段脚本复制到之前写好的脚本后面,执行脚本,发现运行成功,app跳到了“技术问答”的界面。注意到var techCell = cells[0]; 这行代码,我们选择cells[0]是因为我们事先知道“技术问答”是cells的第一个元素,我们也可以这么写:var techCell = cells["技术问答"]; 这样也能找到名字为“技术问答”的元素。
很多时候,app美妙的动画效果会成为自动化测试的绊脚石,如果动画时间过长,我们却尝试操作(如点击)那些还没来得及出现的元素,这样将导致错误。解决方案是在用delay()方法让脚本延迟指定的一段时间后执行。
target.delay(2); //延时2秒
如果你还不熟悉UI Automation的API,那么录制功能将给你带来极大的便利,它会记录下你每次操作的步骤,生成相应的代码。然而,录制功能不能识别一些复杂的操作,因此我们不要过度依赖录制功能。
我们录制了一段登录脚本,录制结果如下
点击小箭头,我们可以得到更多的可选方案。如下图,buttons()["我"],buttons()[5],elements()["我"]和elements ()[7]都是等价的,我们可以任选一种,然后双击蓝色区域表示确认,小箭头也随之消失。
执行过程如下:
-> -> ->
-> ->
在UI Automation框架中,每一个可访问的元素都继承自UIAElement。UIAElement有许多常用的方法,如
- name:返回元素的名称
- value:返回元素的值
- elements:以Array的形式返回这个元素的子元素
- isVisible:若元素可见,返回1;否则返回0
- tap:点击这个元素
- logElementTree:在日志中输出这个元素和它的子元素的信息
我们运行下面一段脚本,来查看app的层次结构。
var target = UIATarget.localTarget(); //UIATarget是最上层的类,表示真实设备或模拟器 target.delay(3); //延时3秒,跳过开场动画 UIALogger.logMessage("Test begins"); //输出测试信息 target.logElementTree(); //输出target和它的子元素的信息 UIALogger.logMessage("Test ends"); //输出测试信息
在Editor Log面板,我们可以看到日志信息。UIATarget是最上层的类,它有1个子元素UIAApplication;UIAApplication有3个子元素,类型都是UIAWindow,第1个UIAWindow就是主窗口,它是app的核心部分,有非常多的子元素,我们不再展开阐述;第2个UIAWindow其实是不可见的,我们可以用isVisible方法去验证;第3个UIAWindow包含了状态栏的信息。
以上是UI Automation的基础教程,如果希望学习更多有关UI Automation的内容,请参考下面的资料。
a. 《UI Automation JavaScript Reference for iOS》,UI Automation官方文档,里面有详实的API介绍
b. 《Automate UI Testing in iOS》,UI Automation入门教程