5

During Xcode UI Testing, how do I insertText for a UIView that conforms to UIKeyInput?

I created a CodeInputView that conforms to UIKeyInput.

When I record myself manually entering a code, Xcode writes app.typeText("1234").

But, when I try to play that back, I get the error UI Testing Failure - Neither element nor any descendant has keyboard focus. And, none of the solutions to that question has worked.

Community
  • 1
  • 1
ma11hew28
  • 121,420
  • 116
  • 450
  • 651

2 Answers2

6

I've found solution for UIKeyInput. Please, use:

app.keys["1"].tap()
app.keys["2"].tap()
app.keys["3"].tap()
app.keys["4"].tap()

// Instead of app.typeText("1234")
fiveze
  • 96
  • 2
  • 7
  • This works as intended, but it the test will fail if the simulator keyboard is down. It is also nice to add little timeout before tapping, as it has a tendency of failing with an invalid number of keystrokes every now and then... – Audun Kjelstrup Sep 28 '18 at 11:33
2

The CodeInputView needs focus before typing text will work. Access the input by either its placeholder text or set the accessibility label manually.

let app = XCUIApplication()
let codeTextField = app.textFields["Your code"]

codeTextField.tap()
app.typeText("1234")

The above assumes the placeholder or accessibility label was set to "Your code".

Joe Masilotti
  • 16,815
  • 6
  • 77
  • 87
  • I'll try that, but I don't think that will solve the issue as I don't need to click it during recording since I call `codeInputView.becomeForstResponder` in `viewDidLoad`. – ma11hew28 Mar 02 '16 at 15:55
  • First responder happens asynchronously so The framework might not have registered the change yet. – Joe Masilotti Mar 02 '16 at 16:07
  • I tried it, but no luck. *Note: `CodeInputView` isn't a `UITextField`. It's a `UIView` that conforms to `UIKeyInput`.* – ma11hew28 Mar 02 '16 at 18:36