自从8.2更新到Xcode 8.3.2后,我们的UI测试失败,因为UItableView不再响应swipeUp()或swipeDown()

时间:2017-04-25 16:19:24

标签: ios xcode xcode-ui-testing

我已经进行了一些过去一年的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安装和笔记本电脑以达到同样的效果。

只是寻找一些建议,我想知道是否有其他人看过这个问题?

1 个答案:

答案 0 :(得分:5)

这个问题有几种可能的解决方案。

  1. tap()方法。 XCTestCase可以自动滚动到给定元素,并在使用tap()方法时点击它。

    let predicate = NSPredicate(format: "label == %@", "12")
    let cell = table.cells.containing(predicate).element
    cell.tap()
    
  2. 您可以使用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.90.1

    • 如果您使用1.0作为最低价值,则会打开控制中心
    • 如果您使用上述方法实施“swipeDown”并使用0.0作为最高点,则会打开通知中心
  3. 如果需要多次滑动,您可以使用while循环(或类似)向上滚动,直到该单元格可见:

    let predicate = NSPredicate(format: "label == %@", "12")
    let cell = table.cells.containing(predicate).element
    while !cell.isHittable {
        table.swipeUp()
    }
    

    当然,还需要一些其他休息条件;)

  4. 您可以使用具有帮助方法的AutoMate库进行滑动,例如:swipe(to:)

    let predicate = NSPredicate(format: "label == %@", "12")
    let cell = table.cells.containing(predicate).element
    table.swipe(to: scrollPage.topButton)
    

    此外,此库可以处理键盘可见,处理不同设备方向(rdar://31529903gist)以及更多内容的情况。