首页 > 解决方案 > iOS UI 测试 - UILabel *with* accessibilityIdentifier 找不到

问题描述

我有一个UIViewController在界面生成器中设计的具有相应视图的子类。在界面生成器中,我在两个标签上设置了可访问性标识符,并Accessibility为两者启用了一项功能。

我想在代码中定义我的应用程序流程,所以我通过let vc = storyboard.instantiateViewController(withIdentifier: storyboardIdentifier) as? MyVC而不是通过在 IB 中定义 segues 来加载 VC。

viewDidLoad中,我可以确认.accessibilityIdentifier 设置。

然而,在我的测试中,找不到元素。这总是返回 false:

let app = XCUIApplication()
app.staticTexts["myIdentifier"].waitForExistence(timeout: 10)

如果我继续打印视图层次结构:

print(app.debugDescription)

 →Application, 0x280e55960, pid: 1609, label: 'My App'
    Window (Main), 0x280e55a40, {{0.0, 0.0}, {320.0, 568.0}}
      Other, 0x280e55c00, {{0.0, 0.0}, {320.0, 568.0}}
        NavigationBar, 0x280e55ce0, {{0.0, 20.0}, {320.0, 44.0}}, identifier: 'Thing'
          Button, 0x280e55ea0, {{0.0, 20.0}, {62.0, 44.0}}, label: 'Back'
          Other, 0x280e55f80, {{130.5, 32.0}, {59.5, 20.5}}, label: 'Thing'
        Other, 0x280e56060, {{0.0, 0.0}, {320.0, 568.0}}
          Other, 0x280e56140, {{0.0, 0.0}, {320.0, 568.0}}
            Other, 0x280e56220, {{0.0, 0.0}, {320.0, 568.0}}
              Other, 0x280e56300, {{0.0, 64.0}, {320.0, 504.0}}
                Image, 0x280e563e0, {{0.0, 248.0}, {320.0, 320.0}}, identifier: 'imageName'

我没有设置标识符Image-UIImage(named: "imageName")已经自动完成了。感兴趣的标签是Image(即 的孙子Other, 0x280e56300)的兄弟姐妹的后代

我已经阅读了各种指南(12)并相信我正在做我应该做的一切,但这些元素仍然隐藏在测试框架中。

编辑添加:

由于被测试的应用程序在一个单独的进程中,我添加了一个UIAlertController来确认.accessibilityIdentifier感兴趣的标签的父视图出现在由 UI 测试机制驱动的上下文中 - 它们肯定是设置的,但是测试框架可以见不到他们。

标签: iosswiftuilabelxcode-ui-testing

解决方案


一步一步地煞费苦心地重新创建了视图,并确认他们.accessibilityIdentifier在此过程中的每一步都可以找到元素,这是对UIStackView“破碎”事物的最终包装。

也就是说,虽然一切都适用于这个视图层次结构:

+ View
  Safe Area
  + View
    + Stack view
      Label
      Label (with identifier)
    + Stack view
      Label
      Label (with identifier)
  Image View

将普通视图和图像视图包装在另一个堆栈视图中以实现此目的:

+ View
  Safe Area
  + Stack view      <-- problematic stack view
    + View
      + Stack view
        Label
        Label (with identifier)
      + Stack view
        Label
        Label (with identifier)
    Image View

……弄坏了东西。回溯一步并以不同的方式实现相同的包装并没有破坏可访问性。

Broke:在视图层次结构树中选择 View 和 Image View,然后从编辑器窗格中的图标中选择 embed in stackview。

没有中断:在设计器中选择视图和图像视图,然后从编辑器窗格中的图标中选择嵌入堆栈视图。

我意识到这是一个非常有趣的答案(并且已经为此浪费了半天多的时间,我无意再次打破它!),但似乎是在嵌入堆栈之前选择视图的方式观点有所作为。


推荐阅读