我在Interface中创建了一个带有日期选择器的选择器视图。在属性检查器中选择:模式"Date and Time“。在UI测试中,我需要从其中选择一个特定的日期和时间。我正在使用Xcode 7引入的XCTest UI测试API。
我为本地化的美国日期和时间选择器编写的测试代码如下所示:
app.tables.pickerWheels.elementBoundByIndex(0).adjustToPickerWheelValue("Jun 29")
app.tables.pickerWheels.elementBoundByIndex(1).adjustToPickerWheelValue("12")
app.tables.pickerWheels.elementBoundByIndex(2).adjustToPickerWheelValue("10")
app.tables.pickerWheels.elementBoundByIndex(3).adjustToPickerWheelValue("PM")那会很完美的!
我为本地化的德国日期和时间选择器编写的测试代码如下所示:
app.tables.pickerWheels.elementBoundByIndex(0).adjustToPickerWheelValue("29. Juni")
app.tables.pickerWheels.elementBoundByIndex(1).adjustToPickerWheelValue("07")
app.tables.pickerWheels.elementBoundByIndex(2).adjustToPickerWheelValue("10")在这种情况下,我得到了以下例外:
断言失败: UI测试失败-内部错误:无法在可能的值中找到当前值'(null)'。11. Mai,12. Mai,13. Mai,14. Mai,15. Mai,16. Mai,17. Mai,18. Mai,19. Mai,20 Mai,21。梅,22岁。梅,23岁。麦,24岁。梅,25岁。麦,26岁。玛伊,27岁。梅,28岁。梅,29岁。梅,30岁。梅,31岁。梅,1.朱尼,2.朱尼,3.朱尼,4.朱尼,5.朱尼,6.朱尼,7.朱尼,8.朱尼,9.朱尼,10.朱尼,11.朱尼,12.朱尼,13.朱尼,14.朱尼,15.朱尼,16.朱尼,17岁,18岁。朱尼,19岁,20岁,朱尼,21岁。朱尼,22岁朱尼,23岁朱尼,24岁朱尼,25岁。朱尼,26岁朱尼,27岁。朱尼,28岁朱尼,29。朱尼,30岁。朱尼,朱利,2.朱利,3.朱利,4.朱利,5.朱利,6.朱利,7.朱利,8.朱利,9.朱利,10.朱利,11.朱利,12.朱利,13.朱利,14.朱利,15.朱利,16.朱利,17.朱利,18.朱利,19.朱利,20.朱利,21。朱莉,22岁朱莉,23岁朱莉,24岁朱莉,25岁朱莉,26岁朱莉,27岁朱莉,28岁朱莉,29岁朱莉,30岁朱莉,31岁8月1日,8月2日,8月3日,8月4日,8月5日,8月6日,8月7日,8月8日,8月9日,8月10日,8月11日,8月12日,8月13日,8月14日,8月15日,8月16日,8月17日,8月18日。
我推测,'(null)'表示没有为UITest查询设置搜索字符串:
app.tables.pickerWheels.elementBoundByIndex(0).adjustToPickerWheelValue("29. Juni")这就是这个例外上升的原因。
只有当模拟器首选项"General / Language & Region“未设置为默认"United States"时,才会出现所描述的问题。
当我切换到模拟器中的其他语言设置时,我在上面使用我自己的快速代码以及下面的帖子中提到的目标-C代码得到了同样的结果:
How to select a picker view item in an iOS UI test in Xcode?
我一定要用本地化的UITestings日期和时间选择器来执行我的!有什么想法吗?这里出了什么问题?如果有解决方案的话?
发布于 2017-12-23 21:45:43
可能太迟了,但这件事帮了我
let dateComponent = Calendar.current.dateComponents([.day, .month, .year], from: Date())
let formatter = DateFormatter()
formatter.dateFormat = "MMMM"
let monthText = formatter.string(from: Date())
datePicker.pickerWheels[String(dateComponent.year!)].adjust(toPickerWheelValue: "2017")
datePicker.pickerWheels[monthText].adjust(toPickerWheelValue: "December")
datePicker.pickerWheels[String(dateComponent.day!)].adjust(toPickerWheelValue: "21")发布于 2019-04-05 20:32:36
前面的解决方案假设选择器从当前日期开始。如果我们想要更改日期两次或更多次,例如,测试日期验证是否正常,我们可能会出现问题。
一种更安全的方法是使用regex来推断哪个轮对应于每个日期组件。我的意思是,天满足正则\d{1,2},年份满足正则\d{4},月份满足正则[A-Za-z]*。不管我们用的是哪种本地化。
因此,使用这个XCUIElementQuery扩展:
extension XCUIElementQuery {
func regex(_ regexPattern: String) -> XCUIElementQuery {
let satisfiesRegex = NSPredicate { (evaluatedObject, _) in
guard let element = evaluatedObject as? XCUIElementAttributes else { return false }
guard let text = element.value as? String else { return false }
guard let regex = try? NSRegularExpression(pattern: regexPattern) else { return false }
let range = NSRange(location: 0, length: text.count)
return regex.firstMatch(in: text, options: [], range: range) != nil
}
return self.containing(satisfiesRegex)
}
}我们可以做以下工作:
func datePickerWheelFor(_ wheelType: DatePickerWheelType) -> XCUIElement {
let datePicker = XCUIApplication().datePickers
switch wheelType {
case .day:
return datePicker.pickerWheels.regex2("^\\d{1,2}$").firstMatch
case .month:
return datePicker.pickerWheels.regex2("[A-Za-z]*").firstMatch
case .year:
return datePicker.pickerWheels.regex2("^\\d{4}$").firstMatch
}
}https://stackoverflow.com/questions/38111613
复制相似问题