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

原文 标签 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中的错误或更改?

最佳答案

我曾经在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测试 class 的开始将这些定义为全局类:
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)

相关文章:

iphone - 确定iPhone Web应用程序的JavaScript中可用的可用内存?

ios - swift ;导航 Controller 中的多个路径

ios - 不同类别的手势识别器?

iphone - 等待应用内购买商店加载后如何停止uiactivityindicator

ios - 在iOS 7中搜索显示 Controller 。键盘出现时,缺少栏

xcode - 使用Xcode 7 UITest测试元素是否可见

ios - 在UITest中无法找到/单击Apple Pay View 上的任何元素

ios - FaceBook原生广告未在iOS中加载?

ios - xCode-UIVisualEffectView动画

ios - 尝试在Xcode上运行UI测试时出现“模块文件是由较早版本的编译器创建的”消息