web-dev-qa-db-ja.com

Swift TextFieldのUIテストアクセス文字列

XcodeとXCTestに統合されている_UI Test Case_クラスを使用して、アプリのUIをテストしています。このようなものをテストしたい:

_app = XCUIApplication()
let textField = app.textFields["Apple"]
textField.typeText("text_user_typed_in")
XCTAssertEqual(textField.text, "text_user_typed_in")
_

_textField.value as! String_メソッドを試しました。それは動作しません。また、expectationForPredicate()で新しい非同期メソッドを使用してみましたが、タイムアウトになります。

これを行う方法やこの種の検証はUIテストでは不可能であり、ブラックボックステストしか記述できません。

15
leoluo

私はこのコードを使用し、それは正常に動作します:

textField.typeText("value")
XCTAssertEqual(textField.value as! String, "value")

同様のことを行っていて機能していない場合は、textField要素が実際に存在することを確認します。

XCTAssertTrue(textField.exists, "Text field doesn't exist")
textField.typeText("value")
XCTAssertEqual(textField.value as! String, "value", "Text field value is not correct")
31
Charles A.

Swift 4.2。 textFieldの既存の値をクリアして、新しい値を貼り付ける必要があります。

let app = XCUIApplication()
let textField = app.textFields["yourTextFieldValue"]
textField.tap()
textField.clearText(andReplaceWith: "VALUE")
XCTAssertEqual(textField.value as! String, "VALUE", "Text field value is not correct")

ここで、clearTextXCUIElement拡張のメソッドです。

extension XCUIElement {
    func clearText(andReplaceWith newText:String? = nil) {
        tap()
        press(forDuration: 1.0)
        var select = XCUIApplication().menuItems["Select All"]

        if !select.exists {
            select = XCUIApplication().menuItems["Select"]
        }
        //For empty fields there will be no "Select All", so we need to check
        if select.waitForExistence(timeout: 0.5), select.exists {
            select.tap()
            typeText(String(XCUIKeyboardKey.delete.rawValue))
        } else {
            tap()
        }
        if let newVal = newText {
            typeText(newVal)
        }
    }
}
1
Agisight

以下は、macOS 10.14.3で実行されているXcode 10.3で、iOS 12.4を実行しているiOSアプリで機能します。

XCTAssert( app.textFields["testTextField"].exists, "test text field doesn't exist" )
let tf = app.textFields["testTextField"]
tf.tap()    // must give text field keyboard focus!
tf.typeText("Hello!")
XCTAssert( tf.exists, "tf exists" )   // text field still exists
XCTAssertEqual( tf.value as! String, "Hello!", "text field has proper value" )
0
Dad