iOS UITests NSLocalizedString 不起作用。

4
我正在尝试将我的UITests本地化,以使其适用于其他语言(目前使用快照自动化截图,因此我需要这个工作)。
我目前的主要问题是在IQKeyboardManager中的“完成”按钮上。
在英文中,我有以下代码,它可以正常工作:
app.toolbars.buttons["Done"].tap()

在输入文本后,需要点击“完成”按钮。

在西班牙语中,该按钮称为“OK”。看起来它是从一些默认的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访问它。请参见https://dev59.com/sXI-5IYBdhLWcg3wZ3UR或https://dev59.com/F1wX5IYBdhLWcg3wnwgy - Titouan de Bailleul
@TitouandeBailleul 好的,看起来现在运行得更好了。但是不知道为什么它现在对所有内容都使用我的西班牙语.strings文件。即使是英文也是如此。通常在我的主项目中,我使用键作为英文版本,而西班牙语和其他版本则在.strings文件中。但是不知道为什么它甚至在英文情况下也使用西班牙语.strings文件。有任何想法吗? - Charlie Fish
2个回答

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

enter image description here

这是测试的构建方式

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的快照(这是我正在使用的工具)。看起来它仍然失败了。这让我真的认为这可能是快照设置本地化的某种问题。 - Charlie Fish
你能分享这个项目的一个分支,包括快照以及你尝试运行的测试/命令和期望的结果吗? - Titouan de Bailleul
在终端中导航到项目后运行 fastlane snapshot,西班牙语版本失败了 XCTAssertTrue 失败 - 预期 "Hello" 标签存在。英语正常工作。这让我认为 Snapshot 的方法并没有正确地更改语言或其他什么问题。GitHub 项目链接:https://github.com/fishcharlie/LocalizationUITests - Charlie Fish
另外,我仍在使用Xcode 8.3.3,所以我不得不将项目还原到该版本。由于Xcode 9不支持SKError,所以我暂时不打算升级到Xcode 9,直到问题得到解决。 - Charlie Fish
你对此有什么想法? - Charlie Fish

2

仅供参考和方便查找:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接