error-handling - UI 测试失败,错误为 "Failed to get snapshot within 15.0s"

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

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

Failed to get snapshot within 15.0s

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

我手动设置 sleep 时间/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

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

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

最佳答案

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

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

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

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

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

第二个改进是查询分析。此增强功能将通过使用拍摄快照的最小属性集来减少拍摄快照的大小。这意味着在评估查询时默认情况下不会拍摄 View 的完整快照。例如,如果您查询点击按钮,快照将仅限于 View 中的按钮。这意味着编写不太模糊的查询更为重要。 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!

关于error-handling - UI 测试失败,错误为 "Failed to get snapshot within 15.0s",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429118/

相关文章:

git - 初始化 git 仓库对 linux 根目录的影响 3 :)

amazon-web-services - 如何使用 AWS Lambda 捕获无服务器网站屏幕截图?

flutter - 如何使用 FutureBuilder 手动触发 AsyncSnapshot 错误

swift - 如何将 XCTAssertNil 与可选结构一起使用?

XCTest 输出到文件

java - 如何检查我是否从java插入数据库

haskell - 'readFile'的异常处理

xcode - 将环境变量传递给 XCUITest

php - Codeigniter 数据库连接错误

c# - 我怎样才能 catch 404?