在我将其作为错误报告提交给Apple之前,我想仔细检查一下我做的事情不是很傻。
我附上了一个演示问题的示例项目。我有两个分段控件,其中一个控件控制另一个控件的启用状态。
https://www.dropbox.com/s/dq2x9srbme4genb/EnabledControlsProblem.zip?dl=0
如果您单击禁用按钮,则会禁用第二个分段控件。
我有一个基本的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中的错误或更改?
答案 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)