• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:47:46 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在我将此作为错误报告提交给 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap