"Failed to get refreshed snapshot" 使用 UIPickerView 进行 UI 测试时出错

"Failed to get refreshed snapshot" error when UI testing with a UIPickerView

我有一个时间选择器视图,它使用 UIPickerView,其中包含 6 个部分,小时、分钟、秒和它们之间的固定标签轮。

当我在 XCode 7 中尝试针对此视图 运行 进行 UI 测试时,模拟器冻结,我最终看到错误:

"Failed to get refreshed snapshot"

我的测试目前仅尝试与视图中的取消按钮进行交互:

app.buttons["Cancel"].tap()

我也试过等待取消按钮出现。从 UI 视图中删除选择器视图会停止测试冻结,所以我知道问题出在那里。

UIPickerViewDelegateUIPickerViewDataSource方法如下:

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
    }
}

与获取 快照 相关的错误很可能是由辅助功能层次结构中的元素过多引起的。为了能够查询 UI,测试框架正在生成完整的层次结构。

我看到您使用了将小时、分钟和秒选择器中的行数相乘的技巧来创建看似循环的选择器项目的效果。在三个轮子之间的当前实现中,将在可访问性层次结构中生成 13200 UI 个元素。

我正在使用相同的选择器视图技巧,但遇到了同样的错误。 运行 测试时,通过将每个选择器轮的行数减少到少于一百,根据我的经验,获取可访问性层次结构的快照没有问题。