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

Posted

技术标签:

【中文标题】在 Xcode UIAutomation 和 Instruments 中使用 Javascript 验证按钮对象的存在【英文标题】:Verifying the existence of a button object using Javascript, in Xcode UIAutomation and Instruments 【发布时间】:2011-03-01 23:02:35 【问题描述】:

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

我希望以太坊中的某个天才能够启发我如何验证在我们的 iOS 应用程序的主窗口上显示名为“哔声”的按钮是否存在?

还有没有人找到任何用 JavaScript 编写测试脚本(相对于动态网页)的好的参考资料?

感谢您的所有帮助!

问候,

史蒂夫·奥沙利文

【问题讨论】:

【参考方案1】:

嘿。 实际上,来自苹果的文档(this 和 this)是我唯一能找到的。 至于你的问题试试

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);

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

顺便说一句apple guide to predicates

附注代码是用记事本编写的,没有经过检查,因此可能包含一些解析错误。

【讨论】:

以上是关于在 Xcode UIAutomation 和 Instruments 中使用 Javascript 验证按钮对象的存在的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Xcode 机器人在模拟器上运行 UIAutomation

在 Xcode Instruments 中,如何导入 UIAutomation 脚本?

我如何在 XCODE 8、Swift 3 中使用 UIAutomation

有人对 Xcode 的 UIAutomation 有经验吗?

连接到 Mac 系统时,使用 Xcode UIAutomation 记录 ios 应用程序上的用户交互