【问题标题】:XCUITest - neither element nor descendant has keyboard focusXCUITest - 元素和后代都没有键盘焦点
【发布时间】:2017-01-19 22:49:56
【问题描述】:

我正在测试向我的应用程序添加评论,在我的其他 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)
}

【问题讨论】:

  • 您的“添加评论”组件的类型是什么?它是 UITextField 吗?
  • @julienQuere 是的,它是一个 textField ,我最近更改了我的 addComment 方法。(查看编辑,错误仍然发生)
  • 是的,它是一个 UITextField
  • 这很奇怪。我试过你的代码,它可以工作,但不能用一个模拟器(6s plus)。我一直在挖掘:)
  • 嗯,我在模拟器上使用 iphone 6,不确定它是否是 xcode 错误。感谢您的帮助!

标签: swift xcode xcode-ui-testing


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是一个内容丰富的答案,但遗憾的是,尽管我学到了很多东西,但并没有帮助我。
【解决方案2】:

我发现最好的解决方法是使用 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()
    }

【讨论】:

  • 我遇到了类似的问题。事实上,当我尝试 typeText 时,尝试输入单词“test”时,它会输入“tttest”。在控制台中,我看到了有关在文本字段上检查中断元素的消息。如果能够使用一些命令将操作强制到文本字段中,那就太好了。我这么说的原因是,在真实设备上,当我点击同一个字段时,输入文本没有问题。这个问题只发生在 xcuitests 运行时。无论如何,谢谢你,它有很大帮助!
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    您可以尝试先使用.doubletap() 解决此问题,然后在.typeText(string) 中输入值,这对我有用。

    let addComment = self.app.staticTexts["Add a comment"]
        if addComment.exists {
            addComment.doubleTap()
            addComment.typeText("Test comment")
    

    【讨论】:

      【解决方案5】:

      在模拟器菜单中关闭I/O -> Keyboard -> Connect Hardware Keyboard

      当此选项打开时,模拟器不会调出软键盘,因此操作系统(有时)认为文本字段没有聚焦。我的大多数测试在启用此选项的情况下输入文本字段没有问题,但有些测试失败,尤其是搜索栏。

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 2015-12-12
        • 2015-11-18
        • 2016-04-20
        • 2019-01-15
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多