无法访问 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 测试 - 无法选择列表中的元素