OGeek|极客世界-中国程序员成长平台

标题: ios - 在 iOS 12 中启用分段控制的 Xcode UI 测试测试失败 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 20:47
标题: ios - 在 iOS 12 中启用分段控制的 Xcode UI 测试测试失败

在我将此作为错误报告提交给 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 中的错误或更改?



Best Answer-推荐答案


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






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4