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

标签 ios xcode swift uipickerview xcode-ui-testing

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

当我尝试在 XCode 7 中针对此 View 运行 UI 测试时,模拟器卡住并且我最终看到错误:

"Failed to get refreshed snapshot"

我的测试目前只是尝试与 View 中的取消按钮进行交互:

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

我也试过等待取消按钮出现。从 UIView 中删除选择器 View 会停止测试卡住,所以我知道问题出在那里。

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 元素。

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

关于ios - 使用 UIPickerView 进行 UI 测试时出现 "Failed to get refreshed snapshot"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977575/

相关文章:

ios - 如何为自定义 uicontrol 和 controller 添加触摸事件?

ios - Swift:解码 JSON 响应并将嵌套的 JSON 存储为字符串或 JSON

ios - 局部变量不会复制到全局变量(swift)

android - 地理坐标转屏幕坐标算法

iOS : 3. 4 : App names in iTunes Connect and as displayed on a device should be similar, 以免造成混淆

java - Appium - 仪器在启动模拟器时崩溃

iphone - 绘制 UITableviewcell 时的动画

iphone - 要加倍的字符串

ios - Expo.Notifications.addListener() 未触发(iOS 独立应用程序)

objective-c - 在委托(delegate)中初始化自定义对象