Xcode的UI测试,开发语言,后备翻译和CI服务器
以下情形:Xcode的UI测试,开发语言,后备翻译和CI服务器
我有一个iOS的项目,自动获取单元和用户界面上的CI服务器(CircleCI)上的每个混帐推测试。这些测试是用fastlane执行的,它也被用来自动为App Store创建屏幕截图。现在
,我的项目被翻译成多种语言。我想FASTLANE对所有语言(能够采取截图)工作,所以我从这样的事情改变了UI测试:
app.navigationBars.buttons["Confirm"].tap()
到
let buttonTitle = NSLocalizedString("navbar.confirm", comment: "")
app.navigationBars.buttons[buttonTitle].tap()
我认为这会做诀窍,但事实并非如此。我不知道该模拟器是如何在CircleCI配置,但UI测试现在失败,
[0时46分34秒]:▸testDashboard,未找到找到匹配:元素匹配谓词““导航栏。从输入{(
所以出于某种原因与CFBundleDevelopmentRegion
设置备用语言的不尊重确认”在标识符,可能是因为语言不是捆扎的preferredLanguages
列表,这本身就是一个问题,因为我不希望密钥在任何情况下都会显示给最终用户。我想确保这永不会发生。
于是,我就写了一个NSLocalizedString
包装,检查是否NSLocalizedString(..)
返回键,如果是加载默认(en
)捆绑并获得字符串本地化这种方式来解决这个问题反过来。
然而似乎你不能在UI测试加载另一个包。测试会崩溃并失败。所以我不能使用这个解决方法。
我是不是可以俯瞰一些明显的解决方案?我不能成为唯一有这个问题的人,对吧?任何提示?
你的UI元素,并使用那些在您的测试,而不是使用本地化的字符串值查询设置无障碍标识。这将使你的测试语言无关,并不会有必要与访问不同的包拨弄。
对于如何设置和使用辅助标识符的示例见this answer。
当您使用NSLocalizedString("navbar.confirm", comment: "")
系统尝试检索该键从字符串主束文件中的值。
运行UITests时,因为它给你的UITest亚军应用的软件包,而不是UITest束的主束不起作用。
为了能够使用NSLocalizedString
在UITest你必须做两件事情:
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这一点,如果你有兴趣了解更多的细节。
这实际上是在做事情的更好的方法。我想知道这是否是可能的,但我只在辅助功能标签,没有标识绊倒了。 感谢分享! – JanBrinker