用途:当 Compose 测试中的查找器失败(如 onNodeWithTag 报 “Expected exactly '1' node” 或 “found N nodes”),用于打印实际语义树进行诊断。此类失败通常是结构性的:tag 写错、匹配的是合并树而 tag 在叶节点上,或节点尚未组合,与时间无关。
主要能力:使用 rule.onRoot().printToLog("DEBUG") 打印合并树,默认 maxDepth 为 Int.MAX_VALUE,输出完整子树;若目标节点被合并隐藏,改用 rule.onRoot(useUnmergedTree = true).printToLog("DEBUG")。还可用 printToString() 捕获为字符串用于 CI 日志。
读输出语法:节点行含 Node #id、像素边界、Tag;配置项按 key 字母排序;Unit 值汇总为 [Disabled, IsTraversalGroup…];函数值汇总为 Actions = […];底部有 MergeDescendants、ClearAndSetSemantics 标记;子节点以 “ |-” 缩进。当报错末尾出现 “These nodes were found in the unmerged tree…use useUnmergedTree = true” 时,应据此翻转该查找器的 useUnmergedTree。
自定义匹配器可用 fetchSemanticsNode / fetchSemanticsNodes 直接访问 SemanticsNode,并建议传 errorMessageOnFail 提供诊断信息。对集合查找器 printToLog 默认 maxDepth 为 0,需显式覆盖才能打印子节点。
限制:不得用 Thread.sleep “等节点出现”,查找失败是结构问题,更多真实时间不会生成节点。合并树优先,仅在节点被折叠时才升到 useUnmergedTree = true。若症状是时序(动画未结束、idling resource 忙),或问题属于无障碍违规、或应按文本而非 tag 查找,应改用其他技能。
原文所述要求:安装 androidx.compose.ui:ui-test 作为 androidTestImplementation 或 testImplementation,并已有 ComposeTestRule 或 ComposeUiTest,无需额外骨架设置。参考来源包括 Output.kt、SemanticsNodeInteraction.kt 与官方 Compose 语义/测试文档。