从 UITests 执行 UIAccessibilityCustomAction

Performing UIAccessibilityCustomAction from UITests

我有一个 UIView 的子类,假设它是 class DemoView: UIView { },其中包含 UILabel 和 UIButton。我需要对其进行分组并添加 UIAccessibilityCustomAction,因此我覆盖了 var accessibilityElements: [Any]? 并使用联合来连接两个元素。我还将 "Users" 字符串分配给 accessibilityLabel.

从用户的角度来看,这正常工作,VoiceOver 读取 Users,然后用户可以 select 自定义操作,名为 Edit

问题是我不知道如何从 UITests 触发这个自定义操作。我知道 XCUIElement 包含 UICustomActions 的数组,我可以得到它的 select 或者但是然后呢?

目前 iOS13 和 Xcode 11.

无法实现您想要达到的目的

UI测试框架不像单元测试那样访问应用程序代码:您无法获得执行选择器的实例 + 在 UI 中自定义操作数组为 nil测试 ⇒ 每个 自定义操作都无法访问,然后根本无法触发

XCUITEST 的工作得益于像 accessibilityIdentifier 这样的可访问性属性,但绝对不是为了简单地为 VoiceOver 工作而设计的 (在我看来不可思议和难以理解).

我希望在下一届 WWDC 期间引入一些新的 UI 测试,以进行真正的可访问性测试。

我在 WWDC19 辅助功能和测试实验室期间与 Apple 工程师交谈过,他们说现在不可能。测试期间无法访问的原因是出于安全考虑。他们还说他们不使用 UITests 来测试 UIAccessibility 并且在创建可访问性元素时支持两种情况 - 有 UITests 运行 和没有。

我建议使用 Feedback Assistant 提出建议。

对于其他坚持这一点的人,如果您直接参考了所讨论的 UIView,我(好吧,我的一个同事)发现以下 'hack' 非常有效嗯

let view: UIView = YourViewWithCustomAction()
let customActionName: String = "<Your custom action name here>"
let action: UIAccessibilityCustomAction = view.accessibilityCustomActions!.first(where: { [=10=].name == customActionName })!
_ = action.target!.perform(action.selector, with: action)

作为免责声明,这可能仅在您具有实现其自己的 override var accessibilityElements.

的自定义 UIView 子类时才有效