Как отключить автозаполнение при выполнении тестов пользовательского интерфейса XCode?
В рамках моих тестов пользовательского интерфейса я генерирую случайную строку в качестве заголовков для своих объектов. Проблема в том, что когда этот заголовок вводится через клавиатуру (используя XCUIElement.typeText()
), iOS иногда принимает автоматически предложенное значение вместо этого.
Например, я могу захотеть, чтобы он набрал автоматически сгенерированную строку "calg", но автокоррекция выберет "calf". Когда я позже пытаюсь найти это значение с утверждением, оно не существует и некорректно завершается с ошибкой.
Есть ли способ сказать тестам пользовательского интерфейса, что они не должны использовать автокоррекцию, или есть ли обходные пути, которые я могу использовать?
3 ответа
Если вам не требуется автоматическое предложение для каких-либо тестовых сценариев, вы пытались отключить автокоррекцию в настройках устройства / симулятора.
Настройки-> Общие -> Клавиатура -> Автокоррекция
Я не верю, что вы можете отключить автокоррекцию с помощью кода из вашей цели тестирования пользовательского интерфейса.
Однако вы можете отключить его для отдельного текстового представления из своего производственного кода. Чтобы убедиться, что автокоррекция все еще включена при запуске и отправке приложения, одним из решений будет подкласс UITextField
и включите переменную среды.
Сначала настройте свой UI Test, чтобы установить launchEnvironment
собственность на XCUIApplication
,
class UITests: XCTestCase {
let app = XCUIApplication()
override func setUp() {
super.setUp()
continueAfterFailure = false
app.launchEnvironment = ["AutoCorrection": "Disabled"]
app.launch()
}
func testAutoCorrection() {
app.textFields.element.tap()
// type your text
}
}
Тогда подкласс (и использовать) UITextField
искать это значение в словаре среды процесса. Если он установлен, отключите автокоррекцию. Если нет, просто позвоните в супер.
class TestableTextField: UITextField {
override var autocorrectionType: UITextAutocorrectionType {
get {
if NSProcessInfo.processInfo().environment["AutoCorrection"] == "Disabled" {
return UITextAutocorrectionType.No
} else {
return super.autocorrectionType
}
}
set {
super.autocorrectionType = newValue
}
}
}
Вот как я отключил его в своем тесте пользовательского интерфейса
app.textFields.element(boundBy: 0).tap()
let keyboards = app.keyboards.count
XCTAssert(keyboards > 0, "You need enable the keyboard in the simulator.")
app.buttons["Next keyboard"].press(forDuration: 2.1)
let predictiveOn = app.switches["Predictive"].value as! String == "1"
if predictiveOn {
app.switches["Predictive"].tap()
} else {
app.buttons["Next keyboard"].tap()
}
app.buttons["Next keyboard"].press(forDuration: 2.1)
let predictiveOff = app.switches["Predictive"].value as! String == "0"
XCTAssert(predictiveOff, "Predictive mode is not disabled")
app.buttons["Next keyboard"].tap()