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

Wpf 为什么Inspect.exe经常挂起并且显示AutomationId不一致?,wpf,ui-automation,inspect,microsoft-ui-automation,Wpf,Ui Automation,Inspect,Microsoft Ui Automation,我正在尝试使用MS UI Automation测试WPF应用程序,并使用Windows SDK附带的Inspect对象工具(Inspect.exe)查找某些元素的AutomationId属性 我觉得Inspect的行为很奇怪: 如果关闭所有应用程序并启动WPF应用程序并进行检查,Inspect将能够看到各种UI元素的AutomationId属性。没有AutomationId的元素只显示两个引号,表示空字符串(“”) 在WPF应用程序中执行一些操作后,inspect.exe挂起,我必须杀死它并重

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

我觉得Inspect的行为很奇怪:

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

  • 在WPF应用程序中执行一些操作后,inspect.exe挂起,我必须杀死它并重新启动它。尽管这台机器的CPU和RAM利用率大约在50%或更低,但我尝试过等待几分钟——有时可能接近20或30分钟——都没有用

  • 重新启动后,inspect.exe再也找不到任何UI元素的AutomationId,即使是以前有AutomationId的UI元素。更重要的是,当鼠标悬停在WPF应用程序上时,该属性完全丢失了——它不再列出,甚至没有空字符串值
  • 如果我将鼠标移动到另一个屏幕(特别是使用无边框鼠标移动到另一台计算机),AutomationId属性将以“FormDot”值重新出现
  • 如果在WPF应用程序仍在运行时仅重新启动inspect附加次数,则inspect的行为仍与第一次重新启动后相同
  • 如果在inspect仍在运行时仅重新启动WPF应用程序,inspect的行为仍与第一次重新启动后相同
  • 如果我同时关闭inspect和WPF应用程序,然后启动inspect,然后启动WPF应用程序,一切都会正常工作一段时间,inspect会在WPF应用程序中的几个元素上找到AutomationId…直到inspect再次挂起为止
我已经试着正常运行inspect,并按照中的建议以管理员身份运行inspect,但无论哪种方式,它的行为都是相同的


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

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

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

最新的一个工作非常正确,然而,IMHO,迄今为止与UI自动化一起工作的最好工具是。这是一个.NET程序,其源代码可在此处找到:

请注意,尽管它是一个.NET程序,但它不使用标准的.NET自动化DLL(此处有更多介绍:)

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

如果你以开发者的身份拥有它,它显然很有趣。例如,如果您正在使用WPF,那么可以使用
x:Uid
属性,这显然是为了实现UI自动化。在Winforms空间中,它也非常有用,因为UI自动化将在默认情况下使用控件的,并将作为AutomationId值的回退还原为


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

我在Microsoft Surface Studio PC(运行Windows 10)上使用inspect.exe已经有一段时间了,我的经验是inspect.exe将更频繁地挂起(有时总是挂起)当Windows更新挂起时。当更新停止时,inspect.exe仍然有点慢,但更稳定。

您是否尝试过Visual UI Automation Verify?通常比检查好。此外,AutomationId是一个非常无用的属性(尽管我同意它的名字听起来很吸引人),你不应该依赖它;到目前为止,这个工具要可靠得多。把这写在一个答案里,我会接受的。关于AutomationId,你能详细说明一下为什么它是无用的吗?是不是因为它并不总是固定的?我是MS UIA的新手,我的团队尝试在有可用的情况下使用AutomationId。感谢提供更多详细信息!