ios - Xcode UI 测试、开发语言、后备翻译和 CI 服务器

标签 ios xcode xcode-ui-testing fastlane fastlane-snapshot

以下场景:

我有一个 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/

相关文章:

ios - 如何使用 NSMutableArray 作为我的 UITableView 的数据源

ios - 如何将 URL 读入 AVURLAsset

ios - 通知中心在两个 View 之间不起作用

c++ - libc++abi.dylib:以 std::length_error 类型的未捕获异常终止: vector

ios - 如何在操作表中进行多项选择和部分?

xcode - 从 Xcode UITests 的 Menu Token 字段中选择文本

ios - 将 JSON 数组附加到数组中的值

ios - 用于架构 armv7 的 google admob undefined symbol

ios - 使用 Cocoapods 的 Xcode 7 UI 测试在设备上失败

ios - 测试运行时如何在 Xcode UI 测试中模拟网络请求?