uiautomation


热门范文 2019-10-10 14:28:31 热门范文
[摘要]一:[uiautomation][操作系统]iOS instruments之ui automation的简单使用(高手绕道)最近使用了几次instruments中的automation工具,现记录下automation的简单使用方法,希望对没接触过自动化测试又有需求的人有所帮助。UI 自动测试是iO

【www.shanpow.com--热门范文】

一:[uiautomation][操作系统]iOS instruments之ui automation的简单使用(高手绕道)


 最近使用了几次instruments中的automation工具,现记录下automation的简单使用方法,希望对没接触过自动化测试又有需求的人有所帮助。
   UI 自动测试是iOS 中重要的附加功能,它由名为“Automation”的新的工具对象支持。Automation工具的脚本是用JavaScript语言编写,主要用于分析应用的性能和用户行为,模仿/击发被请求的事件,利用它可以完成对被测应用的简单的UI测试及相关功能测试。
  一. 简单的录制脚本
    打开xcode,这里用我为我家亲爱的龙猫宝贝们制作的龙猫后代基因计算器(totolov)为例。选择模拟器和真机都可以,过程一样。
  可以按下图所示打开instruments工具,也可以点击菜单栏中的“Product-Profile”
 
   选择IOS Simulator->Automation,然后点击Profile(其它工具都很实用,这里就不一一介绍了)
 
二.Accessibility Inspector
  编写一个测试用例,该如何找到识别控件元素呢。这里介绍2个方法
1.可以在脚本中写target.logElementTree(),会在日志中打印出当前页的控件信息。
2.使用自带的Accessibility Inspector功能。
  打开模拟器,找到“Settings > General > Accessibility > Accessibility Inspector”,然后将它打开。
三.其它
  通过以上两部分,应该了解怎么使用automation工具编写简单的测试用例了吧
  当熟悉之后就可以不用录制功能来编写脚本了 
  具体的API参考官方文档:http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html

二:[uiautomation]iOS的自动化测试UIAutomation


快速入门
自动化测试是非常有用的,以测试您的应用程序“,而你的睡眠”。它使您能够快速跟踪回归和性能问题,同时也开发新的功能,而不必担心打破你的应用程序。
由于,苹果公司发布了iOS 4.0的一个的框架UIAutomation,可用于实现自动化测试在真实设备上的iPhone模拟器上。上的文档UIAutomation是相当小的,而且也没有大量的资源在网络上。本教程将告诉你,如何整合UIAutomation在您的工作流程。
最好的指针开始是苹果的文档的UIAutomation,苹果工具文档的一个很好的快速教程,当然,这些幻灯片/视频 WWDC 2010 -会话306 - ?自动化与仪器的用户界面测试。你需要一个免费的developper帐户来访问此资源的整合。
另一个框架要提到是OCUnit的,它包含在Xcode中,可用于单元测试添加到您的应用程序。
你的第一UIAutomation脚本
使用iOS模拟器
使用iOS设备 处理与UIAElement和辅助功能 UIAElement层次
模拟用户交互 简化你的生活的秘诀 介绍调整
导入外部脚本
通过命令行的力量
以交互方式记录互动
“当事情不工作,UIATarget.delay(1);” 先进的互动 处理意外和预期的警报
多工作业
方向 最终的 有用的链接
一个视频
1。你的第一UIAutomation脚本
UIAutomation
Javascript编写的功能测试。有一种强烈的在UIAutomation和可访问性之间的关系,所以你会使用辅助的标签和值模拟和模拟用户界面交互的检查结果。
让我们去了,写我们的第一个测试!
使用iOS模拟器
下载的同伴的项目TestAutomation.xcodeproj,并打开它。该项目是一个简单的2个选项卡的标签栏的应用程序。
确保选择以下方案“TestAutomation> iPhone 5.0模拟器”(也许你已经切换到5.1,所以它可能是iPhone 5.1)
启动工具(产品简介)或?一
在iPhone模拟器,选择自动化模板,然后在“个人资料”
仪器启动,并立即开始录制。停止记录(红色按钮或?R)。
在“脚本”窗口中,单击“添加”>“创建”来创建一个新的脚本
在“脚本”窗口中编辑器,请点击下面的代码
8.  目标= UIATarget.localTarget();
9.  VAR的应用程序target.frontMostApp();
10.变种窗口= app.mainWindow();
11.target.logElementTree();
重新启动脚本?R(你不需要保存)。脚本运行后,日志出现,你可以阻止它。
瞧!您已经写了您的第一UIAutomation测试!
使用iOS设备
一个真正的设备,也可以运行这个测试,而不是模拟器。自动测试设备,支持多任务的iPhone 3GS,iPad的,仅适用于运行iOS 4.0。UIAutomation不幸的是,在iPhone 3G上,无论是操作系统版本。
要运行测试的设备上: 将iPhone连接到USB

