IOS 自动化 1-UI Automation

1. 搭建并进入UI Automation环境

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

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

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

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

d. 双击Automation

 

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

下图为UI Automation的图形界面

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

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

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

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

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

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

 

3. 编写脚本

打开“开源中国”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秒

 

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的层次结构。

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包含了状态栏的信息。

 

 6. UI Automation学习资料

以上是UI Automation的基础教程,如果希望学习更多有关UI Automation的内容,请参考下面的资料。

a. 《UI Automation JavaScript Reference for iOS》,UI Automation官方文档,里面有详实的API介绍

b. 《Automate UI Testing in iOS》,UI Automation入门教程

你可能感兴趣的:(IOS,功能自动化,自动化)