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

时间:2011-02-09 09:43:23

标签: wpf custom-controls ui-automation coded-ui-tests

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

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

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

  

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

     

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

     

TechnologyName:'MSAA'

     

名称:'标准'

     

ControlType:'ToolBar'

     

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

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

1 个答案:

答案 0 :(得分:3)

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

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

您始终可以获取坐标(可能是通过BoundingRectangleProperty),然后使用Win32函数在适当的位置模拟鼠标单击。讨厌。 This thread可能有帮助。