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

use*_*712 2 xcode ios xcode-ui-testing

我已经进行了一些过去一年的UI测试,他们每晚都会运行,我们设置了一台显示器,这样我们就可以看到它们何时出现故障,而且几个月和几个月都没问题.

今天早上我们将机器更新为Xcode 8.3.2,将构建服务器从8.2更新到8.3.2,现在UI测试不再通过.

我有一个包含12个单元格的tableView,前6个是可见的,但我想按最后一个单元格,所以我调用swipeUp()来滚动tableView.通常,tableView将滚动一两秒,我想要的单元格变得可见,我可以断言它存在并在其上调用tap().

然而,现在,当观看UI测试运行时,当调用swipeUp()方法时,它不再滚动很长时间.它似乎只滚动几毫米然后停止,这意味着断言失败,我们无法点击单元格,因此我们所有的UI测试都失败了.

我在网上搜索过这个,除了这个似乎有同样问题的小片段之外,找不到太多信息.

我试图按照建议删除swipeUp()调用,但这似乎没有解决问题,我们已经测试了几个Xcode安装和笔记本电脑以达到同样的效果.

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

Bar*_*nda 5

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

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

    let predicate = NSPredicate(format: "label == %@", "12")
    let cell = table.cells.containing(predicate).element
    cell.tap()
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

    请注意值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()
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    此外,该库可以处理键盘可见的情况,处理不同的设备方向(rdar:// 31529903,gist)等等.