为什么 Inspect.exe 经常挂起并且显示 AutomationId 不一致?

rob*_*rob 5 wpf ui-automation inspect microsoft-ui-automation

我正在尝试使用 MS UI Automation 来测试 WPF 应用程序,并使用 Windows SDK 中包含的检查对象工具 (inspect.exe) 来查找某些元素的 AutomationId 属性。

Inspect 对我来说表现得很奇怪:

  • 如果我关闭所有应用程序并启动 WPF 应用程序和检查,检查将能够查看各种 UI 元素的 AutomationId 属性。没有 AutomationId 的元素仅显示两个引号,表示空字符串 ("")。

  • 在 WPF 应用程序中执行一些操作后,inspect.exe 挂起,我必须终止它并重新启动它。尽管机器的 CPU 和 RAM 利用率约为 50% 或更低,但我尝试等待几分钟(有几次可能接近 20 或 30 分钟),但无济于事。

  • 重新启动后,inspect.exe 无法再找到任何 UI 元素的 AutomationId,即使是那些之前有的元素。更重要的是,当鼠标悬停在 WPF 应用程序上时,该属性完全消失——它根本不再列出,甚至没有空字符串值。
  • 如果我将鼠标移动到另一个屏幕(具体来说,使用无边框鼠标移动到另一台计算机),AutomationId 属性会重新出现,且值为“FormDot”
  • 如果我在 WPF 应用程序仍在运行时仅重新启动检查额外几次,则检查的行为仍与第一次重新启动后相同。
  • 如果我在检查仍在运行时仅重新启动 WPF 应用程序,则检查的行为仍与首次重新启动后相同。
  • 如果我关闭检查和 WPF 应用程序,然后启动检查,然后启动 WPF 应用程序,一切都会正常工作一段时间,并且检查会在 WPF 应用程序中的几个元素上找到 AutomationId...直到检查挂起为止再次。

我尝试按照/sf/answers/548360991/中的建议正常运行检查并以管理员身份运行检查,并且无论哪种方式,它的行为都是相同的。

如果有的话,我做错了什么?我是否太不耐烦了,我是否需要等待很长时间而不是假设检查已挂起?为什么检查关于 AutomationId 的行为会有所不同?

Sim*_*ier 4

Inspect.exe 有多个版本。据我所知,最新的版本是 2012 年的,在帮助/关于对话框中显示版本为 7.2.0.0。

旧版本的左侧没有树视图,所有检测到的自动化元素都显示在树中,因此很容易检查您是否使用了正确的视图。

最新的工具工作得相当正确,但是,恕我直言,迄今为止使用 UI 自动化的最佳工具是Visual UI Automation verify。它是一个 .NET 程序,其源代码可在此处获取: UI 自动化验证 (UIA 验证) 测试自动化框架

请注意,虽然它是一个 .NET 程序,但它不使用标准 .NET 自动化 dll(更多信息请参见:UISpy.exe 和 Inspect.exe 的区别是什么?(来自 Microsoft Windows SDK))。

关于AutomationId属性,为了澄清我对这个问题的最初评论,我的意思是它的有用性取决于您尝试自动化的程序。

如果您作为开发人员拥有它,那么它显然很有趣。例如,如果您正在使用 WPF,则可以使用该x:Uid属性,它显然是用于 UI 自动化。在 Winforms 空间中,它也非常有用,因为 UI 自动化默认情况下将使用控件的AccessibleName并恢复为作为 AutomationId 值的后备名称。

但有许多应用程序不依赖于.NET(浏览器、本机应用程序等)。通常,对于这些应用程序,使用其他属性更容易。