在iOS自动化测试中UI Automation的对象,都是以UIAxxx的形式出现的,例如UIAButton等。UIA是UI Automation的缩写,若是忽略掉前缀,直接看对象的名称,在表达方面应该会明确。接下来对UI Automation所提供的API进行初步了解吧。微信
UIALogger日志输出ide
负责日志输出的对象是UIALogger,主要有两部分的职责:记录测试结果;负责各个级别的日志结果输出。函数
在记录测试结果方面,有logFail()、logPass()方法和logStart()方法。logStart()方法会在测试即将开始的时候调用,而且在测试结束后,和logFail()或logPass()方法配对出现完成一个测试方法的开始部分和最后的完成部分的结果记录,logPass()和logFail()是一对函数,分别表示方法测试经过和未经过。学习
在日志输出方面,通常经常使用的事logMessage()方法,日志输出是咱们调试UI Automation脚本惟一的手段,在编写自动化测试脚本的时候,必定要掌握logMessage()方法。须要注意的是logMessage()只接受字符串类型的参数。例如:UIALogger.logMessage(“JUST TEST”)就是一个有效地输出,可是若是这样的:UIALogger.logMessage(123);就不会有任何输出,这里须要强制的是把数字类型转化为字符串类型就能够有内容输出了。测试
手势动做的模拟spa
UI Automation的API给用户提供了不少手势操做的模拟方式,如今介绍几种经常使用的手势动做模拟方式,为你们提供一个思路。若是但愿更加全面的学习,建议参考Apple官方文档。.net
模拟操做动做的方法主要由两个主类提供,在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成对出现,在这两个方法中间的代码会被修改超时时间,不在这对语句中间出现的代码,不会受到任何影响。
今天要介绍的都已经介绍完了,若是对上次介绍UI Automation的文章感兴趣的话,能够点击左下方“阅读原文”来了解详情。
若是你对iOS自动化测试感兴趣,或者像了解更多,那就回复“189:你想说的话”,把你问题告诉咱们吧!
本文分享自微信公众号 - 搜狗测试(SogouQA)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。