UI 测试失败并出现错误“无法在 15.0 秒内获取快照”

Con*_*sed 2 error-handling snapshot xctest xcode-ui-testing

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

15.0s内抓拍失败

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

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

我发现的一件奇怪的事情是,在访问单元格之前,我在调试器中打印对象,如下所示:

po print XCUIApplication().cells.debugDescription
Run Code Online (Sandbox Code Playgroud)

它显示一个错误,例如

15.0s内抓拍失败

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

该过程已返回到表达式求值之前的状态。

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

po print XCUIApplication().cells.debugDescription
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

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

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

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

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

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

最后也是最显着(也是危险)的改进是他们所说的“First Match API”。这带来了一些权衡/风险,但提供了最大的性能增益。它提供了一个新.firstMatch属性,可返回 XCUIElement 查询的第一个匹配项。使用 时,不会发生导致测试失败的不明确匹配.firstMatch,因此您可能会面临在 XCUIElement 上评估或执行您不打算执行的操作的风险。预计性能将提高约 10 倍,并且完全不会出现内存峰值。

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