我正在尝试使用 MS UI Automation 来测试 WPF 应用程序,并使用 Windows SDK 中包含的检查对象工具 (inspect.exe) 来查找某些元素上的 AutomationId 属性。
Inspect 对我来说表现得很奇怪:
如果我关闭所有应用程序并启动 WPF 应用程序和 Inspect,Inspect 能够看到各种 UI 元素的 AutomationId 属性。没有 AutomationId 的元素仅显示两个引号,表示空字符串 ("")。
在 WPF 应用程序中执行一些操作后,inspect.exe 挂起,我必须终止它并重新启动它。尽管机器的 CPU 和 RAM 利用率约为 50% 或更低,但我尝试等待几分钟(有几次可能接近 20 或 30 分钟),但无济于事。
我已经尝试按照 https://stackoverflow.com/a/7833728/44737 中的建议正常运行检查并以管理员身份运行检查,并且无论哪种方式,它的行为都是相同的。
我做错了什么(如果有的话)?我是否太不耐烦了,我是否需要等待很长时间而不是假设检查已挂起?为什么检查关于 AutomationId 的行为会有所不同?
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 并恢复到 Name 作为 AutomationId 值的后备。
但是有许多应用程序不依赖于.NET(浏览器、本机应用程序等)。通常,对于这些应用程序,使用其他属性会更容易。
我已经在 Microsoft Surface Studio PC(运行 Windows 10)上使用 Inspect.exe 一段时间了,我的经验是,当 Windows 更新挂起时,inspect.exe 会更频繁地挂起(有时总是)。当更新完成后,inspect.exe 仍然有点慢,但稳定得多。
等待inspect.exe响应的问题也发生在我身上。我很确定这与计算机的配置有关,但我不知道是什么。当我在沙箱上安装相同的 inform.exe 时,它在那里表现得非常完美。有没有人有办法解决这个问题?