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

标签 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. tap() 方法。当您使用 tap() 方法时,XCTestCase 可以自动滚动到给定元素并点击它。

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

关于ios - 自从从 8.2 更新到 Xcode 8.3.2 以来,我们的 UI 测试失败,因为 UItableView 不再响应 swipeUp() 或 swipeDown(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616037/

相关文章:

swift - 无法将类型 'Pong.MenuVC' (0x1072ea808) 的值转换为 'Pong.GameViewController'

ios - XCode 崩溃报告(已符号化)缺少行号

ios - 如何等待 UI 元素而不导致测试用例失败

ios - 如何向 NSLinguisticTagger 添加名称?

ios - 如何在同一委托(delegate)类中将委托(delegate)方法作为选择器调用

ios - Apple 登录无法在 iOS 14 模拟器上运行

ios - 地理围栏无法正常工作

c++ - 关于 Xcode4 和 C++

ios - 在 Jenkins 上运行 Xcode UI 测试永远不会失败

ios - 标签的 UITest 颜色(不是 UI 标签)