从UITests执行UIAccessibilityCustomAction

时间:2019-04-10 18:48:47

标签: ios accessibility xctest xcode-ui-testing uiaccessibility

我有UIView的子类,假设它是class DemoView: UIView { },其中包含UILabel和UIButton。我需要对其进行分组并添加UIAccessibilityCustomAction,因此我已经覆盖了var accessibilityElements: [Any]?并使用并集连接了这两个元素。我还为“ accessibilityLabel”分配了“用户”字符串。

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

问题是我不知道如何从UITests触发此自定义操作。我知道XCUIElement包含UICustomActions的数组,我可以得到它的选择器,但是那又是什么呢?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

iOS 12和Xcode 10当前无法达到的目标。

UITesting框架无法像单元测试那样访问应用程序代码:在UITest中,您无法获取实例来执行选择器+自定义操作的数组为⇒⇒每个自定义操作都无法实现然后根本无法被解雇

XCUITEST的工作归功于accessibilityIdentifier之类的可访问性属性,但并不是绝对适合于VoiceOver (在我看来这是难以理解和难以理解的)

我希望在下一次WWDC上对UI进行一些新的测试,以进行REAL可访问性测试。

答案 2 :(得分:0)

对于坚持这一点的其他人,如果您直接引用了有问题的 UIView,我(好吧,我的一位同事)发现以下“黑客”工作得很好。

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

作为免责声明,这可能仅在您拥有实现其自己的 UIView 的自定义 override var accessibilityElements 子类时才有效。