Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XCUITest - neither element nor descendant has keyboard focus

I am testing adding a comment to my app, on my other UI tests I have used the typeText function and everything works perfectly fine. I have also clicked to make Connect hardware keyboard' is off. The app terminates testing and shows the error UI Testing Failure - Neither element nor any descendant has keyboard focus during the addComment method. Any ideas?

  func testAddComment() {
    let featuredPage = self.app.tabBars["Featured"]
    if featuredPage.exists {
        featuredPage.tap()
    }
    sleep(2)
    let featuredOffer = self.app.tables.cells.elementBoundByIndex(1)
    if featuredOffer.exists {
        featuredOffer.tap()
    }
    sleep(2)
    let addComment = self.app.staticTexts["Add a comment"]
    if addComment.exists {
        addComment.tap()
        addComment.typeText("Test comment")
    }
    sleep(2)
    let postComment = self.app.buttons["Send"]
    if postComment.exists {
        postComment.tap()
    }
    sleep(2)
}
like image 790
Billy Boyo Avatar asked Sep 12 '16 13:09

Billy Boyo


2 Answers

Likely cause:
An extremely common cause of this symptom is to have enabled a parent view of the field in question as an accessibility element. Ensure that none of the parents of the field are enabled as accessibility elements, and the problem is likely to be resolved.

Explanation
This error message can be particularly confusing when you can see that a previous step in the XCUITest has correctly activated a text field or similar as the first responder, the keyboard has appeared, and functionally the field has keyboard focus.

Essentially, the error message is slightly misleading as the tendency is to focus on the keyboard focus part and think that it is telling you that nothing has keyboard focus. Instead, what the message is telling you is that none of the accessibility elements that XCUITest can access have the keyboard focus. And so it can't direct text to the field in question.

Accessibility elements cannot have children that are also accessibility elements. Therefore, if you place a number of fields inside a view, but then mark that parent view as being an accessibility element, all of the field as its subviews become invisible to the accessibility frameworks. You can see and verify this is what is happening using the Accessibility Inspector app on the Mac alongside the simulator: the fields you are trying to target will not be selectable, and instead there will be a parent view that is.

like image 171
Duncan Babbage Avatar answered Oct 23 '22 06:10

Duncan Babbage


I found the way around this best was to use menuItem and to paste what I wanted to the textField . This was a strange problem as both textField and staticText both didn't allow the test to run functionally. This is an issue I have reported to apple.

Here is my fix

    let addComment = self.app.staticTexts["Add a comment"]
    if addComment.exists {
        addComment.tap()
        UIPasteboard.generalPasteboard().string = "Test Comment"
        let commentTextField = self.app.staticTexts["Add a comment"]
        commentTextField.pressForDuration(1.1)
        sleep(1)
        app.menuItems.elementBoundByIndex(2).tap()
    }
like image 38
Billy Boyo Avatar answered Oct 23 '22 05:10

Billy Boyo