iOS开发--检查所有UI对象是否具有可访问性标签/标识符?

3

我正在使用XCode构建iOS应用程序。我目前正在使用去年刚刚添加的框架定义UI测试。在一个示例测试中,我有:

XCUIApplication().segmentedControls["genderSegmentedControl"].buttons["Girl"];

“genderSegementedControl”字符串是由我在相应的视图控制器中定义的辅助功能标签,如下所示:

genderSegmentedControl.accessibilityLabel = "genderSegmentedControl";

我的问题是,我是否有办法编写一个脚本,检查我的所有UI对象并验证它们是否已分配可访问标签?我似乎找不到在Xcode中查看我正在使用的story board内部的位置。我希望能获得所有对象的数组,并通过循环该数组来断言.accessibilityLabel或.accessibilityIdentifier属性非空。
我想这样做是为了验证我是否实际上在测试中包含了所有的UI组件。(类似于代码覆盖率)

这并不是一个全面的解决方案,但我认为它可能会指引你走向正确的方向--> https://dev59.com/H18e5IYBdhLWcg3wd6Q6#32105765 - Adrian
1个回答

2
“UI Objects”可能指的是子视图,因为可以在Storyboard中放置的每个可见元素都是UIView的子类。
在这种情况下,您想要获取ViewController的View的子视图。但是,这样做只会返回第一级UIView,而不是嵌套的UIView。因此,如this answer所建议的那样,您应该使用递归算法。
此功能应递归循环遍历此代码所编写的ViewController的每个UIView的后代:
func checkSubviews(view: UIView) -> Bool {
    if view.accessibilityLabel == nil && view.accessibilityIdentifier == nil {
        return false
    }
    for subview in view.subviews {
        if !checkSubviews(view) {
            return false
        }
    }
    return true
}

现在调用以下函数,如果有任何UIView(包括视图控制器本身的视图)既没有accessibilityLabel也没有accessibilityIdentifier,则应返回false:
checkSubviews(self.view)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接