我们最近使用Xcode 8.2.1(8C1002)将Swift 2.3项目更新到Swift 3,现在我们与tableViews和isSelected属性相关的大多数UI测试都无法正常工作。它总是返回false,即使选择了对象(我们可以在iOS模拟器中看到它)。
有没有人遇到过类似的问题?我们的代码曾经在转换之前在Swift 2.3中正常工作。以下是我们检索tableView单元格的方法:
let cell = app.tables.cells.element(at: 4)
注意: app
是XCUIApplication。
以下是我们检查它是否被选中的方式:
XCTAssert(cell.isSelected)
另一个观察是我们确定该对象存在,因为waitForExpectations
返回true:
let existsPredicate = NSPredicate(format: "exists = 1")
expectation(for: existsPredicate, evaluatedWith: cell, handler: nil)
waitForExpectations(timeout: 20, handler: nil)
编辑:为了替换isSelected
,我尝试将NSPredicate与selected = 1
和isSelected = 1
一起使用。没有用。我也尝试在其他问题的答案中使用acessibilityValue
,但事实并非如此简单,因为有时表格视图中的项目是以编程方式选择/取消选择的。此外,该方法涉及向应用程序添加测试代码,这不是一个好习惯。
在BOUNTY END之后编辑:由于没有人能找到解决该问题的解决方案,这显然是Xcode中的一个错误,我已向Apple提交了错误报告。当他们发布带有修复的Xcode版本时,我会在这里发表评论。
答案 0 :(得分:6)
我做了一些测试和一些研究。您可以查看为此目的创建的应用>>here<<。如果你能把它检查出来会很棒(它需要一些工作)。还有用于证明其有效的UI测试。此外,还有两个选项,一个是vanilla XCTest,另一个是我和同事AutoMate创建了很多帮助的库。但那不是重点。
这是我发现的:
1)isSelected
的{{1}}属性取决于XCUIElement
。要在XCTest中选择的元素必须设置accessibilityTrait
。
2)我无法重现您的问题,但我能够控制UIAccessibilityTraitSelected
财产。
3)是的,它需要一些代码,但如果对你来说很重要,它应该与VoiceOver一起使用。
所有必需的代码都在您的自定义isSelected
子类中。并使用覆盖UITableViewCell
UIAccessibilityElement
属性。
accessibilityTraits
希望它有所帮助。
答案 1 :(得分:0)
您是否尝试在点击前后制作断点,并检查单元格的值?就像这里的WWDC视频一样:https://youtu.be/7zMGf-0OnoU (见10分钟)
答案 2 :(得分:0)
isSelected
仅适用于从UIControl
继承的视图。 UIControl.isSelected
通知XCUIElement.isSelected
。
由于UITableViewCell
未从UIControl
继承,因此当您观察cell.isSelected
时,您未在测试中看到所需的值。
我建议如果您希望通过UI测试来测试它,那么您向Apple提交功能请求以使UIControl
成为协议,然后您可以扩展您的单元格以符合或添加{{1通知UITableViewCell.isSelected
的属性。
答案 3 :(得分:0)
@dzoanb解决方案可以在不添加私有var的情况下工作:
override var accessibilityTraits: UIAccessibilityTraits {
get {
if isSelected {
return super.accessibilityTraits | UIAccessibilityTraitSelected
}
return super.accessibilityTraits
}
set {
super.accessibilityTraits = newValue
}
}
答案 4 :(得分:0)
无法在Swift 4下编译该代码。 这对我有用。
public override var accessibilityTraits: UIAccessibilityTraits {
get {
if isSelected {
return super.accessibilityTraits.union(.selected)
}
return super.accessibilityTraits
}
set {
super.accessibilityTraits = newValue
}
}