以下のようなテストがあります:
let navnTextField = app.textFields["First Name"]
let name = "Henrik"
navnTextField.tap()
navnTextField.typeText("Henrik")
XCTAssertEqual(navnTextField.value as? String, name)
問題は、システム設定により、デフォルトで私のiPhone Simulator
にポーランド語のキーボードがあり、オートコレクトによって「ヘンリック」が自動的に「ハ」に変更されることです。
簡単な解決策は、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)
_
あなたはチェックすることができます 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)
現在Xcode 10でSwift 4を使用しています。これでtypeText(String)
を使用できますlet app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")
微調整:
コード:
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)
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)