leoluo
leoluo

Reputation: 249

Swift UI Testing Access string in the TextField

I am using the UI Test Case class integrated in Xcode and XCTest to test app UI. I want to test something like this:

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

I've tried the textField.value as! String method; it does not work. I've also tried using the new async method with expectationForPredicate(), and it will result in a timeout.

Any idea how to do this or validation of this kind is not possible with UI Test and I could only write black-box tests?

Upvotes: 22

Views: 30228

Answers (3)

Dad
Dad

Reputation: 6478

the following is working in Xcode 10.3 running on macOS 10.14.3, for iOS app running iOS 12.4:

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" )

Upvotes: 2

Agisight
Agisight

Reputation: 1818

Swhift 4.2. You need to clear an existing value in textField and paste new value.

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")

where clearText is a method of XCUIElement extension:

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)
        }
    }
}

Upvotes: 4

Charles A.
Charles A.

Reputation: 11123

I use this code and it works fine:

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

If you're doing something similar and it isn't functioning, I would check to make sure that your textField element actually exists:

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

Upvotes: 43

Related Questions