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 无法执行基本操作