1. ホーム
  2. swift

[解決済み] UI テキストフィールドのテキストを削除するテスト

2023-06-10 10:59:57

質問

私のテストでは、既存のテキストを持つテキストフィールドがあります。私は内容を削除して、新しい文字列を入力したい。

let textField = app.textFields
textField.tap()
// delete "Old value"
textField.typeText("New value")

ハードウェアキーボードで文字列を削除すると、記録は何も生成されませんでした。ソフトウェアキーボードで同じことをした後、私は得ました。

let key = app.keys["Usuń"] // Polish name for the key
key.tap()
key.tap() 
... // x times

または

app.keys["Usuń"].pressForDuration(1.5)

テストが言語に依存しているのが気になったので、対応言語用にこのようなものを作りました。

extension XCUIElementQuery {
    var deleteKey: XCUIElement {
        get {
            // Polish name for the key
            if self["Usuń"].exists {
                return self["Usuń"]
            } else {
                return self["Delete"]
            }
        }
    }
}

コード上ではよりきれいに見えます。

app.keys.deleteKey.pressForDuration(1.5)

が、非常に壊れやすい。シミュレータを終了した後 Toggle software keyboard がリセットされてしまい、テストが失敗してしまいます。CIテストでは、私のソリューションはうまく機能しません。どうすれば、より普遍的に解決できるでしょうか?

どのように解決するのですか?

私はこれを行うために拡張メソッドを書きました、そしてそれはかなり速いです。

extension XCUIElement {
    /**
     Removes any current text in the field before typing in the new value
     - Parameter text: the text to enter into the field
     */
    func clearAndEnterText(text: String) {
        guard let stringValue = self.value as? String else {
            XCTFail("Tried to clear and enter text into a non string value")
            return
        }

        self.tap()

        let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: stringValue.count)

        self.typeText(deleteString)
        self.typeText(text)
    }
}

すると、これは結構簡単に使えます。 app.textFields["Email"].clearAndEnterText("[email protected]")