如何在 xctest 中使用 swift 点击地图注释时访问标注视图

Posted

技术标签:

【中文标题】如何在 xctest 中使用 swift 点击地图注释时访问标注视图【英文标题】:How to access callout view on clicking on map annotation using swift in xctest 【发布时间】:2019-10-09 09:32:42 【问题描述】:

我想访问标注视图并在这些视图上做一些UIAutomation。我可以单击地图标记/注释,但无法访问标注视图。 以下代码用于点击标记:

let marker = app.otherElements.matching(identifier: "mapMarker").element(boundby: 0)
marker.tap();

在此之后,我得到了受人尊敬的标记/注释的标注视图。 我需要访问该标注。 请就此向我提出建议。

【问题讨论】:

标注视图是否有可访问性标识符? 标注视图也采用与标记/注释相同的标识符。 【参考方案1】:

你应该在标注下雪后创建一个断点, 然后在lldb 中输入po print(app.debugDescription)(或者在XCode 11 中直接输入po app)以查看UI 元素的整个层次结构。

找到所需的元素并在代码中进一步访问它。

另外,考虑用更短的方式重写你的标记代码:

let marker = app.otherElements["mapMarker"].firstMatch

请注意firstMatch 在找到第一个元素后中止搜索。

删除firstMatch,如果你想检查元素是否唯一

let marker = app.otherElements["mapMarker"]

【讨论】:

我已经检查了上面的 po print(app.debugDescription)。标注信息未显示 UI 层次结构。 视图应该是一个可访问性元素才能出现在这个层次结构中。这需要适当地调整应用程序代码。请参考developer.apple.com/documentation/uikit/accessibility/… 此语法:app.otherElements["mapMarker"].firstMatch:如果提供视图的模型是通过网络调用支持的,则可能会导致 uitests 不稳定。 ["mapMarker"] 过滤机制只会尝试 3 次才放弃。您可能想要编写一个使用期望的方法来等待期望的元素出现【参考方案2】:

和 Smart Monkey 说的一样,但是要根据 ablarg 的评论添加更多代码:

例如:“mapMarker”是元素的可访问性 ID

    let mapMarker = app.maps.otherElements["mapMarker"].firstMatch
    let mapMarkerExists = mapMarker.waitForExistence(timeout: 3)
    if mapMarkerExists 
      mapMarker.tap()
  

waitForExistence(timeout:) 返回一个布尔值,因此如果元素在超时到期之前出现(它找到了元素),则对元素执行操作(点击)。

确保元素已启用可访问性并设置了可访问性 ID。

【讨论】:

以上是关于如何在 xctest 中使用 swift 点击地图注释时访问标注视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift/XCTest 中写入本地文件?

如何创建一个在 XCTest 中定义按钮或文本字段的 swift 文件?

iOS 和 Swift xctest 上的 Google SDK 1.9.1 麻烦

在 Swift XCTest 案例中,navigationController 为零

XCTest:如何从数组中点击按钮

如何使用 XCTest for iOS 14 取消通话