简体   繁体   中英

How to disable auto-complete when running Xcode UI Tests?

As part of my UI Tests, I'm generating a random string as titles for my objects. The problem is that when this title is input via a keyboard (using XCUIElement.typeText() ), iOS sometimes accepts an auto-suggested value instead.

For example, I may want it to type an auto generated string of "calg", but auto correct will choose "calf" instead. When I try to look for this value later on with an assertion, it doesn't exist and fails incorrectly.

Is there a way to tell the UI tests that they shouldn't be using auto correct, or are there an workarounds I can use?

I don't believe you can turn off auto-correction through code from your UI Testing target.

You can, however, turn it off for the individual text view from your production code. To make sure auto-correction is still on when running and shipping the app, one solution would be to subclass UITextField and switch on an environment variable.

First set up your UI Test to set the launchEnvironment property on 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
    }
}

Then subclass (and use) UITextField to look for this value in the process's environment dictionary. If it's set, turn auto-correction off. If not, just call through to super.

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
        }
    }
}

Unless you need auto-suggest for any test scenarios, did you try turning off auto-correction in device/simulator settings.

Settings-> General -> Keyboard -> Auto-Correction

Here is how I disabled it in my UI Test

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM