在我将此作为错误报告提交给 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 设备上尝试过同样的测试
任何尝试在最后一次检查之前 sleep ,都没有影响。
我所做的是否存在根本性的问题,或者这是我错过的 iOS12 中的错误或更改?
Best Answer-推荐答案 strong>
我曾经在 UI 测试中遇到过相同类型的问题,我发现几乎在所有情况下都有更好的方法,而关键在于所有测试都依赖于 Accessibility Framework。我一直在得到这些奇怪的看似错误的结果。
1.更好的调试
当您使用以下命令时,调试会变得更加容易,它将显示元素的层次结构:
print("Current App Tree: \(app.debugDescription)")
层次结构将帮助您确保元素确实存在以及应用/设备/模拟器如何看到它。
<强>2。使用辅助功能标识符
请了解所有测试都建立在可访问性框架上,而不是照原样查找元素。起初这似乎微不足道,但我发现它让生活变得更加轻松。当所有元素都有一个可访问性标识符时,框架会更快乐。基本上每个 View 都有一个属性:“accessibilityIdentifier”。这将显示在上面列出的应用程序调试中。如果你不设置这个,框架将很难找到你的元素。如果您使用 Storyboard ,这很容易在辅助功能下进行设置。如果您使用的是代码,请按如下方式设置属性:
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)
关于ios - 在 iOS 12 中启用分段控制的 Xcode UI 测试测试失败,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/53231748/
|