iOS UITests NSLocalizedString 不工作

Posted

技术标签:

【中文标题】iOS UITests NSLocalizedString 不工作【英文标题】:iOS UITests NSLocalizedString Not Working 【发布时间】: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 访问它。见***.com/questions/1879247/… 或***.com/questions/33609325/… @TitouandeBailleul 好的,这似乎工作得更好。但由于某种原因,它现在正在使用我的西班牙语 .strings 文件来处理所有内容。即使是英文的。通常在我的主项目中,我使用英文版的密钥,而西班牙文和其他版本在 .strings 文件中。但由于某种原因,它甚至使用英语的西班牙语 .strings 文件。有什么想法吗? 【参考方案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()

【讨论】:

以上是关于iOS UITests NSLocalizedString 不工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITests NSLocalizedString 不工作

iOS UITests:访问包含动态内容的 UITableViewCells 的重新排序控件元素

Swift 3 更新后 iOS UITests 无法执行基本操作

iOS UITests - 如何区分两个不同的 XCUIElement?

UITests-如何在 UITests 中获取当前语言

UITests - 如何在UITests中获取当前语言