在 UIAutomation 中使用accessibilityIdentifier 获取UIElement

Posted

技术标签:

【中文标题】在 UIAutomation 中使用accessibilityIdentifier 获取UIElement【英文标题】:Fetch UIElement by using accessibilityIdentifier in UIAutomation 【发布时间】:2014-08-08 13:58:34 【问题描述】:

我正在使用分析器和 UIAutomation 为我的 ios 应用编写测试。

如何获取我在代码中分配了accessibilityIdentifier 的UIElement?这是我的问题。我有一个在 iPad 和 iPhone 上运行的通用应用程序。这些设备上的视图不同。我有 2 个略有不同的 Xib 文件。在 iPhone 上,我有包含 UILabel 的 ScrollBar。在 iPad 上,我有包含 UIView 的 ScrollBar,其中包含 UILabel。这些标签与同一个 IBOutlet 联系。我已将accessibilityIdentifier 分配给IBOutlet。

如何使用accessibilityIdentifier 从javascript 中获取我的标签?可以在 iPad 和 iPhone 上使用相同的代码完成吗?

类似

var label = target.frontMostApp().mainWindow().elements()["myAccesibilityIdentifier"];
UIALogger.logMessage("Is label valid? " + label.isValid());

结果我得到 标签有效吗?假的

【问题讨论】:

【参考方案1】:

看看 Mechanic (https://github.com/jaykz52/mechanic)。您可以按名称访问元素,它会为您搜索视图层次结构。例如

var label = $('#myAccesibilityIdentifier');

【讨论】:

感谢您的回答。我想知道这是否可以在不使用 3rd 方的东西的情况下解决?我想这个问题很常见。 UI 将与 iPad 和 iPhone 不同,所以我认为 Apple 必须为此提供解决方案。 据我所知,Apple 几乎不强调 UIAutomation。我怀疑他们在内部使用它。它甚至在 iOS 8 中有所改进吗?我没有看到来自 WWDC 的任何消息。 @GrahamPerks,在我个人看来。在 iOS 8 中,UIAutomation 在 iOS 方面实际上变得更糟了。在 WWDC 期间,他们提到了他们对自己的自动化功能感到多么自豪,因为他们在 OSX (Yosemite) 中对自动化任务进行了重大升级。然而,当谈到在 iOS 上运行自动化时,有一些更改没有记录到 Xcode 发行说明中。更改的主要内容是放置了一个模板文件,该文件用于从终端运行 UIAutomation(少数第三方工具依赖于该文件的绝对路径)。以及其他问题。【参考方案2】:

在您的自动化代码中,您可以辨别您正在运行的 iPad 还是 iPhone(示例)

if(target.model()=="iPhone" || target.model() == "iPhone Simulator")

    var phone = true;
    var pad   = false;
    var appName = app.name();
    UIALogger.logMessage("Testing device is: iPhone");
    UIALogger.logMessage("Logger says: " + target.model()); 
    UIALogger.logMessage("Application name: " + appName);
   
else if(target.model() =="iPad" || target.model() == "iPad Simulator")
   
    var phone = false;
    var pad   = true;
    var appName = app.name();
    UIALogger.logMessage("Testing device is: iPad");
    UIALogger.logMessage("Logger says: " + target.model());
    UIALogger.logMessage("Application name: " + appName);

根据我在示例中设置的变量 phone/pad,您可以指示您的脚本如何找到您要查找的元素。

if(phone)

    //var label = Path to element (phone)

else if(pad)

    //var label = Path to element (pad)

我知道同时使用 pad/phone 是多余的,但我最初这样做是为了安全,以防将来第三种类型混入 iOS 开发中(以防万一;))。

【讨论】:

以上是关于在 UIAutomation 中使用accessibilityIdentifier 获取UIElement的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIAutomation 中使用节点模块

如何在 UIAutomation 中从句子中取出特定的单词?

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

使用 UIAutomation 的仪器出现意外错误

如何使用 Jenkins 运行 UIAutomation?

UIAutomation 和在滚动视图中读取静态文本