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

+1

这实际上是在做事情的更好的方法。我想知道这是否是可能的,但我只在辅助功能标签,没有标识绊倒了。 感谢分享! – JanBrinker

当您使用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这一点,如果你有兴趣了解更多的细节。