如何在iOS UItest中选择本地化的日期选择器项

问题描述 投票:3回答:2

我有一个选择器视图,其中包含在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!有没有人有想法,这里出了什么问题,是否有解决方案?

ios swift datetime datepicker uitest
2个回答
1
投票

可能为时已晚,但这帮助了我

 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")

0
投票

之前的解决方案假定选择器在当前日期开始。如果我们想要更改日期两次或更多次,我们可能会遇到问题,例如,测试日期验证是否正常。

更安全的方法是使用正则表达式来推断哪个轮对应于每个日期组件。我的意思是,几天满足正则表达式\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
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.