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)