如何在运行Xcode UI测试时禁用自动完成?

Sen*_*ful 6 xcode ios xcode-ui-testing

作为我的UI测试的一部分,我正在生成一个随机字符串作为我的对象的标题.问题是,当通过键盘(使用XCUIElement.typeText())输入此标题时,iOS有时会接受自动建议的值.

例如,我可能希望它键入一个自动生成的"calg"字符串,但自动更正将改为选择"calf".当我稍后尝试使用断言查找此值时,它不存在并且未正确地失败.

有没有办法告诉UI测试他们不应该使用自动更正,或者是否有我可以使用的变通方法?

Sus*_*ant 5

除非您需要为任何测试场景提供自动建议,否则您是否尝试在设备/模拟器设置中关闭自动更正。

设置-> 通用-> 键盘-> 自动更正


Joe*_*tti 5

我不相信您可以通过UI测试目标中的代码关闭自动更正.

但是,您可以从生产代码中为单个文本视图关闭它.为了确保在运行和发布应用程序时自动更正仍然存在,一种解决方案是子类化UITextField并打开环境变量.

首先设置UI测试以设置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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后子类化(并使用)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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)