I have a UI with multiple UITextField
s that I want to test by clearing their contents and typing new values. However, only the first field can be changed in a UI test; subsequent fields can be cleared (if their clear button is enabled), but they can't be typed into (using XCUIElement.typeText()
), because the test Failed to synthesize event: Neither element nor any descendant has keyboard focus.
How can I edit multiple text fields in a UI test function?
The ViewController
:
class ViewController: UIViewController {
@IBOutlet weak var field1: UITextField!
@IBOutlet weak var field2: UITextField!
@IBAction func submit(_ sender: Any) {
let actionVC = UIAlertController(title: "You did it!",
message: "\(field1.text ?? ""), \(field2.text ?? "")",
preferredStyle: .alert)
actionVC.addAction(UIAlertAction(title: "Awesome!", style: .default, handler: nil))
present(actionVC, animated: true, completion: nil)
}
}
The test:
class TextFieldTesterUITests: XCTestCase {
func testReplaceTextInMultipleTextFields() throws {
let app = XCUIApplication()
app.launch()
let field1TextField = app.textFields["Field 1"]
field1TextField.tap()
app.buttons["Clear text"].tap()
field1TextField.typeText("Oh")
let field2TextField = app.textFields["Field 2"]
field2TextField.tap()
app.buttons["Clear text"].tap() // <--
field2TextField.typeText("Susanna")
app.staticTexts["Button"].tap()
app.alerts["You did it!"].scrollViews.otherElements.buttons["Awesome!"].tap()
}
}
The error:
Failed to synthesize event: Neither element nor any descendant has keyboard focus. Event dispatch snapshot: TextField, placeholderValue: 'Field 2', value: Field 2
Element debug description:
Attributes: TextField, {{16.0, 413.7}, {358.0, 34.0}}, placeholderValue: 'Field 2'
Element subtree:
→TextField, 0x600001816d80, {{16.0, 413.7}, {358.0, 34.0}}, placeholderValue: 'Field 2'
Path to element:
→Application, 0x6000018164c0, pid: 3755, label: 'TextFieldTester'
↳Window (Main), 0x600001816ca0, {{0.0, 0.0}, {390.0, 844.0}}
↳Other, 0x600001817560, {{0.0, 0.0}, {390.0, 844.0}}
↳Other, 0x600001817640, {{0.0, 0.0}, {390.0, 844.0}}
↳Other, 0x600001817800, {{0.0, 0.0}, {390.0, 844.0}}
↳Other, 0x6000018178e0, {{16.0, 379.7}, {358.0, 98.0}}
↳TextField, 0x600001816d80, {{16.0, 413.7}, {358.0, 34.0}}, placeholderValue: 'Field 2', value: Field 2
Query chain:
→Find: Target Application 'net.poikilecreations.TextFieldTester'
Output: {
Application, pid: 3755, label: 'TextFieldTester'
}
↪︎Find: Descendants matching type TextField
Output: {
TextField, {{16.0, 379.7}, {358.0, 34.0}}, placeholderValue: 'Field 1', value: Oh
TextField, {{16.0, 413.7}, {358.0, 34.0}}, placeholderValue: 'Field 2'
}
↪︎Find: Elements matching predicate '"Field 2" IN identifiers'
Output: {
TextField, {{16.0, 413.7}, {358.0, 34.0}}, placeholderValue: 'Field 2'
}