通常为自动化工具设置可访问性标识符吗?

时间:2019-03-25 08:53:56

标签: swift xcode accessibility ios-ui-automation ui-testing

我们在项目中有一个要求。我们需要为大约40个视图控制器中的所有组件设置可访问性标识符。我正在考虑如何通过在运行时获取每个视图控制器名称和iboutlet名称来实现这些基本工作,并通过将这些值组合为可访问性ID来生成ID。对于这些,我需要获取IBOutlet的名称。我怎样才能做到这一点 ?还是您有其他选择来以另一种方式来自动化该过程?

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试Sourcery

它能够解析所有源文件并为您提供有关所有控制器的IBOutlets的信息:
您对classes -> variables -> attributes

有兴趣

您可以为所有此类变量didSet块生成内联,您将在其中设置适当的可访问性标识符

答案 1 :(得分:0)

你可以查看这个链接,你会发现一个很好的解决方案来自动设置与变量同名的accessibilityIdentifier

https://medium.com/getpulse/https-medium-com-dinarajas-fixing-developer-inconveniences-ios-automation-e4832108051f

import UIKit

protocol AccessibilityIdentifierInjector {
    func injectAccessibilityIdentifiers()
}

extension AccessibilityIdentifierInjector {
    func injectAccessibilityIdentifiers() {
        var mirror: Mirror? = Mirror(reflecting: self)
        repeat {
            if let mirror = mirror {
                injectOn(mirror: mirror)
            }
            mirror = mirror?.superclassMirror
        } while (mirror != nil)
    }

    private func injectOn(mirror: Mirror) {
        for (name, value) in mirror.children {
            if var value = value as? UIView {
                UnsafeMutablePointer(&value)
                    .pointee
                    .accessibilityIdentifier = name
            }
        }
    }
}

extension UIViewController: AccessibilityIdentifierInjector {}
extension UIView: AccessibilityIdentifierInjector {}

class BaseView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        injectAccessibilityIdentifiers()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        injectAccessibilityIdentifiers()
    }
}

如何使用

class ViewController: BaseViewController {

    let asd1 = BaseView()
    let asd2 = BaseView()
    let asd3 = BaseView()
    let asd4 = BaseView()
    let asd5 = BaseView()
    let asd6 = BaseView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        [asd1, asd2, asd3, asd4, asd5, asd6].forEach {
            print($0.accessibilityIdentifier)
        }
    }


}