选择计划“TestAutomation> iOS装置”

检查发布配置与一个Developper配置文件(而不是一个Ad-Hoc分布情况)。默认情况下,分析是在释放(没有任何理由来分析一个应用程序在调试!)

个人应用程序(?我)

比以前在模拟器上按照相同的步骤。
2。处理与UIAElement和辅助功能
UIAElement层次
有很强的关系之间无障碍UIAutomation:如果配备无障碍访问控制,您将能够设置/获取值,产生动作等的控制是不是“看得见”的辅助工具,将无法访问通过自动化。
您可以允许访问/自动化控制是否使用Interface Builder,或通过编程方式设置属性isAccessibilityElement。你必须支付一定的关注时,设置辅助容器视图(即包含其他UIKit元素)。启用无障碍的整个视图可以“隐藏”其子视图访问/自动化。比如,在项目中,控制器的视图出口应不能够访问,否则的子控制将不访问。如果您有任何问题,logElementTree是您的朋友:列出所有当前可见的元素可以访问。
每个UIKit的控制,可以访问可以表示为一个JavaScript对象,UIAElement。UIAElement有几个属性,名称,价值,元素,父。你的主窗口包含了很多的控制,它定义了一个UIKit的层次结构。这UIKit的层次结构,对应的UIAElement的层次结构。例如,通过调用logElementTree在前面的测试中,我们有以下三种:
+  - 
UIATarget:名称:iPhone模拟器正确的:{{0,0},{320480}}
| +  - 
UIAApplication:名称:TestAutomation的正确:{{0,20},{320460}}
| |  - 
UIAWindow:正确的:{{0,0},{320480}}
| | | +  - 
UIAStaticText的:姓名:一是该价值:首先查看正确的:{{54,52},{212,43}}
| | | +  - 
UIATextField的名称:用户的文本值:点击一些文字在这里!正确的:{{20179},{280,31}}
| | | +  - 
UIAStaticText的:姓名:文字是:值:文字是:正确的:{{20231},{112,21}}
| | | +  - 
UIAStaticText:值:正确的:{{145231},{155,21}}
| | | +  -  UIATabBar:正确的:{{0431},{320,49}}
| | | | +  - 
UIAImage:正确的:{{0431},{320,49}}
| | | | +  - 
UIAButton:名称:第一个值:1 RECT:{{2432},{156,48}}
| | | | +  - 
UIAButton:名称:二正确的:{{162432},{156,48}} 要访问该文本字段,你可以这样写:
。mainWindow的变种textField的。frontMostApp = UIATarget.localTarget()()()。文本字段()[0];
您可以选择基于0的索引或元素的名称来访问元素。例如,以前的文本字段也可以被这样的访问:
VAR textField的。frontMostApp = UIATarget.localTarget()()。主窗口()。文本框()[“用户文本”];
较新版本更清晰,更应该是首选。在Interface Builder中,您可以设置的UIAElement名: 或计划性:
myTextField.accessibilityEnabled
= YES;
myTextField.accessibilityLabel
= @“用户文本”;
你可以看到现在所使用的辅助功能属性UIAutomation针对不同的控件。这是非常聪明的,因为:1)只有一个框架,以学习; 2)编写自动化测试,你也将确保您的应用程序可以访问!所以,通过调用下面的每个UIAElement可以访问它的孩子 要访问的第一个选项卡的标签栏,你可以这样写:
变种的tabbar =
UIATarget.localTarget()。frontMostApp()。TabBar中();
VAR tabButton
tabBar.buttons()[“第一”]; 
UIAElement层次是非常重要的,你要处理不断。记住,你可以转储的层次结构,每次在你的脚本由调用logElementTree上UIAApplication:
。logElementTree。frontMostApp UIATarget.localTarget()()();
在模拟器上,您还可以激活的可访问性检查。启动模拟器,前往“设置”>“通用”>“辅助功能”>“辅助功能”督察“,并将其设置为”开“。 这个小彩虹中的可访问性检查。折叠时,辅助功能是关闭的,并扩展了无障碍时。要激活/ desactivate辅助功能,你只需要点击箭头按钮。现在,到我们的测试应用程序,启动它,并启动督察。 然后,点击文本字段和检查的名称和值属性的相关的UIAElement(也NSObject的accessibilityLabel和性能相当accessibilityValue)。检查员将帮助您调试和编写脚本。
模拟用户交互
让我们更进一步,模拟用户交互。轻按一键,您只需拨打自来水()这个元素:
变种的tabbar = UIATarget.localTarget()。frontMostApp()。TabBar中();
VAR tabButton
tabBar.buttons()[“第一”]; 
/ /点击标签栏!
tabButton.tap();
您也可以拨打doubleTap()中,twoFingerTap() UIAButtons。如果你不想要的元素为目标,但只在指定的坐标画面在屏幕上的互动,你可以使用: 水龙头:
·      
UIATarget.localTarget()。点选(X:100,Y:200});
·      
UIATarget.localTarget()。doubleTap({:100,Y:200});
·      
UIATarget.localTarget()。twoFingerTap({:100,Y:200}); 捏:
·      
UIATarget.localTarget()。pinchOpenFromToForDuration({:20,Y:200},{×:300,Y:200},2);
·      
UIATarget.localTarget()。pinchCloseFromToForDuration({:20,Y:200},{×:300,Y:200},2);   拖动和弗里克:
·      
UIATarget.localTarget()。dragFromToForDuration({:160,Y:200},{160,Y:400},1);
·      
UIATarget.localTarget()。flickFromTo({:160,Y:200},{160,Y:400});
在您指定的时间,只在一定范围内接受即:拖时间,值必须大于或等于0.5秒或不到60岁。
现在,让我们把在实践中: 停止(?R)仪器

