Automation自动化测试IOS设备

来源:互联网 发布:四选一数据选择器分析 编辑:程序博客网 时间:2024/04/30 03:34

摸索Automation有一段时间了,现简要总结如下:

背景:Automation工具为Mac自带工具,位于Instruments中。

使用:通过USB连接Mac与苹果设备,搜索instruments并打开,双击Automation即可打开其图形化界面,于上方选择target(待测应用)后,即可进行脚本录制、编写、调试等。

感觉使用Automation编写脚本时,最纠结的就是元素定位,遇到不规范不严格的开发就更揪心了,脚本编写调试过程中多用app.logElementTree(),分析打印的控件树信息,方便元素定位。返回的元素多为数组,通过下标、名字或其他属性进行定位。

假设:

var target = UIATarget.localTarget();

var app = target.frontMostApp();

var window = app.mainWindow();

var nvgBar = app.navigationBar();

var tabBar = app.tabBar();

var testApp = app.name();

var commonMsg = "普通信息";

var warningMsg = "警告信息";

var englishOnly = "only input English";

var englishChinessMixed = "mixed 中文输入";


1.消息及执行结果打印——UIALogger

UIALogger.logMessage(commonMsg);

UIALogger.logPass(testApp);

UIALogger.logFail(testApp);

UIALogger.logWarning(warningMsg);

2.文本框输入

app.keyboard().typeString(englishOnly);

window.textFields()[index].setValue(englishChinessMixed);

3.隐藏键盘

app.keyboard().typeString("\n");

app.keyboard().buttons()["搜索"].tap();

4.判断staticText存在与否(不同布局存在差异,以下仅为一种方式)

if (window.elements()["待判断关键字"]) {

    UIALogger.logMessage("存在关键字");

} else {

    UIALogger.logMessage("不存在关键字");

}

5.tableView关键字判断(不同布局存在差异,以下仅为一种方式)

if(window.tableViews()[0].cells()["关键字"].isVisible()) {

    UIALogger.logMessage("存在关键字");

} else {

    UIALogger.logMessage("不存在关键字");

}

6.scrollView控件选取(不同布局存在差异,以下仅为一种方式)

window.scrollViews()[0].button()[1].tap()

某些有name属性的element不可见,故不可tap,无name属性的element只能使用index索引,如上的imagebutton,虽其image有

name属性但不可见,故只能选取button进行tap操作

7.navigationBar关键字判断(不同布局存在差异,以下仅为一种方式)

if(nvgBar.staticTexts()["关键字"].isVisible()) {

    UIALogger.logMessage("关键字存在");

} else {

    UIALogger.logMessage("关键字不存在");

}

注:有时isVisible()不可用,可换用isValid()尝试,虽然有些元素在界面上确实not visible,但是脚本调试可看出isVisible()返回值是true,此种情况可能就是图层覆盖了,可多尝试几种判断方法。

8.tabBar控件选取(不同布局存在差异,以下仅为一种方式)

tabBar.buttons()["关键字"];

9.判断tarBar当前所选控件

var selectedBtn = tabBar.selectedButtons()["关键字"].value();

if (selectedBtn == "关键字") { }

注:有时直接使用上述已定义的nvgBar.***和tabBar.***会出错,换用app.navigationBar().***和app.tabBar().***则正常,尚不明所以……可能还是跟应用不规范有关系。

10.截屏

target.captureScreenWithName("screenshot1.png");

11.旋转

target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT);

UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());

target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);

UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());

12.后台运行再进入(模拟home键)

target.deactivateAppForDuration(int second);

13.处理提示框

忽略所有提示框:

UIATarget.onAlert = function onAlert(alert) {

    var title = alert.name();

    UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");

    return false; // use default handler

}

处理特定提示框,忽略其他提示框:

UIATarget.onAlert = function onAlert(alert) {

    var title = alert.name();

    UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");

    if (title == "Add Something") {

        return true; // bypass default handler

    }

    return false; // use default handler

}

除上述基本方法,还可引进tuneup_js.js拥有更多判断方法,如assertTrue(expression, message)、assertFalse(expression,

message)、assertEquals(expected, received, message)


命令行运行脚本的方法:

(sudo) instruments -w UDID -t/Users/***/**.tracetemplate 应用名 -e UIASCRIPT 脚本路径 -e UIARESULTSPATH 结果路径 -v

说明:

1.网上说不需要sudo,但我的版本一定需要sudo才可用,可能之前的XCode是root安装的。

2.网上看到-t后面的参数只因XCode版本不同而不同,但我在Mac上根本找不到那文件(Automation.tracetemplate),导致一直运行失败,后来该文件是自己使用Automation图形化界面跑一次脚本并保存模板后方才可用。

3.应用名:一般直接写应用名即可,如Test,但有时开发命名不规范导致只写应用名会出现找不到应用的情况,此时跟上后缀.app即可,如Test.app。

4.好处:命令行比图形化界面运行更快速更稳定更高效,唯一不足是打印的控件树没有图形化界面好识别,但我后几次图形化界面总是崩(可能它已经完全被跑崩了……),而命令行还能稳定运行,所以推荐命令行方式。


最后,总结Automation图形化界面的编辑快捷键:

End:Ctrl+E

Home:Ctrl+A

Delete:Ctrl+D

Backspace:Ctrl+H

Copy:Win+C

Paste:Win+V

Cut:Win+X

左移1:Ctrl+B

下移1:Ctrl+N

上移1:Ctrl+P

右移1:Ctrl+F

删除当前行(光标后面数据):Ctrl+K

PgDn:Ctrl+V

Ctrl+Y:恢复粘贴Ctrl+K最后一次删除的数据


tuneup_js.js下载:点击打开链接

苹果官方Automation API:点击打开链接 

更多更详细请参考:点击打开链接  

0 0