在Xcode UIAutomation和Instruments中使用Javascript验证按钮对象的存在

时间:2011-03-01 23:02:36

标签: javascript xcode automated-tests ios-ui-automation

对于我们在iOS 4.2上的项目的质量测试,我们正在通过Xcode 3.x中的Instruments使用UIAutomation。我们用Javascript编写脚本。我是Javascript的新手,并且发现了UIAutomation文档(我该怎么做?),“稀疏”。

我希望以太网中的一些天才可以启发我如何在我们的iOS应用程序的主窗口上显示一个名为“哔声”的按钮时是否存在?

还有没有人在JavaScript中找到编写测试脚本(而不是动态网页)的好参考资料?

感谢您提供的所有帮助!

此致

史蒂夫奥沙利文

1 个答案:

答案 0 :(得分:3)

嘿。
实际上苹果的文档(thisthis)是我唯一能找到的东西 至于你的问题,试试

if(UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0].name() === "beep sound")) {
    UIALogger.logPass("Buton Present");
} else {
    UIALogger.logFail("Buton Not Present");
};

当然,假设( elements()[0] )您的按钮首先位于主窗口下的对象树中。如果不是,您可能需要调用其他元素(( elements()3 ),或者您可能需要更深入地调用层次结构( elements()[0] .elements()3 的)。
请记住,如果链中的某个对象不存在,则上述代码将失败。您可能需要检查链中的每个对象。此外,您可能需要检查给定按钮是否不仅存在,而且是否在屏幕上可见。在这种情况下,上面的代码可能需要如下所示:

if(UAITarget.localTarget().frontMostApplication().mainWindow() && UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0] && UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0].withPredicate("name matches 'beep sound'")) {
    if(UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0].isVisible()) {
        UIALogger.logPass("Buton Present");
    } else {
        UIALogger.logFail("Buton Present, but Not Visible");
    }
} else {
    UIALogger.logFail("Buton Not Present");
};

但现在代码的可读性,可维护性和过度属性受到影响。所以我会把它重构为:

function isButtonWithPredicate (predicate) {
    if(UAITarget.localTarget().frontMostApplication().mainWindow() && UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0] && UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0].withPredicate(predicate)) {
    return true;
} else { 
    throw new Error("button not found, predicate: " + predicate);
}

function getButtonWithPredicate (predicate) {
    try {
        if(isButtonWithPredicate(predicate)) {
            return UAITarget.localTarget().frontMostApplication().mainWindow().elements()[0].withPredicate(predicate);
        }
    } catch (error) {
        throw new Error("getButtonWithPredicateError: " + error.message);
    };
}


var strpredicate = "name matches 'beep sound'";
var objButton = null;
try{
    objButton = getButtonWithPredicate(strPredicate);
    if(objButton.isVisible) {
        UIALogger.logPass("Buton Present");
    };
} catch(error) {
    UIALogger.logFail(error.message);
}

当然你仍然可以改进它......但你应该明白这一点。

btw apple guide to predicates

P.S。代码是用记事本编写的,未经检查,因此可能包含一些解析错误。