是否可以使用SpriteKit在应用程序上使用Xcode UI Testing?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以使用SpriteKit在应用程序上使用Xcode UI Testing?相关的知识,希望对你有一定的参考价值。
我想使用SKSpriteKit
对游戏进行UI测试。
由于我的第一次尝试不起作用,我想知道是否可以使用SpriteKit进行Xcode UI测试。
主要思想是为要进行UI测试的元素创建辅助功能材料。那是意味着:
- 列出场景中包含的所有可访问元素
- 配置每个元素的设置,尤其是
frame
data。
一步步
这个答案适用于Swift 3,主要基于Accessibility (Voice Over) with Sprite Kit
假设我想让名为tapMe
的SpriteKit按钮可访问。
List of accessible elements.
在场景中添加UIAccessibilityElement
to数组。
var accessibleElements: [UIAccessibilityElement] = []
Scene's cycle life
我需要更新两种方法:didMove(to:)
and willMove(from:)
。
override func didMove(to view: SKView) {
isAccessibilityElement = false
tapMe.isAccessibilityElement = true
}
由于场景是可访问性控制器,文档声明它必须将False
返回到isAccessibilityElement
。
和:
override func willMove(from view: SKView) {
accessibleElements.removeAll()
}
Override UIAccessibilityContainer methods
涉及3种方法:accessibilityElementCount()
,accessibilityElement(at index:)
和index(ofAccessibilityElement
。请允许我介绍一下我稍后将介绍的initAccessibility()
方法。
override func accessibilityElementCount() -> Int {
initAccessibility()
return accessibleElements.count
}
override func accessibilityElement(at index: Int) -> Any? {
initAccessibility()
if (index < accessibleElements.count) {
return accessibleElements[index]
} else {
return nil
}
}
override func index(ofAccessibilityElement element: Any) -> Int {
initAccessibility()
return accessibleElements.index(of: element as! UIAccessibilityElement)!
}
Initialize accessibility for the Scene
func initAccessibility() {
if accessibleElements.count == 0 {
// 1.
let elementForTapMe = UIAccessibilityElement(accessibilityContainer: self.view!)
// 2.
var frameForTapMe = tapMe.frame
// From Scene to View
frameForTapMe.origin = (view?.convert(frameForTapMe.origin, from: self))!
// Don't forget origins are different for SpriteKit and UIKit:
// - SpriteKit is bottom/left
// - UIKit is top/left
// y
// ┌────┐ ▲
// │ │ │ x
// ◉────┘ └──▶
//
// x
// ◉────┐ ┌──▶
// │ │ │
// └────┘ y ▼
//
// Thus before the following conversion, origin value indicate the bottom/left edge of the frame.
// We then need to move it to top/left by retrieving the height of the frame.
//
frameForTapMe.origin.y = frameForTapMe.origin.y - frameForTapMe.size.height
// 3.
elementForTapMe.accessibilityLabel = "tap Me"
elementForTapMe.accessibilityFrame = frameForTapMe
elementForTapMe.accessibilityTraits = UIAccessibilityTraitButton
// 4.
accessibleElements.append(elementForTapMe)
}
}
- 为
UIAccessibilityElement
创建tapMe
- 计算设备坐标上的帧数据。别忘了
frame
的起源是UIKit的左上角 - 设置
UIAccessibilityElement
的数据 - 将此
UIAccessibilityElement
添加到场景中所有可访问元素的列表中。
现在可以从UI测试角度访问tapMe
。
参考
- Session 406, UI Testing in Xcode, WWDC 2015
- eyes off eyes on — Voiceover accessibility in SpriteKit
- How do I support VoiceOver in a SpriteKit game? | Apple Developer Forums
- swift - Accessibility (Voice Over) with Sprite Kit - Stack Overflow
根据Apple developer forum discussion,目前不可能将UITest与SpriteKit集成:
这可能目前不可能,但可能是这样
更新2017-02-19
根据@ChrisLivdahl的评论,这可以通过使用UIAccessibility - Session 406, UI Testing in Xcode, WWDC 2015来实现。
想法是使元素需要UI Testable。
我根据你的(@ Domsware)真棒答案实现了example project,我已经证实这个技巧对Xcode UI Testing Framework和KIF都有效。
希望这个例子对任何对这个主题感兴趣的人都有帮助:)
以上是关于是否可以使用SpriteKit在应用程序上使用Xcode UI Testing?的主要内容,如果未能解决你的问题,请参考以下文章