C# UISpy和UIA验证在同一程序上显示不同的属性值

C# UISpy和UIA验证在同一程序上显示不同的属性值,c#,.net,ui-automation,microsoft-ui-automation,ui-spy,C#,.net,Ui Automation,Microsoft Ui Automation,Ui Spy,我有一个我正在测试的程序,它的关闭按钮在一个点启用,在另一个点禁用。 UISpy在两个点显示“isEnabled”为“true” UIAVerify在第一点显示“isEnabled”,在第二点显示“false” 后者是我可以从视觉上确认为真的,通过编程,我得到的值与UISpy相同,而我的测试用例失败了 使用System.Windows.Automation 树结构: 对话框“程序名” 标题栏“程序名” 按钮“关闭” 有人知道这可能是什么原因吗?UIA Verify是否使用与UISpy不同的库?U

我有一个我正在测试的程序,它的关闭按钮在一个点启用,在另一个点禁用。 UISpy在两个点显示“isEnabled”为“true” UIAVerify在第一点显示“isEnabled”,在第二点显示“false”

后者是我可以从视觉上确认为真的,通过编程,我得到的值与UISpy相同,而我的测试用例失败了

使用System.Windows.Automation

树结构: 对话框“程序名” 标题栏“程序名” 按钮“关闭”


有人知道这可能是什么原因吗?UIA Verify是否使用与UISpy不同的库?

UIA Verify 2.0使用更新的本机COM UIA库,该库与Windows 7一起在UIA 3.0更新中发布(也可作为单独的修补程序KB971513用于Vista和XP SP3)。另一方面,我认为UISpy使用了最初的托管API

我使用
.isEnabled()
.invoke()
方法处理托管库时遇到间歇性问题,我可以通过迁移到COM库来纠正这些问题,COM库总体上比托管库更稳定、更快

我记不起迁移过程的细节,但基本上您需要生成一个互操作DLL,它允许您的.NET应用程序调用本机UIA方法。然后,您可以选择创建自己的包装器库,或者可能使用下面提到的包装器库之一

我建议参考以下内容,以帮助实现过渡:

  • -早期尝试为COM API创建包装。我在直接使用它时遇到了麻烦,但最初看一下它是有帮助的。还可以搜索一些MSDN支持论坛上关于此包装器开发人员制作的COM API的帖子。不幸的是,我无法链接到它们,因为我的StackOverflow rep(长期潜伏者,第一次回答者)很低

  • -您可以看到,他们的源代码中有一个用于访问COM接口的UIAComWrapper。您还可以在该项目中查看他们是如何生成互操作DLL的


UIA Verify 2.0使用更新的本机COM UIA库,该库是在UIA 3.0更新中与Windows 7一起发布的(也可作为单独的修补程序KB971513用于Vista和XP SP3)。另一方面,我认为UISpy使用了最初的托管API

我使用
.isEnabled()
.invoke()
方法处理托管库时遇到间歇性问题,我可以通过迁移到COM库来纠正这些问题,COM库总体上比托管库更稳定、更快

我记不起迁移过程的细节,但基本上您需要生成一个互操作DLL,它允许您的.NET应用程序调用本机UIA方法。然后,您可以选择创建自己的包装器库,或者可能使用下面提到的包装器库之一

我建议参考以下内容,以帮助实现过渡:

  • -早期尝试为COM API创建包装。我在直接使用它时遇到了麻烦,但最初看一下它是有帮助的。还可以搜索一些MSDN支持论坛上关于此包装器开发人员制作的COM API的帖子。不幸的是,我无法链接到它们,因为我的StackOverflow rep(长期潜伏者,第一次回答者)很低

  • -您可以看到,他们的源代码中有一个用于访问COM接口的UIAComWrapper。您还可以在该项目中查看他们是如何生成互操作DLL的


UISpy是否可以缓存树?它可能会在第一次遇到元素时获取元素详细信息一次,而在第二次拾取相同的元素时只显示相同的信息。检查是否有一个“刷新”按钮或类似的按钮可以用来强制UISpy显示当前值。不是这样,我自己的自动化系统会根据需要实时获取信息,而不依赖缓存信息,而且它仍然与UISpy显示的内容相同。此外,如果程序在“ISFETCH”- false状态之后启动UISPY,UISPY仍然报告它是真的。我有C++ MFC应用程序。它有一个带有一些选项卡页的选项卡控件。我在win2k3上。UISpy显示该控件的自动化ID,但UIAVerify不显示。我使用的是白色框架,它也无法识别选项卡控件,就像UIAVerify一样。Spy和Verify使用不同的库!。Xeno您找到两个用于查找控件的库了吗?提前谢谢。UISpy会缓存树吗?它可能会在第一次遇到元素时获取元素详细信息一次,而在第二次拾取相同的元素时只显示相同的信息。检查是否有一个“刷新”按钮或类似的按钮可以用来强制UISpy显示当前值。不是这样,我自己的自动化系统会根据需要实时获取信息,而不依赖缓存信息,而且它仍然与UISpy显示的内容相同。此外,如果程序在“ISFETCH”- false状态之后启动UISPY,UISPY仍然报告它是真的。我有C++ MFC应用程序。它有一个带有一些选项卡页的选项卡控件。我在win2k3上。UISpy显示该控件的自动化ID,但UIAVerify不显示。我使用的是白色框架,它也无法识别选项卡控件,就像UIAVerify一样。Spy和Verify使用不同的库!。Xeno您找到两个用于查找控件的库了吗?提前谢谢。