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

时间:2016-09-12 13:20:23

标签: swift xcode xcode-ui-testing

我正在测试为我的应用添加评论,在我使用typeText功能的其他UI测试中,一切正常。我也点击了连接硬件键盘'已关闭。该应用程序终止测试并显示错误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)
}

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

可能原因:
此症状的一个非常常见的原因是启用了相关字段的父视图作为辅助功能元素。确保该字段的父节点均未作为辅助功能元素启用,并且可能会解决该问题。

<强>解释
当您可以看到XCUITest中的上一步已正确激活文本字段或类似第一响应者,键盘已出现以及功能上该字段具有键盘焦点时,此错误消息可能特别令人困惑。

基本上,错误信息有点误导,因为倾向于关注keyboard focus部分,并认为它告诉你没有键盘焦点。相反,消息告诉您的是,XCUITest可以访问的辅助功能元素都没有键盘焦点。因此,它无法将文本引导到相关领域。

辅助功能元素不能包含也是辅助功能元素的子元素。因此,如果在视图中放置了许多字段,但随后将该父视图标记为可访问性元素,则所有字段作为其子视图对于可访问性框架都是不可见的。您可以使用Mac上的辅助功能检查器应用程序和模拟器一起查看并验证这是发生了什么:您尝试定位的字段将无法选择,而是会有父视图。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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