在“脚本”窗口中,删除当前的脚本

点击“添加”>“导入”,然后选择TestAutomation/TestUI/Test-1.js

点击记录(?R)和观看的发生。
该脚本是:
测试名=“测试”;
目标=
UIATarget.localTarget();
VAR的应用程序target.frontMostApp();
变种窗口= app.mainWindow();
UIALogger.logStart(测试名);
app.logElementTree();
/ /  - 选择元素
UIALogger.logMessage(“选择第一个选项卡”);
VAR标签栏app.tabBar();
selectedTabName =
tabBar.selectedButton()。名称();
(selectedTabName!“第一”){
    tabBar.buttons()[“第一”。点击();
}
/ /  - 点选文本框就会自动
UIALogger.logMessage(“塔上的文本字段”);
recipeName =“相当长的配方名称”;
window.textFields()[0] =。的setValue(recipeName)的;
target.delay(2);
/ /  - 点选文本框就会自动
UIALogger.logMessage(“关闭键盘”);
app.logElementTree();
app.keyboard()按钮()“回归”。点击();
VAR textValue
window.staticTexts()“RecipeName”。值();
如果(textValue ===
recipeName)
    UIALogger.logPass(测试名);
}
其他{
    UIALogger.logFail(测试名);
}
这个脚本启动应用程序,选择第一个选项卡,如果它不被选中的文本字段的值设置为“相当长的配方名称,并驳回键盘。注意到一些新的功能:延迟(数字时间间隔内) UIATarget允许引入一些延迟之间的相互作用,logMessage(字符串消息)上UIALogger可以用来记录的测试输出和logPass(弦乐信息)上UIALogger的消息表明,脚本已成功完成。您还可以看到一个访问不同的键盘上的按钮,点一下就可以了app.keyboard()按钮()[“”]。点击();
3。简化你的生活的秘诀
介绍调整
现在,你如何,你可以写一些测试的一个基本理念。很快,你会发现有很多的冗余和胶水代码在您的测试中,你会经常重新编写这样的代码:
目标=
UIATarget.localTarget();
VAR的应用程序target.frontMostApp();
变种窗口= app.mainWindow();
这就是为什么我们要使用一个小的JavaScript库,它简化了编写UIAutomation测试。转到https://github.com/alexvollmer/tuneup_js,让图书馆和复制的热身测试“文件夹中的文件夹一边。现在,我们可以重写Test1.js利用可调谐
#导入“的热身/ tuneup.js”
    测试(“测试1”,目标,功能(应用程序)
    变种窗口= app.mainWindow();
    app.logElementTree();
    / / 
- 选择元素
    UIALogger.logMessage(“选择第一个选项卡”);
    VAR标签栏app.tabBar();
    selectedTabName = tabBar.selectedButton()。名称();
    (selectedTabName!“第一”){
        tabBar.buttons()[“第一”。点击();
    }
    / / 
- 点选文本框就会自动
    UIALogger.logMessage(“塔上的文本字段”);
    recipeName =“相当长的配方名称”;
    window.textFields()[0] =。的setValue(recipeName)的;
    target.delay(2);
    / / 
- 点选文本框就会自动
    UIALogger.logMessage(“关闭键盘”);
    app.logElementTree();
    app.keyboard()按钮()“回归”。点击();
    VAR textValue window.staticTexts()“RecipeName”。值();
    的assertEquals(recipeName,textValue);
});
Tune-Up的避免了你写的相同的样板代码,再加上给你一些额外的,例如不同的断言assertTrue(表达式,消息),assertMatch(正则表达式,表达式,消息)的assertEquals(预计,接收消息),assertFalse(表达,消息),assertNull(thingie,消息),assertNotNull(thingie,消息),您可以扩展库非常容易:例如,您可以添加一个logDevice方法上UIATarget对象,通过添加此功能在uiautomation ext.js:
扩展(UIATarget.prototype,{
   logDevice:函数(){
   UIALogger.logMessage(“转储设备:”);
   UIALogger.logMessage(“型号:”+
UIATarget.localTarget()。模型());
   UIALogger.logMessage(“矩形(矩形:”+
JSON.stringify(UIATarget.localTarget()。)));
   UIALogger.logMessage(“名称:”+
UIATarget.localTarget()。());
   UIALogger.logMessage的SystemName:“+
UIATarget.localTarget()(”的SystemName());
   UIALogger.logMessage(“systemVersion:”+
UIATarget.localTarget()。systemVersion());
   }
});
然后,调用target.logDevice(),你应该看到:
转储设备:
  型号:iPhone模拟器
  矩形:{“原点”:{“×”:0,“y”的:0},“大小”:{“宽度”:320,“高度”:480}}
  产品名称:iPhone模拟器
