IOS 自动化 2-UI Automation-功能测试

本文介绍了iOS自动化测试中的UI Automation,包括常用操作如点击、拖曳,如何输出测试信息,处理弹框的策略,以及一个具体的脚本示例。此外,还推荐了学习资源帮助深入理解。

1. 常用操作

UI Automation提供了非常多的接口来模拟UI操作,如点击、双击、双指缩放、拖曳等。

单击。根据输入的绝对坐标点击屏幕。

UIATarget.localTarget().tap({x:100, y:200});

双击。根据输入的绝对坐标双击屏幕。

UIATarget.localTarget().doubleTap({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});

除了根据绝对坐标进行操作,我们也可以先取得控件,然后进行相应的操作。当然,前提是这个控件是存在、有效且可见的。根据控件模拟操作要特别小心,因为有时候控件会被其他控件挡住,控件还没被加载出来,或者突然出现了弹框导致无法操作控件。

var addButton = UIATarget.localTarget().frontMostApp().navigationBar().buttons()["Add"];

if(addButton.isValid() && addButton.isVisible()){

    addButton.tap();

}

如果你还不熟悉UI Automation的接口,那么录制功能将给你带来极大的便利,它会记录下你每次操作的步骤,生成相应的代码。使用方法见UI Automation教程

 

2. 输出测试信息

我们希望编写的测试脚本能包含尽可能多的信息,以便于发现和分析可能出现的错误,而记录信息最简单有效的方式就是编写Case。下面看一个Case。

var testName = "Module 001 Test";

UIALogger.logStart(testName);

//一些测试代码

UIALogger.logPass(testName);

UIALogger是一个用于记录测试信息的工具类,我们调用它的logStart函数开始一项测试,并为测试项命名。因此,上面这个Case的名称就是"Module 001 Test"。在运行一段测试代码后,我们用logPass或logFail结束一项测试,记录测试结果(成功或失败)。

我们还可以用logMessage输出一些信息,类似于Java或C里的print。下面的Case就使用了logMessage,它用起来更自由、方便;并用captureScreenWithName截图,记录当时的状态。除此之外,UIALogger工具类还提供了更多的函数如logError, logWarning等,具体用法参见UIALogger

var testName = "Module 001 Test";

UIALogger.logStart(testName);

//一些测试代码

UIALogger.logMessage("Starting Module 001 branch 2, validating input.");

//截一张图,以给定的参数命名

UIATarget.localTarget().captureScreenWithName("SS001-2_AddedIngredient");

//更多测试代码

UIALogger.logPass(testName);

 

3. 处理弹框

UI Automation提供了一个函数接口onAlert来处理弹框,当弹框出现时,将调用这个函数。接下来,我们编写一个非常简单的弹框处理函数。

UIATarget.onAlert = function onAlert(alert) {

    var title = alert.name();

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

    // 返回false,使用默认处理方式

    return false;

}

这个函数使用logWarning记录了弹框的名称,最后返回false,这将意味着点击默认按钮来关闭弹框。例如,当收到一条短信时,这个函数执行的操作是点击“关闭”按钮,从而关闭弹框。

如果弹框是app内部产生的,并且我们知道它的确切的名字,那么我们可以执行一些预期的操作,而不仅仅是关闭弹框。下面的代码为一个特定的弹框执行了点击“Continue”按钮的操作,并返回true,当然前提是我们确定“Continue”按钮是存在的。

UIATarget.onAlert = function onAlert(alert) {

    var title = alert.name();

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

    if (title == "The Alert We Expected") {

        alert.buttons()["Continue"].tap();

        return true;  //弹框已处理

    }

    //若返回false,则使用默认处理方式

    return false;

}

 

4. 脚本示例

下面以“开源中国”app为例,编写一个登陆脚本。点击这里下载测试应用和脚本。

var target = UIATarget.localTarget();  //UIATarget是最上层的类,表示真实设备或模拟器    

try{

    target.delay(3); //等待3秒,跳过开场动画

    UIALogger.logStart("test 1"); //第1个Case

    UIALogger.logMessage("开始第一个测试");

    var leftButton = target.frontMostApp().navigationBar().leftButton();  //取得导航栏的左侧按钮

    leftButton.tap(); //点击

    var techCell = target.frontMostApp().mainWindow().tableViews()[0].cells()["技术问答"];  //取得第一个cell

    if (techCell.isValid() && techCell.isVisible()) {

        UIALogger.logPass("find 技术问答");

    } else {

        UIALogger.logFail("cannot find 技术问答");

    }

    UIALogger.logStart("test 2"); //第2个Case

    UIALogger.logMessage("开始第二个测试"); 

    target.frontMostApp().mainWindow().buttons()[0].tap();

    target.delay(1); //等待动画结束

    target.frontMostApp().tabBar().buttons()["我"].tap();

    target.delay(1); //等待动画结束

    target.frontMostApp().mainWindow().tableViews()[1].cells()["消息"].tap();

    target.delay(1); //等待动画结束

    var loginButton = target.frontMostApp().mainWindow().buttons()["登录"];

    if(loginButton.isValid() && loginButton.isVisible()){ //如果登陆按钮有效且可见,则表示用户未登录,接下来尝试登陆

        var textField = target.frontMostApp().mainWindow().textFields()[0];

        var secureTextField = target.frontMostApp().mainWindow().secureTextFields()[0];

        textField.tap();

        textField.setValue("username"); //输入用户名

        target.delay(0.5);

        secureTextField.tap();

        secureTextField.setValue("password"); //输入密码

        target.delay(0.5);

        loginButton.tap();

        target.delay(3);

        if(loginButton.isValid() && loginButton.isVisible()){    

            UIALogger.logFail("登陆失败");

        }else{

            UIALogger.logPass("登陆成功");

        }

    }else{

        UIALogger.logPass("用户已经登陆");

    }

}catch(err){

    UIALogger.logError(err.toString());

}

 

5. 学习资料

如果希望学习更多有关JavaScript脚本编写和UI Automation框架的内容,请参考下面的资料。

a. 《UI Automation JavaScript Reference for iOS》,UI Automation官方文档,里面有详实的API介绍

b. 《Automate UI Testing in iOS》,UI Automation入门教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值