UI测试 - isSelected始终返回false

vit*_*rmm 8 ios swift xcode-ui-testing swift3

我们最近使用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)
Run Code Online (Sandbox Code Playgroud)

注意: app是XCUIApplication.

这是我们检查它是否被选中的方式:

XCTAssert(cell.isSelected)
Run Code Online (Sandbox Code Playgroud)

另一个观察是我们确定该对象存在,因为waitForExpectations它返回true:

let existsPredicate = NSPredicate(format: "exists = 1")
expectation(for: existsPredicate, evaluatedWith: cell, handler: nil)
waitForExpectations(timeout: 20, handler: nil)
Run Code Online (Sandbox Code Playgroud)

编辑:为了替换isSelected,我尝试使用NSPredicate selected = 1isSelected = 1.没有用.我也尝试使用acessibilityValue基于其他问题的答案,但它并不那么简单,因为有时我的表视图中的项目是以编程方式选择/取消选择的.此外,该方法涉及向应用程序添加测试代码,这不是一个好习惯.

在BOUNTY END之后编辑:由于没有人能找到解决该问题的解决方案,这显然是Xcode中的一个错误,我已向Apple提交了错误报告.当他们发布带有修复的Xcode版本时,我会在这里发表评论.

小智 6

我做了一些测试和一些研究.您可以查看为此目的创建的应用程序>> here <<.如果你能把它检查出来会很棒(它需要一些工作).还有用于证明其有效的UI测试.此外,还有两个选项,一个是vanilla XCTest,另一个是我与同事AutoMate一起创建的帮助程序库.但那不是重点.

这是我发现的:

1)isSelected财产XCUIElement取决于accessibilityTrait.要在XCTest中选择的元素必须已UIAccessibilityTraitSelected设置.

2)我无法重现你的问题,但我能够控制isSelected财产.

3)是的,它需要一些代码,但如果对你来说很重要,它应该适用于VoiceOver.

所有必需的代码都在您的自定义UITableViewCell子类中.并使用压倒性的UIAccessibilityElement accessibilityTraits财产.

private var traits: UIAccessibilityTraits = UIAccessibilityTraitNone

// MARK: UITableViewCell life cycle
override func awakeFromNib() {
    super.awakeFromNib()
    traits = super.accessibilityTraits
}

// MARK: UIAccessibilityElement
override var accessibilityTraits: UIAccessibilityTraits {
    get {
        if isSelected {
            return traits | UIAccessibilityTraitSelected
        }
        return traits
    }

    set {
        traits = newValue
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.