Xcode UI 测试 - 使用 typeText() 方法和自动更正输入文本

Xcode UI Testing - typing text with typeText() method and autocorrection

我有如下测试:

let navnTextField = app.textFields["First Name"]
let name = "Henrik"
navnTextField.tap()
navnTextField.typeText("Henrik")
XCTAssertEqual(navnTextField.value as? String, name)

问题是,由于系统设置,我的 iPhone Simulator 默认使用波兰语键盘,并且 "Henrik" 被自动更正自动更改为 "ha"。

简单的解决方案是从 iOS Settings 中删除波兰语键盘。但是这个解决方案并没有解决问题,因为 iPhone Simulator 可以重置,然后测试将再次失败。

有没有办法在测试用例之前设置自动更正或以其他方式将文本输入到文本字段。

有一个使用 UIPasteboard 提供输入文本的解决方法:

let navnTextField = app.textFields["First name"]
navnTextField.tap()
UIPasteboard.generalPasteboard().string = "Henrik"
navnTextField.doubleTap()
app.menuItems.elementBoundByIndex(0).tap()
XCTAssertEqual(navnTextField.value as? String, name)

你可以查看link with description as a workaround for secure input in GM

编辑

为了更好的可读性 app.menuItems.elementBoundByIndex(0).tap() 你可以做 app.menuItems["Paste"].tap().

这是 XCUIElement 上的一个小扩展来完成这个

extension XCUIElement {
    // The following is a workaround for inputting text in the 
    //simulator when the keyboard is hidden
    func setText(text: String, application: XCUIApplication) {
        UIPasteboard.generalPasteboard().string = text
        doubleTap()
        application.menuItems["Paste"].tap()
    }
}

可以这样用

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText("John Doe", app)
  • 感谢@Apan 的实施

对于 swift v3 需要使用新的语法(@mike 回答):

extension XCUIElement {
    func setText(text: String?, application: XCUIApplication) {
        tap()
        UIPasteboard.general.string = text
        doubleTap()
        application.menuItems.element(boundBy: 0).tap()
    }
}

并使用它:

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText(text: "John Doe", application: app)

调整:

  1. 所以扩展正在申请中,这对我来说更有意义
  2. 现有字段内容清空

代码:

extension XCUIApplication {
      // The following is a workaround for inputting text in the
      //simulator when the keyboard is hidden
      func setText(_ text: String, on element: XCUIElement?) {
        if let element = element {
        UIPasteboard.general.string = text
        element.doubleTap()
        self.menuItems["Select All"].tap()
        self.menuItems["Paste"].tap()
        }
      }
    }

运行 与:

self.app?.setText("Lo", on: self.app?.textFields.firstMatch)

目前在 Xcode 10 上使用 Swift 4 你现在可以像这样使用 typeText(String) let app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")