我有一个时间选择器视图,它使用UIPickerView,它有6个部分,小时,分钟,秒和它们之间固定的标签轮。
当我尝试在XCode 7中针对此视图运行UI测试时,模拟器冻结,我最终看到错误:
"无法刷新快照"
我的测试目前只是尝试与视图中的取消按钮进行交互:
app.buttons["Cancel"].tap()
我也试过等待取消按钮存在。从UIView中删除选择器视图会使测试冻结,因此我知道问题就在那里。
UIPickerViewDelegate
和UIPickerViewDataSource
方法如下:
let HOUR_INDEX = 0
let HOUR_LABEL_INDEX = 1
let MINUTE_INDEX = 2
let MINUTE_LABEL_INDEX = 3
let SECOND_INDEX = 4
let SECOND_LABEL_INDEX = 5
let TOTAL_COMPONENTS = 6
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return TOTAL_COMPONENTS
}
// returns the # of rows in each component..
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == HOUR_INDEX {
return 12 * 100
} else if component == MINUTE_INDEX || component == SECOND_INDEX {
return 60 * 100
} else {
return 1
}
}
func pickerView(
pickerView: UIPickerView,
attributedTitleForRow row: Int,
forComponent component: Int) -> NSAttributedString? {
let paragraphStyle = NSMutableParagraphStyle()
if component == HOUR_INDEX || component == MINUTE_INDEX || component == SECOND_INDEX {
paragraphStyle.alignment = NSTextAlignment.Right
} else {
paragraphStyle.alignment = NSTextAlignment.Left
}
if let titleData = getPickerTitle(row, forComponent: component) {
let myTitle = NSAttributedString(string: titleData,
attributes: [
NSParagraphStyleAttributeName: paragraphStyle
])
return myTitle
}
return nil
}
func getPickerTitle(row: Int, forComponent component: Int) -> String? {
if component == HOUR_INDEX {
return "\(row%12)"
} else if component == MINUTE_INDEX || component == SECOND_INDEX {
return "\(row%60)"
} else {
if component == HOUR_LABEL_INDEX {
return "h"
}
if component == MINUTE_LABEL_INDEX {
return "m"
}
if component == SECOND_LABEL_INDEX {
return "s"
}
return nil
}
}
答案 0 :(得分:2)
与获取快照相关的错误很可能是由辅助功能层次结构中的元素太多引起的。为了能够查询UI,测试框架正在生成完整的层次结构。
我看到你正在使用将小时,分钟和秒选择器中的行数相乘的技巧来创建看似循环的选择器项的效果。利用三个轮子13200之间的当前实现,将在可访问性层级中生成UI元素。
我使用相同的选择器视图技巧并且看到了相同的错误。通过在运行测试时将每个选择器轮的行数减少到少于100个,根据我的经验获取辅助功能层次结构的快照没有问题。