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

时间:2016-11-29 22:16:21

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

我正在尝试使用MS UI Automation来测试WPF应用程序,并使用Windows SDK附带的Inspect Object工具(inspect.exe)来查找某些元素的AutomationId属性。

Inspect对我来说非常奇怪:

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

  • 在WPF应用程序中执行一些操作后,inspect.exe挂起,我必须将其删除并重新启动它。尽管机器的CPU和RAM利用率在50%左右或更低,但我已经尝试了几分钟 - 有时可能接近20或30分钟 - 但无济于事。

  • 重新启动后,inspect.exe无法再为任何UI元素找到AutomationId,即使是之前已经拥有它们的UI元素也是如此。更重要的是,当鼠标悬停在WPF应用程序上时,该属性完全丢失 - 它根本不再列出,甚至没有空字符串值。
  • 如果我将鼠标移动到另一个屏幕(特别是移动到另一台计算机,使用无边界鼠标),则AutomationId属性将重新显示,其值为“FormDot”
  • 如果我在WPF应用程序仍在运行时重新启动仅检查其他时间,则检查仍然与第一次重启后的行为相同。
  • 如果我在检查仍在运行时仅重新启动WPF应用程序,则检查仍然与首次重启后的行为相同。
  • 如果我关闭了inspect和WPF应用程序,然后启动检查,然后启动WPF应用程序,一切正常工作一段时间,检查在WPF应用程序中的几个元素上找到AutomationId ......直到哪个检查再次挂起。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

最新的一个工作正常,但是,恕我直言,迄今为止使用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 Automation将使用控件的AccessibleName,并且对于AutomationId值,还原为Name作为后备。

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

答案 1 :(得分:0)

我在Microsoft Surface Studio PC(运行Windows 10)上使用inspect.exe已有一段时间了,我的经验是,在Windows Update挂起时,inspect.exe会更频繁地挂起(有时总是挂起)。如果无法进行更新,则inspect.exe仍然有些慢,但要稳定得多。