如何使用XCUITest查询SwiftUI List单元格?原有UITableView查询逻辑失效?
原有测试代码失效原因
SwiftUI List的底层渲染实现在不同系统版本存在差异:iOS 15及更早版本基于UITableView封装,iOS 16及之后版本改为默认基于UICollectionView实现,原有基于app.tables的固定类型查询自然无法匹配到新版本的列表元素。
另外你遇到的标识符透传问题,是因为SwiftUI默认不会把普通自定义视图识别为独立的无障碍节点,你给RowView添加的无障碍标识符会默认向下透传给内部的可交互子元素(比如示例里的Text),所以你查询Cell类型元素的时候找不到对应标识符的节点。
正确的适配测试方案
- 首先修正SwiftUI侧的无障碍配置,给行元素添加
accessibilityElement(children: .combine)修饰符,强制把RowView识别为独立的无障碍节点,绑定的标识符不会再透传给子元素:
struct RowView: View { var body: some View { // 你的行内容布局 Text("行内容") .accessibilityIdentifier("MyCellIdentifier") // 新增如下修饰符 .accessibilityElement(children: .combine) } }
- 调整XCUITest查询逻辑,放弃固定类型的
cells/tables查询,改用通用适配的写法:- 先给整个List添加专属的无障碍标识符,缩小查询范围提升稳定性:
List { // 所有行内容 } .accessibilityIdentifier("TargetList")- 测试代码查询逻辑调整为:
let app = XCUIApplication() // 先定位到目标列表 let targetList = app.otherElements["TargetList"] // 直接查询对应标识符的行元素,适配所有系统版本的底层实现 let targetCell = targetList.descendants(matching: .any)["MyCellIdentifier"] - 调试小技巧:如果元素查询始终失败,可以在测试断点处执行
po app.debugDescription打印当前完整的UI无障碍树,确认元素的类型和标识符是否符合预期。
内容的提问来源于stack exchange,提问作者Mario A Guzman
相关产品推荐
相关产品推荐

