UI测试 - isSelected始终返回false

时间:2017-03-21 18:48:47

标签: ios swift swift3 xcode-ui-testing

我们最近使用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 = 1isSelected = 1一起使用。没有用。我也尝试在其他问题的答案中使用acessibilityValue,但事实并非如此简单,因为有时表格视图中的项目是以编程方式选择/取消选择的。此外,该方法涉及向应用程序添加测试代码,这不是一个好习惯。

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

5 个答案:

答案 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
    }
}