ios - iOS 12 中已启用分段控件的 Xcode UI 测试测试失败

标签 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 设备上尝试了同样的测试

在最后一次检查之前任何 sleep 尝试都不会产生影响。

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

最佳答案

我曾经在 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/

相关文章:

ios - 是否不可能将 subview 添加到我的 UITableViewCell 的 contentView 并使其与 contentView 宽度相等?

ios - Xcode 4.2.1 : UIPickerView causing memory leak, 使用 ARC

ios - 如何根据它的前导和尾随设置 UIImageView 的宽度?

xcode - SwiftUI:断言工作表可见

objective-c - IBAction 不会拖到 UISearchBar

ios - 如何将多个对象添加到表格 View 单元格?

swift - UICollectionViewCell 协议(protocol)不起作用

objective-c - 不断检查当前时间

ios - 在使用 Xcode 进行 UI 测试中,如何控制点击 UIButton 以准备下一步操作后的时间

ios - FaSTLane 在运行 UI 测试时扫描 "Failed to synthesize event",在 Xcode 中运行