Как отключить автозаполнение при выполнении тестов пользовательского интерфейса 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()
Другие вопросы по тегам