SwiftUI应用中iOS UI测试调整Picker滚轮值仅单步移动问题分析
问题原因
该现象是Xcode 12.4、iOS 14.4环境下SwiftUI与XCTest框架的适配缺陷导致的,核心触发逻辑如下:
- 该版本的SwiftUI滚轮型Picker未向UI测试依赖的辅助功能层暴露完整的滚轮可选值、当前选中项索引映射关系。UIKit原生
UIPickerView会将全量可选值注册到辅助功能树,XCTest可直接计算目标值与当前选中值的索引差,一次性滚动到目标位置;但该版本下SwiftUI Picker的辅助功能树仅会动态加载当前可见范围内的条目,XCTest无法获取全量可选值元数据,也就计算不出需要滚动的总步长。 - 同时该版本XCTest对SwiftUI Picker滚轮的
adjust(toPickerWheelValue:)方法存在逻辑漏洞:在无法获取全量值列表的前提下,方法未实现“循环滚动直到定位目标值”的逻辑,反而将单次调用的滚动步长硬编码为1,因此每次调用仅会朝着目标值所在方向移动一个条目。
这是苹果官方已记录的适配问题,后续Xcode 13+、iOS 15+版本已完成修复,高版本环境下调用该方法可直接定位到目标值。
如果需要在该特定版本下完成测试,可通过循环调用的方式直到选中目标值,示例代码:
let targetValue = "Purple" let pickerWheel = app.pickers["picker"].pickerWheels.firstMatch while (pickerWheel.value as? String) != targetValue { pickerWheel.adjust(toPickerWheelValue: targetValue) }
内容的提问来源于stack exchange,提问作者dvonn
相关产品推荐
相关产品推荐

