如何在 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 点击地图注释时访问标注视图的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个在 XCTest 中定义按钮或文本字段的 swift 文件?
iOS 和 Swift xctest 上的 Google SDK 1.9.1 麻烦