wpf - 为什么 Inspect.exe 会频繁挂起且显示的 AutomationId 不一致?

标签 wpf ui-automation inspect microsoft-ui-automation

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

检查对我来说很奇怪:

  • 如果我关闭所有应用程序并启动 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 ......直到检查挂起的点再次。

  • 我已经尝试按照 https://stackoverflow.com/a/7833728/44737 中的建议正常和以管理员身份运行检查,并且它的行为方式相同。

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

    最佳答案

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

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

    最新的工作非常正确,但是,恕我直言,迄今为止使用 UI 自动化的最佳工具是 Visual UI Automation Verify .这是一个 .NET 程序,其源代码可在此处获得: UI Automation Verify (UIA Verify) Test Automation Framework .

    请注意,虽然它是一个 .NET 程序,但它不使用标准的 .NET 自动化 dll(更多信息请点击此处:What's the difference of UISpy.exe and Inspect.exe? (From Microsoft Windows SDK))。

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

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

    但是有很多不依赖.NET 的应用程序(浏览器、原生应用程序等)通常,对于这些应用程序,使用其他属性会更容易。

    关于wpf - 为什么 Inspect.exe 会频繁挂起且显示的 AutomationId 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876768/

    相关文章:

    c# - 如何以编程方式设置附加属性?

    c# - 在 RichTextBox C# WPF 中设置插入符位置

    基于 Java 的 GUI 自动化(不限于基于 Java 的 GUI,如 Swing)

    c# - 将当前应用程序作为单个实例运行并显示上一个实例

    wpf - 使用 RelayCommand 将复杂数据发送到 MVVM 模型

    c# - 将多个形状组合在一起的最佳方法是什么?

    python - Python 中检查对象属性是否分配了 DataFrame 的最有效方法?

    java - 在运行时检查 SWT 应用程序?

    c# - AcceleratorKey 和 AccessKey 有什么区别

    mobile - 如何验证 IOS 设备的响应能力?