首页 > 解决方案 > 一般为自动化工具设置可访问性标识符?

问题描述

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

谢谢。

标签: swiftxcodeaccessibilityios-ui-automationui-testing

解决方案


你可以检查这个链接,你会找到一个很好的解决方案来自动设置具有相同名称的变量的可访问性标识符

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)
        }
    }


}

推荐阅读