如何使用 XCUITest 查询 SwiftUI 表格单元格

Posted

技术标签:

【中文标题】如何使用 XCUITest 查询 SwiftUI 表格单元格【英文标题】:How does one query SwiftUI table cells using XCUITest 【发布时间】:2021-09-08 18:23:06 【问题描述】:

我开始在我的 UIKit 项目中包含一些 SwiftUI 代码。 UIKit 项目使用XCUITest 进行 UI 测试,您可能知道,它可以查询 UI 树下的元素,甚至可以使用标识符来缩小找到的元素范围。

我已将所有可访问性标识符、提示、标签和值移至 SwiftUI 组件。

就我而言,我有一个 UITableView,现在是一个 SwiftUI List。在我的 UI 测试中,我会像这样查询UITableView

let app = XCUIApplication()

let tableCells = app.table.cells["MyCellIdentifier"]

然而,虽然这在 SwiftUI 中有效,但在 SwiftUI 的 List 中不再有效。我知道 SwiftUI 几乎隐藏了更多关于它如何构建其 UI 的实现细节,它甚至可能不是一个表视图,但它的外观和行为确实像我之前使用的 UITableView

有谁知道如何在 SwiftUI 中使用 XCUITest 正确测试表格视图(列表),或者为什么它不适用于现有的测试代码?

如下所示,示例代码显示我向RowView 添加了一个可访问性标识符,但对于可访问性,它被传递到Text 视图(可访问性树中的StaticText)。

【问题讨论】:

这听起来不对。查询使用 SwiftUI 构建的表格或单元格应该没有区别。你的debugDescription 显示了什么? @MikeCollins,好主意!我没有想过要尝试,所以我就这样做了。不过这很奇怪。根据我如何组合元素,它似乎产生了与我所期望的不同的东西。例如,我在“单元格”中的两个文本标签具有单独的可访问性标识符,但是它们被删除,因为它包含的 VStack 使用.accessibilityElement(children: .combine)。此外,似乎没有办法将标识符添加到容器单元格,它总是转到其类型为“其他”的直接子代。 您能否通过获取otherElement 的父级staticTexts 来识别您的单元格? 【参考方案1】:

SwiftUI 中有一个修饰符:

func accessibilityIdentifier(_ identifier: String) -> ModifiedContent<Self, AccessibilityAttachmentModifier>

如果你像这样将它添加到你的 View 元素中:

.accessibility(identifier: ["MyCellIdentifier")

它将暴露给XCUITests

【讨论】:

我忘了提到相同的标志已移至 SwiftUI 代码。我的问题是,即使不使用 SwiftUI 中的标志,像 let tableCells = app.table.cells 这样的通用查询似乎也不起作用。

以上是关于如何使用 XCUITest 查询 SwiftUI 表格单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中的 ActionSheet 上设置辅助功能标识符

XCUITest - 如何在应用程序运行时禁用 Wi Fi?

如何使 UIControl 在 XCUITest 中显示为按钮?

如何暂停 XCUITest 以进行手动模拟器操作?

如何打印 XCUITest 中的所有静态文本

如何使用 XCUITest 检查应用程序中添加的启动图像? [关闭]