我有一个包含大量细胞的表格视图。我试图从这个表视图中点击一个特定的单元格。但测试以此错误结束:
"Failed to get snapshot within 15.0s"
我认为,系统将在访问其元素之前拍摄整个表视图的快照。由于数量巨大的细胞,拍摄的快照时间不够(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
现在它将在Debugger视图中打印tableview中的所有单元格。
不知道为什么会这样。有没有人遇到类似的问题?需要帮助!!
答案 0 :(得分:0)
我认为,系统将在访问其元素之前拍摄整个表视图的快照。
你的假设是正确的,但故事还有更多。 UI测试从应用程序请求快照。应用程序获取此快照,然后将快照发送到测试,测试最终评估查询。对于非常大的快照(如表视图),这意味着:
我现在在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
!