我有一个选择器视图,其中包含在Interface Builder中创建的日期选择器。在属性检查器中选择:模式“日期和时间”。在我的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月5月12日,5月13日,5月14日,5月15日,5月16日,5月17日5月18日,5月19日,5月20日,5月21日,5月22日,5月23日,5月24日,5月25日,5月26日,5月27日,5月28日,5月29日,30日5月31日,6月1日,6月2日,6月3日,6月4日,6月5日,6月6日,6月7日,6月8日,6月9日,6月10日,6月11日6月12日,6月13日,6月14日,6月15日,6月16日,6月17日,6月18日,6月19日,6月20日,6月21日,6月22日,6月23日,24日6月6日,6月25日,6月26日,6月27日,6月28日,6月29日,6月30日,7月1日,7月2日,7月3日,7月4日,7月5日,7月6日7月7日,7月8日,7月9日,7月10日,7月11日,7月12日,7月13日,7月14日,7月15日,7月16日,7月17日,7月18日,19日7月20日,7月21日,7月22日,7月23日,7月24日,7月25日,7月26日,7月27日,7月28日,7月29日,7月30日,7月31日,8月1日,8月2日,8月3日,8月4日,8月5日,8月,8月7日,8月8日,8月9日,8月10日,8月。 ,8月11日,12日8月14日星期三,8月13日,8月14日,8月15日,8月16日,8月17日,8月18日,对于拾取轮“Heute”PickerWheel
我认为,'(null)'表示没有为UITest查询设置搜索字符串:
app.tables.pickerWheels.elementBoundByIndex(0).adjustToPickerWheelValue("29. Juni")
这就是上升这个例外的原因。
仅当模拟器首选项“通用/语言和区域”未设置为默认“美国”时,才会出现所述问题。
当我在模拟器中切换到其他语言设置时,我得到了与上面我自己的swift代码相同的结果以及下面发布的Objective-C代码:
How to select a picker view item in an iOS UI test in Xcode?
我必须使用本地化的日期和时间选择器来执行我的UITestings!有没有人有想法,这里出了什么问题,是否有解决方案?
可能为时已晚,但这帮助了我
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")
之前的解决方案假定选择器在当前日期开始。如果我们想要更改日期两次或更多次,我们可能会遇到问题,例如,测试日期验证是否正常。
更安全的方法是使用正则表达式来推断哪个轮对应于每个日期组件。我的意思是,几天满足正则表达式\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
}
}