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()