ios - 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
)的兄弟姐妹的后代
我已经阅读了各种指南(1、2)并相信我正在做我应该做的一切,但这些元素仍然隐藏在测试框架中。
编辑添加:
由于被测试的应用程序在一个单独的进程中,我添加了一个UIAlertController
来确认.accessibilityIdentifier
感兴趣的标签的父视图出现在由 UI 测试机制驱动的上下文中 - 它们肯定是设置的,但是测试框架可以见不到他们。
解决方案
一步一步地煞费苦心地重新创建了视图,并确认他们.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。
没有中断:在设计器中选择视图和图像视图,然后从编辑器窗格中的图标中选择嵌入堆栈视图。
我意识到这是一个非常有趣的答案(并且已经为此浪费了半天多的时间,我无意再次打破它!),但似乎是在嵌入堆栈之前选择视图的方式观点有所作为。
推荐阅读
- jquery - 如何通过远程命令执行方法来重置数据表过滤器?
- salesforce - 是否可以向文档动态添加可更新的自定义标签?
- java - java.util.NoSuchElementException 即使 hasMOreTokens 包括在内
- xcode - Xcode 10,UI 元素在哪里?
- ios - 无法从文本字段中获取字符串变量以传递给邮件按钮功能
- html - 将 img 放在两个 div 的边界上
- azure-active-directory - 401 Unauthorized on Graph and OneNote API 获取token成功后
- java - how to extenalize db connection stuff
- javascript - Http Get- Gat an object from web api
- oauth-2.0 - 为什么 IdentityServer4 演示应用程序的隐式客户端流程会向我发回与 id_token 相同的 access_token?