导入外部脚本
你还可以看到如何引用一个脚本,使用#import的指令。因此,创建倍数测试和链接,他们可以通过在一个单一的文件,并呼吁将其导入:
#导入“Test1.js”
#导入“Test2.js”
#导入“Test3.js”
#导入“Test4.js”
#导入“Test5.js”
通过命令行的力量
如果你想你的脚本自动化,你可以在命令行启动。事实上,我建议使用此选项,而不是使用工具的图形用户界面。仪器的用户界面是缓慢的,和测试,保持运行,即使他们已经走到了尽头。在命令行启动UIAutomation测试速度快,你的脚本将停止在测试结束。
要启动一个脚本,你将需要你的UDID和类型终端:
仪器-W your_ios_udid-T
name_of_your_app-E UIASCRIPT absolute_path_to_the_test_file
例如,在我的情况下,该行是这样的:
仪器-W
a2de620d4fc33e91f1f2f8a8cb0841d2xxxxxxxx-T TestAutomation-的?UIASCRIPT /
Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js 如果您使用的是版本的Xcode不如4.3,你需要键入:
仪器-W
your_ios_device_udid-T TestAutomation-的?UIASCRIPT /
Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js
一个小的缺点,不要忘记关闭通的代码在您的设备上,否则,你会看到这个跟踪:,遇到远程异常:“设备锁定,无法启动过程包标识符”com.manbolo.testautomation“ 。是的,UIAutomation不知道你的密码!
命令行也与模拟器。您需要知道您的应用程序在模拟器文件系统的绝对路径。模拟器的模拟设备的文件系统在下面的文件夹?/资源库/应用程序支持/ iPhone Simulator/5.1 /。在这个目录下,你会发现你的应用程序目录,其中包含在模拟器中安装的应用程序的沙箱。只要确定资料库的TestAutomation在模拟器上的应用程序和类型:
仪器-T “/用户/ JC /资源库/应用程序支持/
iPhone
Simulator/5.1/Applications/C28DDC1B-810E-43BD-A0E7-C16A680D8E15/TestAutomation.app”-E
UIASCRIPT /用户/ JC /文档/开发/ TestAutomation / TestAutomation / TestUI /测试2.js
在命令行上的最后一个字。如果你没有精确的输出文件,日志的结果将出现在您输入的命令的文件夹中。您可以使用-E UIARESULTSPATH results_path的脚本的输出重定向。
我还没有成功推出多个脚本的命令行平行。使用整个晚上,链,并启动你的脚本,所以你真的会测试您的应用程序“,而你的睡眠”。
以交互方式记录互动
输入你的脚本,你可以录制的互动,直接在设备上或在模拟器中,稍后重播。做这样的: 启动仪器(?我)

