我进行了一些 UI 测试,这些测试在过去的一年中一直有效,它们每天晚上都运行,我们设置了一个监视器,这样我们就可以看到它们何时失败,并且它们已经好几个月了。
今天早上,我们将机器更新为 Xcode 8.3.2,并将构建服务器从 8.2 更新为 8.3.2,现在 UI 测试不再通过。
我有一个包含 12 个单元格的 tableView,前 6 个单元格可见,但我想按最后一个单元格,所以我调用 swipeUp() 来滚动 tableView。通常,tableView 将滚动一两秒,我想要的单元格就会变得可见,我可以断言它存在并对其调用 tap() 。
但是现在,当观察 UI 测试运行时,当调用 swipeUp() 方法时,它不再滚动很长时间。它似乎只滚动了几毫米,然后就停止了,这意味着断言失败,我们无法点击单元格,因此所有 UI 测试都会失败。
我在网上搜索过这方面的信息,除了 this small snippet 之外找不到太多信息。这似乎和我有同样的问题。
我尝试按照建议删除 swipeUp() 调用,但这似乎无法解决问题,并且我们已经在多个 Xcode 安装和笔记本电脑上进行了测试,达到了相同的效果。
只是寻求一些建议,想知道是否有其他人看到过这个问题?
最佳答案
此问题有多种可能的解决方案。
tap()
方法。当您使用tap()
方法时,XCTestCase
可以自动滚动到给定元素并点击它。let predicate = NSPredicate(format: "label == %@", "12") let cell = table.cells.containing(predicate).element cell.tap()
除了使用
swipeUp()
方法,您还可以使用XCUICooperative.press(forDuration:thenDragTo:)
。这有点棘手,因为您必须处理XCUICooperative
对象。从下到上滑动的示例用法:
let bottom = table.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.9)) let top = table.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.1)) bottom.press(forDuration: 0.1, thenDragTo: top)
请记下值
0.9
和0.1
。- 如果您使用
1.0
作为底部值,您将打开控制中心。 - 如果您使用上述方法实现“swipeDown”并使用
0.0
作为顶点,您将打开通知中心。
- 如果您使用
如果需要多次滑动,您可以使用
while
循环(或类似的)向上滚动,直到单元格可见:let predicate = NSPredicate(format: "label == %@", "12") let cell = table.cells.containing(predicate).element while !cell.isHittable { table.swipeUp() }
当然,还需要一些其他中断条件;)
您可以使用AutoMate具有用于滑动的辅助方法的库,例如:
swipe(to:)
。let predicate = NSPredicate(format: "label == %@", "12") let cell = table.cells.containing(predicate).element table.swipe(to: scrollPage.topButton)
此外,该库还可以处理键盘可见的情况、处理不同的设备方向( rdar://31529903 、 gist )等等。
关于ios - 自从从 8.2 更新到 Xcode 8.3.2 以来,我们的 UI 测试失败,因为 UItableView 不再响应 swipeUp() 或 swipeDown(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616037/