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)
调整:
- 所以扩展正在申请中,这对我来说更有意义
- 现有字段内容清空
代码:
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")
我有如下测试:
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)
调整:
- 所以扩展正在申请中,这对我来说更有意义
- 现有字段内容清空
代码:
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")