本文章转载于搜狗测试
在iOS自动化测试中UI Automation的对象,都是以UIAxxx的形式出现的,例如UIAButton等。UIA是UI Automation的缩写,如果忽略掉前缀,直接看对象的名称,在表达方面应该会明确。接下来对UI Automation所提供的API进行初步了解吧。
UIALogger日志输出
负责日志输出的对象是UIALogger,主要有两部分的职责:记录测试结果;负责各个级别的日志结果输出。
在记录测试结果方面,有logFail()、logPass()方法和logStart()方法。logStart()方法会在测试即将开始的时候调用,并且在测试结束后,和logFail()或logPass()方法配对出现完成一个测试方法的开始部分和最后的完成部分的结果记录,logPass()和logFail()是一对函数,分别表示方法测试通过和未通过。
在日志输出方面,一般常用的事logMessage()方法,日志输出是我们调试UI Automation脚本唯一的手段,在编写自动化测试脚本的时候,一定要掌握logMessage()方法。需要注意的是logMessage()只接受字符串类型的参数。例如:UIALogger.logMessage(“JUST TEST”)就是一个有效地输出,但是如果这样的:UIALogger.logMessage(123);就不会有任何输出,这里需要强制的是把数字类型转化为字符串类型就可以有内容输出了。
手势动作的模拟
UI Automation的API给用户提供了很多手势操作的模拟方式,现在介绍几种常用的手势动作模拟方式,为大家提供一个思路。如果希望更加全面的学习,建议参考Apple官方文档。
模拟操作动作的方法主要由两个主类提供,在API调用方式上也有一些其别,所以这里再次细分了两种方式,分别为UIAElement方式和UIATarget方式。
1. UIAElement方式
(1)点击
tap()方法,一个button或者一个表单的某一行(UIATableViewCell)都可以使用tap方法操作。但如果是一个阅读器的话,本身被操作的控件区域很大,在控件内部还会细分操作区域。不同区域的相同操作可能效果不同。在这样的测试需求前面,只使用tap()方法明显是不能满足需求的。这时需要使用更高级的操作方式tapWithOptions(option)。例如,UIAElement.tap
WithOptions({x:0.9,y:0.5})。
如果题词点击不能满足需求,还可以使用doubleTap()方法来模拟双击的操作。如果单指的点击不能满足需求,可以使用twoFinger
Tap()来模拟双指的点击操作。
(2)滑动或拖拽
滑动和拖拽在UI Automation中区别不大,唯一区别在于操作时的延时时间不同。现在可以从接口层面来查看滑动操作和拖拽操作的区别。
滑动实例:
UIAElement.flickInSideWithOption({touchCount:2,startOffset:{x:0.5,y:0.9}, endOffset:{x:1.0, y:0.9}});
拖拽实例:
UIAElement.dragInsideWithOptions({touchCount:2,startOffset:{x:0.5,y:0.9}, endOffset:{x:1.0, y:0.9}, duration:1});
从上面两个实例中可以看出,拖拽比滑动函数多了一个duration参数,这个duration表示操作时手指和屏幕的接触时间,duration参数一般只接收值为0或1的传入(你可能还会看到有些文档里卖弄传入2或者3,但官方文档中未对这些参数进行详细说明,而且从实际操作的角度来看好像也没有看出具体的差别),0代表flick方式接触时间,1代表drag和pinch等操作的将诶出时间。还需要特别说明,duration参数有一个默认值并且为0.也就是说dragInsideWithOptions方法如果没有显示传入duration的值,dragInsideWithOptions和flickInsideWithOptions是等价的。这两个方法都有一个参数为touchCount,这个参数表示滑动或拖拽操作的手指个数,默认为1。单指滑动或拖拽就可以不用设置这个参数了。
2. UIATarget方式
(1)点击
在点击方面,UIATarget和UIAElement的方式一样提供了两种方法供开发者使用,即tap()和tapWithOptions()方法。唯一不同的是传入的参数。Target的实例:
UIATarget.localTarget.tap({x:300,y:200});
UIATarget.localTarget.tapWithOptions({x:300,y:200}, {tapCount:1,touchCount:2,duration:1});
在tap方法里面需要传入点击的具体坐标,因为Target是一个全局对象,操作区域非常大,需要明确指定点击的区域。在tapWithOptions方法中,还需要传入点击的次数(tapCount,默认值为1),点击时手指的个数(touchCount,默认值为1),点击时手指接触时间(duration,默认值为0)。
同样,UIATarget方式也有doubleTap方法和twoFingerTap方法。
(2) 滑动和拖拽
在UIATarget方式中,滑动的方法为:flickFromTo;拖拽的方法为:fragFromToForDuration。虽然方法名字有所变化,但是用法和UIAElement方式完全相同,我们直接给出实际的例子:
UIATarget.localTarget().flickFromTo({x:160,y:200},{x:160,y:400})
UIATarget.localTarget().dragFromToDuration({x:160,y:200},{x:160,y:200}, 1);
在Target方式中,还有一种操作,非常类似于滑动和拖拽,在官方文档中称为pinch(一般可以翻译为捏合或缩放,但都不是很准确),一般pinch最常用的操作是,在浏览照片时可以通过pinch对照片进行缩放。pinch根据移动的方式不同而被划分为两种:pinchOpen和pinchClose。实例如下:
UIATarget.localTarget().pinchOpenFromToForDuration({x:20,y:200}, {x:300,y:200}, 1);
UIATarget.localTarget().pinchCloseFromToForDuration({x:20,y:200}, {x:300,y:200}, 1);
延时处理
在延时处理方面,有delay()方法,在脚本中使用起来非常简单、方便。在延时处理时,还有更加高级的方法需要介绍一下。
在遍历控件树时,一般会采用这样的方式遍历控件树:
var elementArray = UIAElement.elements();
正常情况下,这段代码很快就会返回一个UIAElementArray对象,并传递给变量,但是当这个UIAElement没有子元素时,这个语句就会执行的非常慢,因为没有子元素了,UI Automation是通过超时机制来处理这个异常的。在没有任何设置的情况下,UI Automation默认的超时时间为5秒。频繁地遇到这种情况会使测试脚本的执行速度拖延,过慢的测试脚本运行会大幅度降低测试脚本的可用性。这时需要把超时时间设置的短一些。例如:
UIATarget.localTarget().setTimeout(1);
这样就把超时时间设置为1秒,从而提升了脚本的执行速度。但是使用setTimeout方法会有一个隐患,因为这种方式的设置是全局的一种方式,UIATarget.localTarget().setTimeout(1)会使得这个测试运行过程中超时时间都被强制改为1秒,或许在有些函数方法内部还需要超时时间为5秒。所以需要有一种更加优雅的方式来解决这个问题。UI Automation提供了这样的方式,实例代码如下:
UIATarget.localTarget().pushTimeout(1);
var elementArray = UIAElement.elements();
UIATarget.localTarget().popTimeout(1);
pushTimeout和popTimeout成对出现,在这两个方法中间的代码会被修改超时时间,不在这对语句中间出现的代码,不会受到任何影响。