创建一个新的脚本

选择“脚本编辑器

在脚本编辑器的底部,看到红色的按钮,按它!

现在,您可以发挥您的应用程序,你会出现在脚本窗口(甚至旋转事件)看到所拍摄的相互作用。按下方按钮停止记录。
“当事情不工作,UIATarget.delay(1);”
当您编写脚本,你会玩的时间,动画等。UIAutomation具有多种功能元素和等待他们,即使他们不显示的,但最好的建议是从这个额外的演示文稿:
当事情不工作,UIATarget.delay(1);!
4。先进的互动
处理意外和预期的警报
处理警报一直很难在自动化测试:你精心编写的脚本,睡前推出测试套件,并且,在早上,你会发现,所有的测试已经毁了,因为你的iPhone已经收到了意想不到的文本消息已经封锁了测试。好了,UIAutomation帮助您处理。
在你的脚本中添加此代码,
UIATarget.onAlert =:功能onAlert(警报){
    标题= alert.name();
    UIALogger.logWarning(标题“+标题+”遇到“警报!”);
    / /使用默认的处理程序,返回false;
}
并返回错误,你问UIAutomation自动关闭任何UIAlertView,因此不会干涉你的测试警报。您的脚本将运行好像从来没有出现过任何警报。不过,警报可以是您的应用程序和测试工作流程,在某些情况下,你不111,111自动关闭它。要做到这一点,你可以测试对标题的警报,点击一些按钮,并返回true。通过返回TRUE,则表明UIAutomation警报,这必须被视为作为测试的一部分,处理accordantly。
例如,如果你要测试“上的”添加“按钮,添加东西的警报视图用胶带,你可以写:
UIATarget.onAlert =:功能onAlert(警报){
    标题= alert.name();
    UIALogger.logWarning(标题“+标题+”遇到“警报!”);
    如果(标题==“添加东西”){
        alert.buttons()[“添加”。点击();
        / /旁路默认的处理程序返回true;
    }
    / /使用默认的处理程序,返回false;
 }
方便宝宝!
多工作业
在您的应用程序的多任务测试也是非常简单:让我们说你要测试,疯狂的背景过程中你发动每次应用程序恢复从背景和进入 - (无效)applicationWillEnterForeground:(UIApplication的*)应用程序选择器,你可以发送的应用程序在后台,等待10秒,并恢复它的调用:
UIATarget.localTarget()。deactivateAppForDuration(10);
(持续时间)deactivateAppForDuration将暂停脚本,模拟用户点击home键,(和发送的应用程序在后台),等待,恢复应用程序,恢复你的测试脚本,在一行代码。
方向
最后,你可以模拟旋转你的iPhone。同样,非常简单,而且很容易:
目标=
UIATarget.localTarget();
VAR的应用程序target.frontMostApp();
/ /设置景观离开
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT);
UIALogger.logMessage(“目前的定位是”+
app.interfaceOrientation());
/ /肖像
target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);
UIALogger.logMessage(“目前的定位是”+
app.interfaceOrientation());
5。最终的
有用的链接
这是一个相当长的职位,但我希望,你看到的力量UIAutomation和您的应用程序能够获得的潜在爆发的质量。是不是有很多文件上UIAutomation,但我列出了一大堆的链接,可以帮助您。 非常好的系列UIAutomation

http://mobilecoder.wordpress.com/2010/11/08/iphoneipodipad-automation-basics:优秀的教程的UIAutomation,值得阅读!

的http://www.juddsolutions.com/downloads/UnitAndFunctionalTestingForiOSPlatform.pdf:精湛,deepful的介绍单元测试和UIAutomation的。您将欣赏幻灯片N°70“当事情不工作,UIATarget.delay(1);”!

http://guerratopia.com/en/introduction-to-automating-ui-testing-in-ios:很好的教程,很不错的介绍

了很多的约单元测试和UIAutomation的链接
而且,当然 苹果上UIAutomation文件

UIAutomation在苹果工具文档

WWDC 2010 -
306 - ?用户界面自动化测试与仪器
你需要一个免费的developper帐户来访问此资源的整合。
一个视频
结束此行UIAutomation,我不抗拒,向你展示如何,我们使用UIAutomation与米恩在一个小的视频。我们使用各种测试,在这段视频中,我们测试播放器可以播放从0级到120级。救命我,我的iPhone是活着的!
 

三:[uiautomation]如何使用UIAutomation进行iOS 自动化测试(Part I)

