Xcode UITesting测试启用的分段控件在iOS12中失败

时间:2018-11-09 18:53:34

标签: ios xcode xcode-ui-testing

在我将其作为错误报告提交给Apple之前,我想仔细检查一下我做的事情不是很傻。

我附上了一个演示问题的示例项目。我有两个分段控件,其中一个控件控制另一个控件的启用状态。

https://www.dropbox.com/s/dq2x9srbme4genb/EnabledControlsProblem.zip?dl=0

enter image description here

如果您单击禁用按钮,则会禁用第二个分段控件。

enter image description here

我有一个基本的UI测试,可以复制此行为,其构造如下:

    XCTAssertTrue(app.segmentedControls.buttons["Enabled"].exists)
    XCTAssertTrue(app.segmentedControls.buttons["Enabled"].isSelected)
    XCTAssertTrue(app.segmentedControls.buttons["First"].exists)
    XCTAssertTrue(app.segmentedControls.buttons["First"].isSelected)
    XCTAssertFalse(app.segmentedControls.buttons["Second"].isSelected)
    XCTAssertTrue(app.segmentedControls.containing(.button, identifier: "First").firstMatch.isEnabled)
    app.segmentedControls.buttons["Disabled"].tap()
    XCTAssertFalse(app.segmentedControls.containing(.button, identifier: "First").firstMatch.isEnabled)`

如果您在iOS 11.4设备上运行此测试,则它将按我认为的方式运行并成功。但是,如果我切换到iOS 12.1模拟器设备,则测试在最后一行失败(正在检查是否启用了第二个控件)。控件的外观在视觉上会发生变化。我还在运行12.0的实际iPhone设备上尝试了相同的测试

任何尝试在最后一次检查之前睡觉的方法,都没有改变。

我所做的工作是否存在根本性的错误,或者是我错过的iOS12中的错误或更改?

1 个答案:

答案 0 :(得分:0)

我曾经在UI测试中遇到过相同类型的问题,并且在几乎所有情况下都发现了一种更好的方法,而这正是所有测试都依赖于Accessibility Framework的关键所在。我一直在获得这些看似越野车的怪异结果。

1。更好的调试

使用以下命令可以使调试更加容易,该命令将显示元素的层次结构:

print("Current App Tree: \(app.debugDescription)")

层次结构将帮助您确保该元素确实存在以及应用程序/设备/模拟器如何查看它。

2。使用辅助功能标识符

了解所有测试均基于可访问性框架,而不是像现在那样查找元素。起初这似乎微不足道,但是我发现它使生活变得更加轻松。当所有元素都具有可访问性标识符时,该框架会更加快乐。基本上,每个视图都有一个属性:“ accessibilityIdentifier”。这将显示在上面列出的应用程序调试中。如果不设置此项,框架将很难找到您的元素。如果您使用的是情节提要,则可以在“辅助功能”下轻松设置。如果您使用的是代码,请按如下所示设置属性:

myView.accessibilityIdentifier = "Enable State Selection"

然后在UI测试中,您可以找到如下所示的元素:

app.buttons.matching(identifier: "Enable State Selection").element

在您的特定情况下,它看起来像是分段控件中涉及的某种UI组的一部分。我将进行如下两步查找:

myUIGroup.accessibilityIdentifier = "Controls"

然后您可以进行两步查找,如下所示:

let controlsView = app.segmentedControls.matching(identifier: "Controls").element
let enabledButtons = controlsView.buttons.matching(identifier: "Enable State Selection").element
XCTAssert(enabledButtons.exists)

总体而言,我发现您在UI测试类的开始将它们定义为全局类:

let app = XCUIApplication()
lazy var controlsView = app.segmentedControls.matching(identifier: "Controls").element
lazy var enabledButtons = controlsView.buttons.matching(identifier: "Enable State Selection").element

然后在您的测试函数中,代码非常干净,并且很简单:

XCTAssert(enabledButtons.exists)