2021 年初更新
使用 SpriteKit、SwiftUI App 和 Swift 5.4 测试的更短的解决方案
在使用 XCUI 测试时,早期的方法似乎不再适用。我的应用程序的基础是一个以SKScene 作为主视图的 SwiftUI 应用程序。为了让它工作,它实际上非常简单,我工作所需的步骤要少得多。
1.通过在didMove() 方法中仅添加一行来停用场景的可访问性
override func didMove(to view: SKView) {
isAccessibilityElement = false
}
如Dominique Vial's answer中所述
2。使您的节点符合 UIAccessibilityIdentification 协议
class YourNode: SKSpriteNode, UIAccessibilityIdentification {
var accessibilityIdentifier: String?
//...
}
提到here
UI 测试需要访问的任何节点都需要符合此协议。 更新扩展,而不是对我现在使用的每个节点进行子类化。
3.分配accessibilityIdentifier 并激活节点对象的可访问性。
let yourNode = YourNode()
yourNode.isAccessibilityElement = true
yourNode.accessibilityIdentifier = "nodeID"
4.就是这样!运行你的测试!
func testingNodes() throws {
app = XCUIApplication()
app.launch()
let node = app.otherElements["nodeID"]
XCTAssert(node.waitForExistence(timeout: 1))
}
5.可选:设置accessibilityTraits
yourNode.accessibilityTraits = [.button, .updatesFrequently]
let nodeAsButton = app.buttons["nodeID"]
您可以设置特定的 trait,例如 .button 来告诉无障碍 API 您的节点是什么。这对于在测试期间更好地区分您的节点很有用,而且如果您计划为用户实现实际的辅助功能,那么应该正确设置它以使其工作。
更新 1 - 使用扩展:
我现在使用SKNode 上的以下扩展,而不是对节点进行子类化。我现在只设置accessibilityLabel 不再是accessibilityIdentifier
extension SKNode: UIAccessibilityIdentification {
public var accessibilityIdentifier: String? {
get {
super.accessibilityLabel
}
set(accessibilityIdentifier) {
super.accessibilityLabel = accessibilityIdentifier
}
}
}
更新 2 - 使 SKScene 的所有后代都可以访问
为了让节点及其所有后代都可以访问,我最终在 SKNode 上使用了以下扩展。这会将每个节点添加到场景的accessibilityElements。
extension SKNode: UIAccessibilityIdentification {
public var accessibilityIdentifier: String? {
get {
super.accessibilityLabel
}
set(accessibilityIdentifier) {
super.accessibilityLabel = accessibilityIdentifier
}
}
func makeUITestAccessible(label: String, traits: UIAccessibilityTraits) {
accessibilityLabel = label
isAccessibilityElement = true
accessibilityTraits = traits
if let scene = scene {
if scene.accessibilityElements == nil {
scene.accessibilityElements = [self]
} else {
scene.accessibilityElements?.append(self)
}
}
}
}