XCUITest - 元素和后代都没有键盘焦点

Bil*_*oyo 5 xcode swift xcode-ui-testing

我正在测试向我的应用程序添加评论,在我的其他 UI 测试中,我使用了该typeText功能并且一切正常。我还单击了“连接硬件键盘”关闭。应用程序终止测试并显示错误 UI 测试失败 - 在 addComment 方法期间,元素和任何后代都没有键盘焦点。有任何想法吗?

  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)
}
Run Code Online (Sandbox Code Playgroud)

Dun*_*age 6

可能的原因:
此症状的一个极其常见的原因是启用了相关字段的父视图作为可访问性元素。确保没有字段的父项被启用为可访问性元素,并且问题很可能得到解决。

说明
当您看到 XCUITest 中的上一步已正确激活文本字段或与第一响应者类似的文本字段、键盘已出现并且该字段在功能上具有键盘焦点时,此错误消息可能特别令人困惑。

从本质上讲,错误消息有点误导,因为倾向于关注该keyboard focus部分并认为它告诉您没有键盘焦点。相反,该消息告诉您的是,XCUITest 可以访问的所有辅助功能元素都没有键盘焦点。因此它无法将文本定向到相关字段。

辅助功能元素不能有同时也是辅助功能元素的子元素。因此,如果您在一个视图中放置多个字段,然后将该父视图标记为可访问性元素,则作为其子视图的所有字段对于可访问性框架变得不可见。您可以使用 Mac 上的辅助功能检查器应用程序与模拟器一起查看并验证发生的情况:您尝试定位的字段将无法选择,而是有一个父视图。

  • 这是一个内容丰富的答案,但遗憾的是,尽管我学到了很多东西,但并没有帮助我。 (3认同)

Bil*_*oyo 5

我发现解决这个问题的最佳方法是使用menuItem并将我想要的内容粘贴到textField. 这是一个奇怪的问题,因为这两个textFieldstaticText两个没有允许测试功能运行。这是我向苹果报告的问题。

这是我的修复

    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()
    }
Run Code Online (Sandbox Code Playgroud)


Ole*_*tha 1

您只能.typeText()在输入元素上使用。静态文本不是输入元素 - 它们只是文本。您的addComment常量可能是文本字段中的占位符文本。点击占位符文本可能会激活文本字段和键盘,但您无法调用.typeText()占位符文本,因为文本字段是其父项,而不是其后代。

您需要调用.typeText()文本字段,点击后该文本字段应该具有焦点。

let addComment = self.app.textFields["addCommentIdentifier"]
if addComment.exists {
    addComment.tap()
    addComment.typeText("Test comment")
}
Run Code Online (Sandbox Code Playgroud)