UI 测试失败并出现错误 "Failed to get snapshot within 15.0s"

UI testing fails with error "Failed to get snapshot within 15.0s"

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

Failed to get snapshot within 15.0s

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

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

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

po print XCUIApplication().cells.debugDescription

显示类似

的错误

Failed to get snapshot within 15.0s

error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..

The process has been returned to the state before expression evaluation.

如果我使用

打印相同的对象
po print XCUIApplication().cells.debugDescription

现在它将在调试器视图中打印 table 视图中的所有单元格。

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

I assume that, the system will take snapshot of the whole table view before accessing its element.

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

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

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

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

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

最后也是最没有table(也是危险的)改进是他们所谓的第一场比赛API。这带来了一些交易 offs/risks 但提供了最大的性能增益。它提供了一个新的 .firstMatch 属性 returns XCUIElement 查询的第一个匹配项。使用 .firstMatch 时不会发生导致测试失败的模糊匹配,因此您 运行 有风险评估或对 XCUI 元素执行您不打算执行的操作。预计性能提高约 10 倍,并且根本没有内存峰值。

所以,回答你的问题 - 更新到 Xcode 9,macOS High Sierra 和 iOS 11。在你可以使用高度具体的查询和时间问题的地方使用 .firstMatch out snapshots应该可以解决。事实上,您遇到的超时问题可能已经通过从远程查询和查询分析中获得的一般改进得到解决,而无需使用 .firstMatch!