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

Posted

技术标签:

【中文标题】运行 Xcode UI 测试时如何禁用自动完成?【英文标题】:How to disable auto-complete when running Xcode UI Tests? 【发布时间】:2015-10-01 23:30:19 【问题描述】:

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

例如,我可能希望它键入自动生成的字符串“calg”,但自动更正将选择“calf”。当我稍后尝试使用断言查找此值时,它不存在并且错误地失败。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

这很适合本地测试运行。但是,它不适用于 CI。 我只是试图自己找到解决方法,但找不到任何干净的解决方法。我认为合理的解决方案是所有 CI 提供商都应该在短期内将他们的模拟器配置为默认关闭自动更正,所以请随时与他们联系,我相信他们会帮助你。尽管 Apple 会为这个长期提供解决方案(例如,方案中 Xcode 中的一个选项),但您可能希望通过错误报告器发布功能请求。做的人越多,实施的可能性就越大。【参考方案2】:

我认为您无法通过 UI 测试目标中的代码关闭自动更正功能。

但是,您可以从生产代码中为单个文本视图关闭它。为确保在运行和发布应用程序时自动更正仍然处于开启状态,一种解决方案是继承 UITextField 并打开环境变量。

首先设置您的 UI 测试以在 XCUIApplication 上设置 launchEnvironment 属性。

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 在进程的环境字典中查找此值。如果已设置,请关闭自动更正。如果没有,请直接致电 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
        
    

【讨论】:

这个想法很有趣。但是,缺点显然是您在应用程序中有子类 ALL 文本字段。调配 UITextField 类方法来实现它是有意义的。 这里有一些关于 swizzling 的建议:***.com/questions/9670321/… 这是我认为的完美答案。【参考方案3】:

这是我在 UI 测试中禁用它的方法

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

【讨论】:

以上是关于运行 Xcode UI 测试时如何禁用自动完成?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode Swift UI 测试 - 模拟器硬件键盘

XCode 运行所有测试(甚至是禁用的测试)

是否可以为 xcode UI 测试自动设置位置?

如何让 Xcode 7 保留来自 UI 测试目标的日志记录输出?

如何在 Xcode 中运行单个 UI 测试

想要在 Xcode 中的 UI 测试期间在测试运行后停止调试控制台清除