isSelected总是返回false

我们最近使用Xcode 8.2.1(8C1002)将Swift 2.3项目更新为Swift 3,现在大部分与tableViews和isSelected属性相关的UI测试都不起作用。 即使选择了对象(我们可以在iOS模拟器中看到它),它总是返回false。

有没有人遇到类似的问题? 在转换之前,我们的代码曾经在Swift 2.3中正常工作。 以下是我们如何检索tableView单元格:

let cell = app.tables.cells.element(at: 4)

注意: app是一个XCUIA app

这里是我们如何检查它是否被选中:

XCTAssert(cell.isSelected)

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

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

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

在BOUNTY END后编辑:由于没有人能够找到解决方案,这显然是Xcode中的一个错误,所以我向苹果公司提交了一个错误报告。 当他们发布Xcode版本的修复程序时,我会在这里发表评论。


我做了一些测试和一些研究。 您可以查看为此目的创建的应用程序>>此处<<。 如果你能检查出来(这需要一点点工作),那将是非常棒的。 还有UI测试来证明它的工作原理。 此外,还有两个选项可供选择,一个是香草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
    }
}

希望能帮助到你。


您是否曾尝试在水龙头前后制作断点,并检查单元格的值? 像这里的WWDC视频:https://youtu.be/7zMGf-0OnoU(从10分钟看)


isSelected仅适用于从UIControl继承的视图。 UIControl.isSelected通知XCUIElement.isSelected

由于UITableViewCell不会从UIControl继承,所以当您观察cell.isSelected时,您在测试cell.isSelected不到您想要的值。

我建议如果你想通过UI测试来测试这个功能,那么你可以向Apple提交一个功能请求,让UIControl成为一个协议,然后你可以扩展你的单元格,或者将UITableViewCell.isSelected添加到通知XCUIElement.isSelected的属性中XCUIElement.isSelected

链接地址: http://www.djcxy.com/p/95829.html

上一篇: isSelected is always returning false

下一篇: Comparing type of literal in swift fails?