全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件

入门

更新时间:2017-06-07 13:26:11

UI Automation是苹果公司提供的测试框架,开发者可以利用它在真实设备或者模拟器上测试iOS应用(iOS 9.3及以下)。UI Automation的编程语言为JavaScript。

1. 搭建并进入UI Automation环境

苹果公司已经为开发者们提供了一套Instruments工具,它被包含在Xcode中。因此只需下载安装Xcode就可以使用UI Automation。

  1. 安装Xcode(本文以Xcode 6.4为例)。

  2. 在真机或模拟器上安装待测app。

  3. 进入Xcode,在菜单栏依次点击Xcode -> Open Developer Tool -> Instruments。

  4. 双击Automation

2. 熟悉UI Automation图形界面和基本功能

下图为UI Automation的图形界面

a. 在左上方区域,我们可以选择模拟器或真机设备,以及设备上待测的app。

本文接下来介绍的测试将在iPhone 6模拟器下进行,激活方式如下图

选择要测试的app(本文以“开源中国”为例)

b. 在右下方区域,点击中间的按钮(下图红色方框),在这里我们可以点击“Add”选择“Create”新建脚本或者“Import”导入已经写好的脚本;双击脚本可以修改脚本的名称。

c. 在左下方区域,选择Script面板可以编写脚本,选择Trace Log面板则展示日志信息。注意到,新建的脚本已经自动生成了一行代码,这行代码十分常用,几乎所有的测试脚本都需要这行代码,我们将在后面解释它。

在Script面板点击右键,选择“Export”,可以导出写好的脚本。

3. 编写脚本

打开“开源中国”app,我们看到如下界面

我们开始编写第一个脚本,这个脚本的目标是点击导航栏左侧的有三条白色横线的按钮。

  1. var target = UIATarget.localTarget(); //UIATarget是最上层的类,表示真实设备或模拟器
  2. var app = target.frontMostApp(); //取得设备(模拟器)最前端的app
  3. var navigationBar = app.navigationBar(); //取得导航栏
  4. var leftButton = navigationBar.leftButton(); //取得导航栏的左侧按钮
  5. leftButton.tap(); //点击左侧按钮

运行脚本有两种方式,一种是点击左上方的红色圆圈按钮,效果相当于重新启动app,然后执行脚本内容;

还有一种是点击最下面的三角形形状的播放按钮,若待测app已经启动,则继续在该app上执行脚本内容。

上面这段代码的编程风格非常清晰,但是可能会显得繁琐,我们也可以用一行代码实现相同的效果。

  1. UIATarget.localTarget().frontMostApp().navigationBar().leftButton().tap();

运行上述脚本后,我们发现app页面变成了下图,这说明脚本完成了目标。

打开Trace Log面板,我们发现输出日志与上面这一行代码非常相似。

接下来,我们要在点击导航栏左侧按钮的基础上,点击左侧的“技术问答”。

  1. var window = app.mainWindow(); //取得app的主窗口
  2. var tableView = window.tableViews()[0]; //取得主窗口中的第一个tableView
  3. var cells = tableView.cells(); //取得tableView中所有cells,返回一个数组
  4. var techCell = cells[0]; //取得第一个cell
  5. techCell.tap(); //点击"技术问答"

将这段脚本复制到之前写好的脚本后面,执行脚本,发现运行成功,app跳到了“技术问答”的界面。注意到var techCell = cells[0]; 这行代码,我们选择cells[0]是因为我们事先知道“技术问答”是cells的第一个元素,我们也可以这么写:var techCell = cells[“技术问答”]; 这样也能找到名字为“技术问答”的元素。

很多时候,app美妙的动画效果会成为自动化测试的绊脚石,如果动画时间过长,我们却尝试操作(如点击)那些还没来得及出现的元素,这样将导致错误。解决方案是在用delay()方法让脚本延迟指定的一段时间后执行。

  1. target.delay(2); //延时2秒

4. 录制脚本

如果你还不熟悉UI Automation的API,那么录制功能将给你带来极大的便利,它会记录下你每次操作的步骤,生成相应的代码。然而,录制功能不能识别一些复杂的操作,因此我们不要过度依赖录制功能。

a. 点击红色的录制按钮

b. 在真机设备或者模拟器上执行期望的操作

c. 点击停止录制按钮

我们录制了一段登录脚本,录制结果如下

点击小箭头,我们可以得到更多的可选方案。如下图,buttons()[“我”],buttons()[5],elements()[“我”]和elements ()[7]都是等价的,我们可以任选一种,然后双击蓝色区域表示确认,小箭头也随之消失。

5. 理解层次结构

在UI Automation框架中,每一个可访问的元素都继承自UIAElement。UIAElement有许多常用的方法,如

  • name:返回元素的名称

  • value:返回元素的值

  • elements:以Array的形式返回这个元素的子元素

  • isVisible:若元素可见,返回1;否则返回0

  • tap:点击这个元素

  • logElementTree:在日志中输出这个元素和它的子元素的信息

我们运行下面一段脚本,来查看app的层次结构。

  1. var target = UIATarget.localTarget(); //UIATarget是最上层的类,表示真实设备或模拟器
  2. target.delay(3); //延时3秒,跳过开场动画
  3. UIALogger.logMessage("Test begins"); //输出测试信息
  4. target.logElementTree(); //输出target和它的子元素的信息
  5. UIALogger.logMessage("Test ends"); //输出测试信息

在Editor Log面板,我们可以看到日志信息。UIATarget是最上层的类,它有1个子元素UIAApplication;UIAApplication有3个子元素,类型都是UIAWindow,第1个UIAWindow就是主窗口,它是app的核心部分,有非常多的子元素,我们不再展开阐述;第2个UIAWindow其实是不可见的,我们可以用isVisible方法去验证;第3个UIAWindow包含了状态栏的信息。

本文导读目录