【问题标题】:iOS UITests NSLocalizedString Not WorkingiOS UITests NSLocalizedString 不工作
【发布时间】:2017-07-06 21:38:37
【问题描述】:

我正在尝试本地化我的 UITests 以使用其他语言(目前使用 Snapshot 来自动截屏,这就是我需要它工作的原因)。

我现在的主要问题是IQKeyboardManager 中的“完成”按钮。

在英文中,我有以下代码,它工作正常:

app.toolbars.buttons["Done"].tap()

输入文本后点击完成按钮。

在西班牙语中,该按钮称为“确定”。看起来它是从一些默认的 UIKit 本地化字符串或类似的东西中获取的。

我尝试在我的 UITest es.lproj 文件夹中添加一个 .strings 文件并将 "UIBarButtonSystemItem.Done" = "OK"; 放入其中。

我也改成:

app.toolbars.buttons[NSLocalizedString("UIBarButtonSystemItem.Done", bundle: Bundle.main, value: "Done", comment: "")].tap()

那没有用。始终使用“完成”。

总是报错:

没有找到“完成”按钮的匹配项。

我也试过了:

app.toolbars.buttons[NSLocalizedString("UIBarButtonSystemItem.Done", comment: "")].tap()

这导致了一个错误:

没有找到“UIBarButtonSystemItem.Done”按钮的匹配项。

所以看起来我的 .strings 文件不适用于我的 UITests。关于如何让它工作的任何想法?

【问题讨论】:

  • 如果字符串文件位于 UI 测试目标的包中,那么我认为您无法使用 Bundle.main 访问它。见stackoverflow.com/questions/1879247/…stackoverflow.com/questions/33609325/…
  • @TitouandeBailleul 好的,这似乎工作得更好。但由于某种原因,它现在正在使用我的西班牙语 .strings 文件来处理所有内容。即使是英文的。通常在我的主项目中,我使用英文版的密钥,而西班牙文和其他版本在 .strings 文件中。但由于某种原因,它甚至使用英语的西班牙语 .strings 文件。有什么想法吗?

标签: ios swift localization xcode-ui-testing iqkeyboardmanager


【解决方案1】:

我创建了这个支持英语和西班牙语的小项目。通过在方案的配置中切换,也可以使用两种不同的语言运行测试

这就是构建测试的方式

func testExample() {
    let greeting = localizedString(key: "Greetings.Hello")
    XCTAssert(XCUIApplication().staticTexts[greeting].exists, "Expected \"\(greeting)\" label to exist")
}

它使用以下函数来获取翻译

func localizedString(key:String) -> String {
    let bundle = Bundle(for: LocalizationUITests.self)
    let deviceLanguage = Locale.preferredLanguages[0]
    let localizationBundle = Bundle(path: bundle.path(forResource: deviceLanguage, ofType: "lproj")!)
    let result = NSLocalizedString(key, bundle:localizationBundle!, comment: "") //
    return result
}

这是你可以看到它工作的项目:https://github.com/TitouanVanBelle/LocalizationUITests

【讨论】:

  • 刚刚克隆了您的项目。我刚刚将它转换为使用 Fastlane 的快照(这是我正在使用的)。看起来它仍然失败。这真的让我觉得这是 Snapshot 如何设置本地化的某种类型的问题。
  • 您能否分享该项目的一个分支与快照以及您尝试运行的测试/命令并获得预期结果?
  • github.com/fishcharlie/LocalizationUITests,在终端导航到项目后运行fastlane snapshot 时,西班牙语版本失败XCTAssertTrue failed - Expected "Hello" label to exist。英语很好用。所以这让我觉得 Snapshot 的方法并没有真正正确地改变语言之类的。
  • 另外,我仍在运行 Xcode 8.3.3,所以我不得不将项目恢复到那个状态。由于 Xcode 9 不支持 SKError 我有点推迟到 Xcode 9 直到得到修复。
  • 对此有什么想法吗?
【解决方案2】:

仅供参考和方便查找:

确实是因为您无法从 UITests 目标访问主包。

let testBundle = Bundle(for: type(of: self ))
let lookup = NSLocalizedString("UIBarButtonSystemItem.Done", bundle: testBundle, value: "Done", comment: "")
app.toolbars.buttons[lookup].tap()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2015-11-24
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多