UIAutomation的简单使用方法

时间:2024-03-25 17:30:28

Sample to use UIAutomation
Posted by SunnyRx on January 4, 2016
原文地址:http://sunnyrx.github.io/2016/01/04/sample-to-use-UIAutomation/

UIAutomation是苹果公司发布的一个测试框架,主要用于自动化测试iOS和OS X应用的UI交互情况。它使用了使用灵活、易于扩展的JavaScript作为其主要的脚本语言,可以用使用者快速上手。

本文参考了知平软件Dawson Liu的翻译文《如何使用UIAutomation进行iOS 自动化测试(Part I)》,原文地址是http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation。参考Dawson Liu的翻译文可以更全面了解怎么使用UIAutomation,因为原文是2012年的文章所以有点旧,这里节选其中的一部分内容使用新的Xcode做示范。

UIAutomation是Xcode中测试工具集Instruments中的一个测试工具,因为是内置在Xcode中的所以只要MAC安装了Xcode即可使用。

根据原文,首先下载实例应用程序TestAutomation.xcodeproj,在manbolo的原文中可以找到下载链接是http://blog.manbolo.com/2012/04/08/TestAutomation.zip

打开TestAutomation.xcodeproj后,注意要到Build Setting中设置ios deployment target修改为iOS 4.2以上,如iOS 9.0否则开始编译时会出现以下错误。

ld: -pie can only be used when targeting iOS 4.2 or later 
clang: error: linker command failed with exit code 1 (use -v to see invocation)
UIAutomation的简单使用方法
Build Setting

启动Instruments(Product->Profile),或者按command+i,出现profiling template的选择画面,选择Automation,按Choose进行下一步。

UIAutomation的简单使用方法
Create Profiling

Instruments窗口出现后,按右边的齿轮图标可以看到脚本列表,默认有一个New Script在里面,选中后可以在左边的窗口编辑脚本,下面的按钮执行脚本。

UIAutomation的简单使用方法
Instruments

输入以下代码来完成第一个UIAutomation测试用例

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
target.logElementTree();

按下执行后,如无意外在Editor Log窗口中可以看到执行的日志信息。


UIAutomation的简单使用方法
Run Script

接下来,可以跟着原文学习更多UIAutomation的操作。
这里要提醒的是,原文有一段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 ); 
}

直接执行这段代码会返回issue(或error),提示Cannot perform action on invalid element:UIAElementNil from target.frontMostApp().keyboard().buttons()["return"]。错误在

app.keyboard().buttons()["return"].tap();

这一句,根据在知乎中王欣一个问题回答

通过app.logElementTree();这行可以看到所有的元素,"return"键的真正名称是"Return"

所以只要将上面的代码改为下面的代码即可。

app.keyboard().buttons()["Return"].tap();