写在前面
研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不到什么好的资料,只能从Apple的官网查阅相关的API文档,只可惜,Apple对开发者来说实在是不怎么友好,文档写得相当的粗略,对于初学者来说有一定的难度。
本来是打算自己动手写一篇关于iOS的UI自动化测试的入门级别的介绍性文档的,但想起来后面在具体解决一些问题的时候,收藏一篇很好的Blog,很全面地介绍了如何使用UIAutomation的JavaScript Libraries做iOS程序的自动化测试。如果作者早点看到这篇文章,应该要少走一些弯路,这里没有创意性的它他翻译成中文,希望对你们有一些帮助。
原文地址:http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation
翻译正文:
快速入门
自动化测试代码可以“在你的睡着的时候”很好地帮你测试你的应用程序。它可以让你能够快速地跟踪你程序中的回归和性能方面的问题,这样你就不用担心你新增的功能会影响到你之前已经完成开发的程序了。
随着iOS4.0的发布,苹果公司同时发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试。但官方关于UIAutomation的文档相当的有限,在网络上也没有太多的资源可以查找的。本文将向你展示你如何将UIAutomation整合到你的工作流程当中去。
作为基础知识的准备,你可以先看一下苹果公司关于UIAutomation的文档,另外还有一篇快速入门的介绍苹果Instruments的文档也值得看看,当然,如果你有一个免费的Apple开发者账号的话,你可以看一下WWDC
2010 - Session 306 – 使用Instruments进行用户界面自动化测试的幻灯片或者视频。
除此之外,包括在Xcode中的OCUnit测试框架也可以用来为你的应用程序编写单元测试。
1. 第一个UIAutomation测试脚本
使用iOS 模拟器
使用iOS设备
2. 处理UIAElement和元素可访问性(Accessibility)
UIAElement层次结构
模拟用户操作
3. 经验分享(让你的生活变得更简单)
类库Tune-up介绍
导入外部脚本
使用强大的命令行
使用录制交互功能
当遇到问题时,加上“UIATarget.delay(1);”
4. 高级交互
处理非预期和预期的提示框(alerts)
多任务
屏幕方向
5. 总结
有用的链接
一个视频
1. 你的第一个UIAutomation测试脚本
UIAutomation的功能测试代码是用Javascript编写的。UIAutomation和Accessibility有着直接的关系,你将用到通过标签和值的访问性来获得UI元素,同时完成相应的交互操作。
下面让我们来编写我们的第一段测试代码。
使用iOS模拟器
1. 下载示例应用程序TestAutomation.xcodeproj,并打开它。这个项目是一个很简单的包含2个tab的tabbar应用程序。
2. 确保选中如下图所示的“TestAutomation > iPhone 5.0 Simulator”模式(或许你已经切换成5.1了,因此它可能是iPhone5.1模拟器)。 3. 启动Instruments(Product > Profile),或者通过?I。
4. 选择左边的iOS Simulator,然后再选择Automation模板,然后点击“Profile”。 5. Instruments就已经启动好后,然后直接开始录制了。这里先停止录制,(红包按钮或者?R)。 6. 在左边的Scripts窗口,点击“Add > Create”创建新的脚本。 7. 在脚本编辑器里,输入下面的代码
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
target.logElementTree(); 8. 重新运行这段脚本?R(不需要保存)。脚本跑起来后,你可以在日志打完后停止它。 赞一个!我们就这样完成了我们的第一个UIAutomation测试用例。
使用iOS设备
你除了将你的测试用例运行模拟器上,也可以将它运行在一个真实的设备上。不过,自动化测试用例只能运行在支持多任务的:iPhone 3GS,iPad,iOS > 4.0等设备上。遗憾的是不管iPhone 3G的系统版本是什么,都不支持。
下面是如何操作:
1. 通过USB接口连接上你的iPhone。
2. 选择 “TestAutomation > iOS Device”模式。
3. 确保Developper profile设置成Release模式(而不是Ad-Hoc Distribution profile)。默认情况下,profiling是设置成Release模式的(因为没有必要将profile设置成Debug模式)。 4. 启动测试 (?I)
5. 后面的步骤请参考前面模拟器部分。
2. 处理UIAElement和元素可访问性(Accessibility)
UIAElement层次结构
Accessibility和UIAutomation有密切的联系:如果一个控件的Accessibility是可以被访问的,你就可以设置和读取它的值,作相关的操作,而当一个控件的Accessibility不可见时,你就没有办法通过automation访问它。
你可以通过Interface Builder,或者通过在程序里设置isAccessibilityElement属性的方式来设置一个控件的Accessibility或者可被自动化。当你设置container view(即:一个视图包含其它的UIKit元素)的accessibility时,你必须注意。你设置了整个View的accessibility将会“隐藏”它的子视图的accessibility,例如:在示例项目中,你不能将outlet视图设置成可访问的,否则它所有的子控件将都不可以访问了。在任何时候,logElementTree都是你忠实的朋友:它将当前界面的所有可被访问的元素都打印在日志里。
每一个可以被访问的UIKit控件都可以用一个Javascript对象来描述,它就是一个UIAElement。UIAElement有几个属性:name, value, elements, parent。你的主窗口包含很多的控件,它们是以UIKit层次的方式定义的,这些UIKit层次结构对应的是UIAElement的层次树。例如:前面的测试代码中,通过调用logElementTree,我们可以得到如下面所示的树结构:
+- UIATarget: name:iPhone Simulator rect:{{0,0},{320,480}}
| +- UIAApplication: name:TestAutomation rect:{{0,20},{320,460}}
| | +- UIAWindow: rect:{{0,0},{320,480}}
| | | +- UIAStaticText: name:First View value:First View rect:{{54,52},{212,43}}
| | | +- UIATextField: name:User Text value:Tap Some Text Here ! rect:{{20,179},{280,31}}
| | | +- UIAStaticText: name:The text is: value:The text is: rect:{{20,231},{112,21}}
| | | +- UIAStaticText: value: rect:{{145,231},{155,21}}
| | | +- UIATabBar: rect:{{0,431},{320,49}}
| | | | +- UIAImage: rect:{{0,431},{320,49}}
| | | | +- UIAButton: name:First value:1 rect:{{2,432},{156,48}}
| | | | +- UIAButton: name:Second rect:{{162,432},{156,48}} 你可以通过下面的代码来访问文本框:
var textField =
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[0];
你可以选择通过从0开始的索引或者这个元素的名称来访问这个元素,例如:你也可以通过下面的代码来访问文本控件。
var textField =
UIATarget.localTarget().frontMostApp().mainWindow().textFields()["User Text"];
后一种方式更加清晰明了,应该多使用。你可以通过Interface Builder设置UIAElement的name属性, 或者通过编写代码的方式:
myTextField.accessibilityEnabled = YES;
myTextField.accessibilityLabel = @"User Text";
你现在可以看到,通过accessibility属性可以被UIAutomation用来找到不同的控件。这非常的清晰,因为,第一,你只要学习一个测试框架;第二,通过编写自动化测试代码,你同时还可以保证你的程序是可以被访问的。因此,每一个UIAElement对象的子控件可以通过下面的方法进行访问:
buttons(), images(), scrollViews(),textFields(), webViews(), segmentedControls(), sliders(), staticTexts(), switches(), tabBar(),tableViews(), textViews(), toolbar(), toolbars() 等等……
你可以通过如下代码在tabbar上访问第一个tab:
var tabBar = UIATarget.localTarget().frontMostApp().tabBar();
var tabButton = tabBar.buttons()["First"];
UIAElement结构层次非常的重要,你以后会常常用到它。而且你还要记住,你可以在随时通过调用UIAAplication的logElementTree来获得它的结构。
UIATarget.localTarget().frontMostApp().logElementTree();
在模拟器上,你还可以激活Accessibility 的检测器。启动模拟器,找到“Settings > General > Accessibility > Accessibility Inspector”,然后将它设为“打开”状态。 这个彩色的小框框就是Accessibility 检测器了。当它收起来的时候,Accessibility就被关闭了,当它展开的时候,Accessibility就是打开的。你只要点击上面的箭头按钮就可以激活或者屏蔽Accessibility。现在,打开我们的示例程序,激活检测器。
然后,点击文本框,检查UIAElement的name和value属性(其实就是accessibilityLabel和accessibilityValue对应的NSObject类型的值)。这个检测器可以帮助你调试和编写你的测试代码。
模拟用户操作
让我们更进一步,模拟一些用户的交互操作。你可以简单地调用按钮的tap()来作一个点击操作:
var tabBar = UIATarget.localTarget().frontMostApp().tabBar();
var tabButton = tabBar.buttons()["First"];
// Tap the tab bar !
tabButton.tap();
你还可以调用UIAButtons的doubleTap(), twoFingerTap()。如果你不想操作具体的某个元素,你也可以直接根据屏幕上指定的坐标点进行操作,你可以这么用:
点击:
UIATarget.localTarget().tap({x:100, y:200});
UIATarget.localTarget().doubleTap({x:100, y:200});
UIATarget.localTarget().twoFingerTap({x:100, y:200});
缩放:
UIATarget.localTarget().pinchOpenFromToForDuration({x:20, y:200},{x:300, y:200},2);
UIATarget.localTarget().pinchCloseFromToForDuration({x:20, y:200}, {x:300, y:200},2);
拖拽与划动:
UIATarget.localTarget().dragFromToForDuration({x:160, y:200},{x:160,y:400},1);
UIATarget.localTarget().flickFromTo({x:160, y:200},{x:160, y:400});
注意,当你指定操作的时间间隔的时候,它是有特定的范围的,即:拖拽操作的时间间隔必须大于或者等于0.5秒,小于60秒。
现在,让我们来练习一下:
停止Instruments (?R)
在Scripts窗口里, 移除当前的脚本
点击“Add > Import”然后选择TestAutomation/TestUI/Test-1.js(将下面的代码保存到这个路径)
点击录制按钮 (?R) 然后看看将会发生什么…
下面是Test-1.js代码:
var testName = "Test 1";
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
UIALogger.logStart( testName );
app.logElementTree();
//-- select the elements
UIALogger.logMessage( "Select the first tab" );
var tabBar = app.tabBar();
var selectedTabName = tabBar.selectedButton().name();
if (selectedTabName != "First") {
tabBar.buttons()["First"].tap();
}
//-- tap on the text fiels
UIALogger.logMessage( "Tap on the text field now" );
var recipeName = "Unusually Long Name for a Recipe";
window.textFields()[0].setValue(recipeName);
target.delay( 2 );
//-- tap on the text fiels
UIALogger.logMessage( "Dismiss the keyboard" );
app.logElementTree();
app.keyboard().buttons()["return"].tap();
var textValue = window.staticTexts()["RecipeName"].value();
if (textValue === recipeName){
UIALogger.logPass( testName );
}
else{
UIALogger.logFail( testName );
}
这段脚本先启动待测程序,然后,如果第一个tab没有被选的话就切换到第一个tab,并将上面的文本框的值设成“Unusually Long Name for a Recipe”,接着收起虚拟键盘。这里有一些新的方法值得注意的:UIATarget的delay(Number timeInterval) 方法允许你在两个操作之间做一些等待,UIALogger的logMessage( String message) 方法用来将你想打印的信息输出到日志上去,UIALogger的logPass(String message)方法指明你的测试脚本已经成功的完成测试了。
你还知道了如何访问键盘上的按钮,然后作点击操作:
app.keyboard().buttons()["return"].tap();
由于时间有限且原文太长,先只能翻译到这里,我会尽快的将剩下的部分翻译补上。另外,时间仓促,如有翻译得不准确的地方,也敬请担待。谢谢。
本文由知平软件的Dawson Liu翻译,转载请注明出处。
知平软件致力于移动平台自动化测试技术的研究,我们希望通过向社区贡献知识和开源项目,来促进行业和自身的发展。 var isLogined = false; var cb_blogId = 123488; var cb_entryId = 2631949; var cb_blogApp = currentBlogApp; var cb_blogUserGuid = "4c20a564-9fd4-e111-aa3f-842b2b196315"; var cb_entryCreatedDate = "2012/8/10 15:47:00"; var enableGoogleAd = true; var googletag
= googletag || {}; googletag.cmd = googletag.cmd || [];
原文地址:http://www.cnblogs.com/vowei/archive/2012/08/10/2631949.html
本文地址:蓝色梦想网:http://www.58os.com/BBS/TechBSS/Article-3509.html
TAG标签:

本文来源:https://www.shanpow.com/news/485742/

《uiautomation.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

相关阅读
  • 《中国九年义务教育歌》 《中国九年义务教育歌》
  • 员工作业效率算法说明 员工作业效率算法说明
  • 补入党介绍人证明 补入党介绍人证明
  • 严字当头确保全面从严治党主体责任落地落实 严字当头确保全面从严治党主体责任落地落实
  • 被巡察单位党组工作汇报材料 被巡察单位党组工作汇报材料
  • 疫情防控党课讲稿大全 疫情防控党课讲稿大全
  • 疫情防控事迹材料 疫情防控先进个人事迹材料 疫情防控事迹材料 疫情防控先进个人事迹材料
  • 大学生读书笔记1000字 大学生读书笔记1000字
为您推荐