我已经进行了一些过去一年的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安装和笔记本电脑以达到同样的效果。
只是寻找一些建议,我想知道是否有其他人看过这个问题?
答案 0 :(得分:5)
这个问题有几种可能的解决方案。
tap()
方法。 XCTestCase
可以自动滚动到给定元素,并在使用tap()
方法时点击它。
let predicate = NSPredicate(format: "label == %@", "12")
let cell = table.cells.containing(predicate).element
cell.tap()
您可以使用swipeUp()
代替XCUICoordinate.press(forDuration:thenDragTo:)
方法。这有点棘手,因为你必须处理XCUICoordinate
对象。
从底部到顶部滑动的示例用法:
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
作为最低价值,则会打开控制中心。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)以及更多内容的情况。