以下场景:
我有一个 iOS 项目,它会自动对 CI 服务器 (CircleCI) 上的每个 git 推送进行单元和 UI 测试。测试使用 faSTLane 执行,它也用于自动为 App Store 创建屏幕截图。
现在,我的项目被翻译成多种语言。我希望 faSTLane 适用于所有语言(以便能够截取屏幕截图),所以我将 UI 测试从以下内容更改为:
app.navigationBars.buttons["Confirm"].tap()
到
let buttonTitle = NSLocalizedString("navbar.confirm", comment: "")
app.navigationBars.buttons[buttonTitle].tap()
我以为这会成功,但事实并非如此。我不知道模拟器是如何在 CircleCI 中配置的,但是 UI 测试现在失败了
[00:46:34]: ▸ testDashboard, No matches found for Find: Elements matching predicate '"navbar.confirm" IN identifiers' from input {(
因此出于某种原因,使用 CFBundleDevelopmentRegion
设置的回退语言未得到遵守,可能是因为该语言不在包的 preferredLanguages
列表中。这本身就是一个问题,因为我不希望在任何情况下都为最终用户显示 key 。我想确保这永远不会发生。
所以我试图通过为 NSLocalizedString
编写一个包装器来解决这个问题,该包装器检查 NSLocalizedString(..)
是否返回 key ,如果是则加载默认值(en
) 捆绑并以这种方式本地化字符串。
但是您似乎无法在 UI 测试中加载另一个包。测试将崩溃并失败。所以我不能使用这个解决方法。
我是否只是忽略了一些明显的解决方案?我不可能是唯一遇到这个问题的人,对吧?有什么提示吗?
最佳答案
当您使用 NSLocalizedString("navbar.confirm", comment: "")
时,系统会尝试从主包中的字符串文件中检索该键的值。
主包在运行 UITest 时不起作用,因为它为您提供了 UITest Runner App 的包而不是 UITest 包。
为了能够在 UITest 中使用 NSLocalizedString
,您必须做两件事:
<强>1。将您的 Localizable.strings 文件添加到您的 UITest 目标
<强>2。通过 UITest 包访问文件(您可以为此使用一些辅助方法):
func localized(_ key: String) -> String {
let uiTestBundle = Bundle(for: AClassFromYourUITests.self)
return NSLocalizedString(key, bundle: uiTestBundle, comment: "")
}
您可以使用 UITest 中的任何类来访问 UITest 包。
现在您可以像这样在 UITest 中使用 NSLocalizedString:
app.navigationBars.buttons[localized("navbar.confirm")].tap()
我写了一点blog post前一段时间,如果您有兴趣了解更多详细信息。
关于ios - Xcode UI 测试、开发语言、后备翻译和 CI 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46652822/