Reputation: 249
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
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
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
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