web-dev-qa-db-ja.com

Xcode UIテスト-typeText()メソッドと自動修正によるテキストの入力

以下のようなテストがあります:

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をリセットするとテストが再び失敗するため、この解決策では問題を解決できません。

テストケースの前にオートコレクトをセットアップする方法、またはテキストフィールドにテキストを入力する他の方法はありますか?.

18
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()

13
Apan

これを実現するための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に送られます
23
mike

現在Xcode 10でSwift 4を使用しています。これでtypeText(String)を使用できますlet app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")

8
Dan Leonard

微調整:

  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)
0
user363349

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)
0
nDiviD