首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS UItest中选择本地化日期选择器项

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

Stack Overflow用户
提问于 2016-06-29 23:19:39
回答 2查看 1.8K关注 0票数 5

我在Interface中创建了一个带有日期选择器的选择器视图。在属性检查器中选择:模式"Date and Time“。在UI测试中,我需要从其中选择一个特定的日期和时间。我正在使用Xcode 7引入的XCTest UI测试API。

我为本地化的美国日期和时间选择器编写的测试代码如下所示:

代码语言:javascript
复制
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")

那会很完美的!

我为本地化的德国日期和时间选择器编写的测试代码如下所示:

代码语言:javascript
复制
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查询设置搜索字符串:

代码语言:javascript
复制
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日期和时间选择器来执行我的有什么想法吗?这里出了什么问题?如果有解决方案的话?

EN

回答 2

Stack Overflow用户

发布于 2017-12-23 21:45:43

可能太迟了,但这件事帮了我

代码语言:javascript
复制
 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")
票数 2
EN

Stack Overflow用户

发布于 2019-04-05 20:32:36

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

一种更安全的方法是使用regex来推断哪个轮对应于每个日期组件。我的意思是,天满足正则\d{1,2},年份满足正则\d{4},月份满足正则[A-Za-z]*。不管我们用的是哪种本地化。

因此,使用这个XCUIElementQuery扩展:

代码语言:javascript
复制
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)
  }
}

我们可以做以下工作:

代码语言:javascript
复制
  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
    }
  }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38111613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档