XCUIElement 存在,但不可命中

Posted

技术标签:

【中文标题】XCUIElement 存在,但不可命中【英文标题】:XCUIElement exists, but is not hittable 【发布时间】:2018-02-17 20:14:49 【问题描述】:

在我的 UI 测试中,我使用(缩短)以编程方式创建了一个 UIView

let topMarker = UIView.init(frame: CGRect.init())
…
topMarker.accessibilityIdentifier = kTopMarker  

topMarker 视图位于自定义表格视图单元格中。 在我的 UI 测试中,我使用

let new1stCell = app.cells.element(boundBy: 0)
let topMarker = new1stCell.otherElements[kTopMarker]
let topMarkerExists = topMarker.waitForExistence(timeout: 15)
XCTAssertTrue(topMarkerExists, "Top marker does not exist")
XCTAssertTrue(topMarker.isHittable, "Top marker is not hittable")

当我设置测试失败断点时,测试在最后一行停止,即topMarker 存在,但不可命中。 另一方面,我可以在快照中看到视图,即它存在并且可见。 这很奇怪,因为docs 说:

isHittable 如果元素存在并且可以在其当前位置单击、点击或按下,则返回 true。如果元素不存在、不在屏幕上或被另一个元素覆盖,则返回 false。

我想,也许它是可见的,但不能点击、轻敲或按下,因为userInteractionEnable 不是true,但即使我将此属性设置为true,视图也不会变为可点击。

我错过了什么?

【问题讨论】:

【参考方案1】:

问题已解决:XCUIElement 只有在其 isAccessibilityElement 属性设置为 true 时才能被命中。docs 对属性isAccessibilityElement

此属性的默认值为 false,除非接收者是标准 UIKit 控件,在这种情况下该值为 true。 辅助应用程序只能获取有关由可访问性元素表示的对象的信息。因此,如果您实现了一个残障用户应该可以访问的自定义控件或视图,请将此属性设置为 true。

我以编程方式实例化的UIView 不是标准的 UIKit 控件。我一加

topMarker.isAccessibilityElement = true  

测试

XCTAssertTrue(topMarker.isHittable, "Top marker is not hittable")  

成功了。

【讨论】:

有谁知道如何在 SwiftUI 中做到这一点?

以上是关于XCUIElement 存在,但不可命中的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 gcov 忽略不可命中的 C++ 代码行?

XCUIElement 唯一标识符

iOS UITests - 如何区分两个不同的 XCUIElement?

使用 XCUIElement 上的谓词等待焦点 [重复]

如何查看 XCUIElement 树?

如何获取 XCUIElement 的值?