如何访问未实现 AutomationPeer 类的 WPF 自定义控件的内部元素?

发布于 2024-10-16 17:29:26 字数 1057 浏览 2 评论 0原文

最近我从这篇文章中了解到 -

http://blogs.msdn.com/b/patrickdanino/archive/2009/11/11/custom-controls-and-ui-automation.aspx

- WPF 中的控件负责公开它们的 UIA 项本身以及自定义控件的任何新添加的功能在通过相应 AutomationPeer 类的实现公开之前都不可用于 UIA。在我的工作中,我被分配对使用大量工具栏的 WPF 应用程序进行 UI 测试自动化。问题是,通过 Microsoft UI 自动化库,我可以访问 ToolBars(显然是作为自定义控件开发的)作为 AutomationElements,但我无法访问其中的按钮 - 子代/后代集合计数始终返回 0。当使用编码 UI 测试时,测试总是失败并显示以下错误消息:

测试方法 CAM2QDummyTest.CodedUITest2.CodedUITestMethod1 抛出异常:

Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToPerformActionOnBlockedControlException: 另一个控制是阻止 控制。请屏蔽 控制可见并重试该操作。 其他详细信息:

技术名称:“MSAA”

名称:“标准”

控件类型:“工具栏”

---> System.Runtime.InteropServices.COMException: HRESULT 异常:0xF004F003

显然他们没有实现相应的 AutomationPeer 类。现在,我只有应用程序,没有源代码。所以我无法按照我上面提到的文章中描述的方式解决这个问题。任何人都可以帮助我提供任何线索如何访问工具栏的内部按钮吗?任何建议将不胜感激。

Recently I came to know from this article -

http://blogs.msdn.com/b/patrickdanino/archive/2009/11/11/custom-controls-and-ui-automation.aspx

-that controls in WPF are responsible for exposing their UIA items themselves, and any newly added functionalities of a custom control aren’t available to the UIA until they are exposed through the implementation of the corresponding AutomationPeer class. At my work I have been assigned to the automation of UI testing of a WPF application that employs a large number of ToolBars. The problem is, through Microsoft UI Automation Library I can access the ToolBars (apparently which are developed as custom control) as AutomationElements, but I cannot access the Buttons inside them – Count of Children/Descendant Collection always return 0. When using Coded UI Test, the tests always fail and shows the following Error Message:

Test method
CAM2QDummyTest.CodedUITest2.CodedUITestMethod1
threw exception:

Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToPerformActionOnBlockedControlException:
Another control is blocking the
control. Please make the blocked
control visible and retry the action.
Additional Details:

TechnologyName: 'MSAA'

Name: 'Standard'

ControlType: 'ToolBar'

--->
System.Runtime.InteropServices.COMException:
Exception from HRESULT: 0xF004F003

Apparently they didn’t implement the corresponding AutomationPeer classes. Now, I only have the application, not the source code. So I cannot solve the problem in the way described in the article I mentioned above. Can anyone HELP with any clue how can I get access to the inner Buttons of the ToolBars? Any suggestion will be gratefully appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

纸伞微斜 2024-10-23 17:29:26

您可以通过 AutomationElement.GetSupportedProperties()AutomationElement.GetSupportedPatterns() 查看支持哪些模式和属性,看看是否有您可以使用不同的图案。可能有列表元素等,通过 SelectionPattern 或类似的方式可以让您访问按钮。

否则,请与供应商联系并要求他们添加相关的同行。

您始终可以获取坐标(可能通过 BoundingRectangleProperty),然后使用 Win32 函数在适当的位置模拟鼠标单击。可恶的。 此帖子可能会有所帮助。

You can have a look at what patterns and properties are supported via AutomationElement.GetSupportedProperties() and AutomationElement.GetSupportedPatterns() to see if there's a different pattern which you can use. It might be that there are list elements, etc. via SelectionPattern or similar which will give you access to the buttons.

Otherwise, get in touch with the vendors and ask them to add the relevant peers.

You can always get the coordinates (maybe by the BoundingRectangleProperty) then use Win32 functions to simulate a mouse click in the appropriate place. Nasty. This thread might help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文