iOS自动化测试之常用UI Automation API

本文章转载于搜狗测试

在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成对出现,在这两个方法中间的代码会被修改超时时间,不在这对语句中间出现的代码,不会受到任何影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容