尝试在 Xcode 11 中的 UITesting 期间滚动 MapView



简单地说,我希望有一个自动测试作为我的UI测试套件的一部分,可以滚动地图。我不关心位置,我只需要将其从原始位置移动即可。

为什么?

两个原因:

  1. 用户与地图交互后,UI 将更新。我希望验证这些更改
  2. 虽然我可以轻松地在设备上验证这一点,但我还想通过快速通道包含自动屏幕截图。让测试执行此功能使这成为可能

到目前为止,我测试了什么?

我从相关问题中发现了以下内容并进行了测试,但没有成功:

let map = app.maps.element
let start = map.coordinate(withNormalizedOffset: CGVector(dx: 200,
dy: 200))
let end = map.coordinate(withNormalizedOffset: CGVector(dx: 250,
dy: 250))
start.press(forDuration: 0.01, thenDragTo: end)

我可以确认map元素设置正确并包含预期的信息。 我还可以确认我正在使用的坐标是否在屏幕上地图的范围内。为了以防万一,我还测试了各种其他值。

我不关心它是如何移动的,或者它被移动到哪里。我所需要的只是复制一个将地图移动 1 点的用户。

coordinate(withNormalizedOffset:)的工作方式略有不同。Vektor 将乘以对象的大小。

来自苹果的文档:

坐标的屏幕点是通过添加归一化偏移量来计算的 乘以元素帧的大小到原点 元素的框架。

这意味着,如果你想开始拖动地图的中心,然后稍微拖动地图,你必须像这样使用它:

let map = app.maps.element
let start = map.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
let end = map.coordinate(withNormalizedOffset: CGVector(dx: 0.6, dy: 0.6))
start.press(forDuration: 0.01, thenDragTo: end)

这会将起始坐标置于0.5 * map.frame.width0.5 * map.frame.height处,结束坐标置于0.6 * map.frame.width0.6 * map.frame.height

当你用它运行 UITest 时,你会看到它拖动了地图。

使用您的参数,它将起始坐标放在屏幕外的200 * map.frame.width200 * map.frame.height处,因此不会发生拖动。

最新更新