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 丢失其可访问性标签。
希望这是有道理的。这是我的第一篇文章之一。
我有一个 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 丢失其可访问性标签。
希望这是有道理的。这是我的第一篇文章之一。