UITests для iOS NSLocalizedString не работает

Я пытаюсь локализовать свои UITests для работы с другими языками (в настоящее время я использую Snapshot для автоматизации снимков экрана, поэтому мне нужно, чтобы это работало).

Моя главная проблема сейчас с кнопкой Готово в IQKeyboardManager.

На английском у меня есть следующий код, и он отлично работает:

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

нажать кнопку "Готово" после ввода текста.

На испанском эта кнопка называется "ОК". Похоже, это получается из какой-то локализованной строки UIKit по умолчанию или чего-то в этом роде.

Я попытался добавить файл.strings в свой UITest es.lproj папку и положить "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. Есть идеи, как заставить это работать?

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

Просто для справки и легкого поиска:

Это действительно потому, что вы не можете получить доступ к своему основному пакету из своей цели UITests.

let testBundle = Bundle(for: type(of: self ))
let lookup = NSLocalizedString("UIBarButtonSystemItem.Done", bundle: testBundle, value: "Done", comment: "")
app.toolbars.buttons[lookup].tap()
Другие вопросы по тегам