iOS UI 测试 - UI 找不到标签 *with* accessibilityIdentifier

iOS UI testing - UILabel *with* accessibilityIdentifier cannot be found

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

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

viewDidLoad 中,我可以确认 .accessibilityIdentifier 集。

然而,在我的测试中,找不到这些元素。这总是 returns 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 的孙子)

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

编辑添加:

由于正在测试的应用程序处于单独的进程中,因此当它们的父视图出现在由UI 测试机制-它们肯定是设置的,但是测试框架看不到它们。

一步一步地煞费苦心地重新创建视图,确认在整个过程中的每一步都可以通过它们的 .accessibilityIdentifier 找到元素,这是 UIStackView 中的最终包装 "broke" 东西.

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

+ 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

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

中断:在视图层次结构树中选择视图和图像视图,然后从编辑器窗格的图标中选择嵌入堆栈视图。

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

我意识到这是一个非常有趣的答案(并且为此浪费了半天多的时间,我无意再回去打破它!),但似乎是先选择视图的方式嵌入堆栈视图会有所不同。

我 运行 在使用文档大纲中的层次结构树将文本字段和 UILabel 嵌入堆栈视图后遇到了类似的问题。这样做会导致 UILabel 可访问性标签返回 nil,即使它有一个值。如果我以编程方式设置其辅助功能标签,那么它会返回一个值。

此外,如果我在故事板中添加一个新的 UILabel(并设置其辅助功能标签),在堆栈视图之外,然后构建应用程序,两个 UILabel 的辅助功能标签都有值。然后,我可以删除第二个 UILabel,而不会使原始 UILabel 丢失其可访问性标签。

希望这是有道理的。这是我的第一篇文章之一。