【问题标题】:UI testing fails with error "Failed to get snapshot within 15.0s"UI 测试失败并出现错误“无法在 15.0 秒内获取快照”
【发布时间】:2017-11-09 18:41:50
【问题描述】:

我有一个包含大量单元格的表格视图。我试图从这个表格视图中点击一个特定的单元格。但是测试以这个错误结束:

未能在 15.0s 内获取快照

我假设,系统会在访问其元素之前拍摄整个表格视图的快照。由于cell数量巨大,快照时间不够(15秒可能是系统默认时间)。

我手动设置睡眠时间/wait time(我设置了 60 秒)。 60 秒后我仍然无法访问单元格!!

我发现一个奇怪的事情是,在访问单元格之前,我在调试器中打印对象是这样的:

po print XCUIApplication().cells.debugDescription

它显示类似的错误

未能在 15.0s 内获取快照

错误:执行被中断,原因:内部ObjC异常断点(-3)..

进程已经返回到表达式求值前的状态。

如果我再次使用打印相同的对象

po print XCUIApplication().cells.debugDescription

现在它将在 Debugger 视图中打印 tableview 中的所有单元格。

不知道为什么会发生这种情况。有没有人遇到过类似的问题?需要帮助!!

【问题讨论】:

    标签: error-handling xctest snapshot xcode-ui-testing


    【解决方案1】:

    我假设,系统会在访问其元素之前拍摄整个表格视图的快照。

    您的假设是正确的,但故事还有更多。 UI 测试从应用程序请求快照。应用程序获取此快照,然后将快照发送到测试最终评估查询。对于非常大的快照(例如您的表格视图),这意味着:

    1. 应用程序生成快照需要很长时间,并且
    2. 快照需要很长时间才能发送回测试以进行查询评估。

    我现在参加 WWDC 2017,有很多关于测试的好消息 - 特别是一些可以解决您确切问题的事情。我会在这里概述它,但你应该去观看WWDC 2017 Session 409 并跳到时间戳 17:10。

    第一个改进是远程查询。这是测试将查询传输到应用程序的地方,应用程序将从测试远程评估该查询,然后仅传输回该查询的结果。预计此增强功能会带来约 20% 的速度提升和约 30% 的内存减少。

    第二个改进是查询分析。此增强功能将通过使用用于拍摄快照的最小属性集来减少所拍摄快照的大小。这意味着在评估查询时,默认情况下不会拍摄视图的完整快照。例如,如果您要查询点击按钮,则快照将仅限于视图中的按钮。这意味着编写不那么模糊的查询更加重要。 IE。如果您想点击导航栏按钮,请在查询中指定它,例如 app.navigationBars.buttons["A button"]。您将看到此增强功能带来更多性能提升约 50% 的速度和约 35% 的内存消耗

    最后一个也是最显着(也是最危险)的改进是他们所称的 First Match API。这带来了一些权衡/风险,但提供了最大的性能提升。它提供了一个新的 .firstMatch 属性,该属性返回 XCUIElement 查询的第一个匹配项。使用.firstMatch 时不会出现导致测试失败的模糊匹配,因此您冒着评估或执行您不打算对 XCUIElement 执行的操作的风险。预计性能提升约 10 倍,而且完全没有内存峰值。

    所以,为了回答您的问题 - 更新到 Xcode 9、macOS High Sierra 和 iOS 11。利用.firstMatch,您可以在其中处理高度具体的查询,并且应该解决您的快照超时问题。事实上,您遇到的超时问题可能已经通过远程查询和查询分析获得的一般改进得到解决,而无需使用.firstMatch

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      相关资源
      最近更新 更多