无法访问 UI 测试中的字符串本地化(Xcode 7)

Posted

技术标签:

【中文标题】无法访问 UI 测试中的字符串本地化(Xcode 7)【英文标题】:Can't get access to string localizations in UI Test (Xcode 7) 【发布时间】:2015-10-12 16:47:23 【问题描述】:

所以我遇到了一些经过验证的文本字段的情况。我正在尝试运行 UI 测试,当它们失败时,他们会收到一条弹出错误消息的警报(可能会根据哪些字段无效以及以何种方式显示不同的消息)。

我想测试不仅出现了警报,而且显示了正确的消息。我遇到的问题是我需要获取本地化文本进行比较(如果我用英语以外的其他语言运行测试),但是当我在 UITest 中调用 NSLocalizedString 时,它无法收集正确的本地化字符串(只是返回键[默认])

我尝试将localizeable.strings 文件添加到 UITest 目标,但无济于事。有谁知道这是否可能?

附注编辑:我还尝试在 UIAlertView 上设置可访问性标识符,但是当我使用该可访问性标识符进行查询时,它不存在,我只能使用标题进行查询似乎倒退的警报。

【问题讨论】:

我发现的解决方法是强制应用程序以英语启动(启动参数),然后针对英语字符串进行测试。有效,但不是最佳解决方案。 【参考方案1】:

在 UI 测试中,主包似乎是一个随机启动器应用。这就是 .strings 文件没有出现的原因:即使您将它添加到测试包中,NSLocalizedString 仍在检查错误的包。为了解决这个问题,您需要这样的调用:

NSLocalizedString("LOCALIZATION_KEY", bundle: NSBundle(forClass: AClassInYourUITests.self), comment: "")

您可能希望将其引入辅助方法。

【讨论】:

我已经复制了Localizable.strings对应的bundle资源,但是无论设备是哪种语言,我总是得到英文版的key。任何想法@Manuel?【参考方案2】:

这是我的解决方案:

    在您的 UI 测试目标 -> 构建阶段 -> 复制捆绑资源中,添加所需的本地化文件(例如 Localizable.strings)。

    添加类似如下的函数:

    func localizedString(key:String) -> String 
        /*1*/ let localizationBundle = NSBundle(path: NSBundle(forClass: /*2 UITestsClass*/.self).pathForResource(deviceLanguage, ofType: "lproj")!) 
        /*3*/ let result = NSLocalizedString(key, bundle:localizationBundle!, comment: "") // 
        return result
    
    
    
    /*1 Gets correct bundle for the localization file, see here: http://***.com/questions/33086266/cant-get-access-to-string-localizations-in-ui-test-xcode-7 */
    /*2 Replace this with a class from your UI Tests*/ 
    /*3 Gets the localized string from the bundle */
    

    像这样使用函数:app.buttons[localizedString("localized.string.key")]

【讨论】:

不能动态获取deviceLanguage吗?我不喜欢必须指定设备语言的想法。UITest 类是否与它正在测试的设备没有任何联系以从中获取本地化?

以上是关于无法访问 UI 测试中的字符串本地化(Xcode 7)的主要内容,如果未能解决你的问题,请参考以下文章

XCode 7 beta 6 UI 测试 - 无法选择列表中的元素

如何从 XCTest 中的 UI 目标调用主目标中的方法?

使用 arc4random 生成随机数以添加到字符串以进行 UI 测试登录 xcode UI 测试

在 UI 测试中仅使用子字符串 Xcode 查找元素

Xcode UI 测试 - UITableView 部分

使用 Material Library 中的 ErrorTextField 进行 Xcode UI 测试