Xcode UI Testing-ввод текста с помощью метода typeText() и автокоррекции

у меня есть тест, как показано ниже:

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

проблема в том, что по умолчанию my iPhone Simulator получил польскую клавиатуру из-за системных настроек, и "Хенрик" автоматически изменяется на "ha" путем автозамены.

простое решение-удалить польскую клавиатуру из iOS Settings. Однако это решение не решает проблему, потому что iPhone Simulator можно сбросить, а затем тест снова не удастся.

есть ли способ настроить автозамены перед тестовым случаем или другой способ ввода текста в текстовое поле.

3 ответов


вот небольшое расширение на 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 для реализации

существует обходной путь для использования 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)

вы можете проверить ссылка с описанием в качестве обходного пути для безопасного ввода в GM

редактировать

для лучшей читаемости, а не app.menuItems.elementBoundByIndex(0).tap() вы можете сделать app.menuItems["Paste"].tap().


для swift v3 нужно использовать новый sintax (ответ @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)