以下情景:
我有一个iOS项目,可以在CI服务器(CircleCI)上的每个git push上自动获得单元和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,未找到匹配的匹配项:匹配谓词的元素"" navbar.confirm" IN标识符'来自输入{(
因此,由于某些原因,使用CFBundleDevelopmentRegion
设置的回退语言不受尊重,可能是因为该语言不在捆绑包的preferredLanguages
列表中。这本身就是一个问题,因为我不想在任何情况下为最终用户显示密钥。我想确保永远不会发生这种情况。
所以我尝试通过编写NSLocalizedString
的包装器来检查它,检查NSLocalizedString(..)
是否返回密钥,如果是,则加载默认(en
)包并获取字符串本地化。
然而似乎你无法在UI测试中加载另一个包。测试将崩溃并失败。所以我无法使用此解决方法。
我只是忽略了一些明显的解决方案吗?我不能成为唯一一个有这个问题的人,对吗?任何提示?
答案 0 :(得分:2)
当您使用NSLocalizedString("navbar.confirm", comment: "")
时,系统会尝试从主捆绑包中的字符串文件中检索该密钥的值。
运行UITests时主包不起作用,因为它为您提供了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: "")
}
您可以使用UITests中的任何类来访问UITest包。
现在您可以在UITest中使用NSLocalizedString,如下所示:
app.navigationBars.buttons[localized("navbar.confirm")].tap()
如果您对更多细节感兴趣,我前一段时间就写了一点blog post。
答案 1 :(得分:1)
在UI元素上设置辅助功能标识符,并使用测试中的辅助功能标识符进行查询,而不是使用本地化的字符串值。这将使您的测试与语言无关,并且不需要操作访问不同的包。
有关如何设置和使用辅助功能标识符的示例,请参阅this answer。