如何在没有实现任何模式的情况下操作控件?

我正在尝试通过UIAutomation为我们的项目实施自动化测试。 但是很多控件都不是标准的,并且对于那些控件也没有实现正确的模式。 在这种情况下,我应该如何通过UIAutomation框架操纵控件?

例如,我们产品中的按钮是通过窗格实现的,调用的模式也没有实现。 我该如何点击按钮? (为了避免在测试机上安装VS,我不想在Microsoft.VisiualStudio.TestTools.UITesting命名空间中使用Mouse.Click() )有没有办法只使用UIAutomation框架或.net中嵌入的其他内容框架? 提前致谢! (如果实现了正确的模式,下面的代码将起作用。作为新用户,我无法发布截图供您参考,抱歉!)

 object temp = null; if (btnTest.TryGetCurrentPattern(InvokePattern.Pattern, out temp)) { InvokePattern btnTestPattern = temp as InvokePattern; btnTestPattern.Invoke(); } 

在未实现控件模式时进行交互的唯一方法是单击周围的东西。 我建议尝试按照以避免最大错误。

  1. 在发送单击之前,请确保按钮的父级(窗格或窗口设置为前景)
  2. 而不是将点击发送到AutomationElement的角落,尝试在元素的中点发送,
  3. 另外,首先尝试将鼠标hover在元素上,等待200毫秒,然后发送单击,这样你就确定会看到执行。[相信我,这有助于调试很多并避免许多问题。]

最好的事情是,如果实现该系统的那些人将在其UI元素中实现服务器端UIA提供程序 !

但通常这是不可能的……,我使用了以下解决方法(至少用于点击/切换):

 AutomationElement yourAE = ...// some code to find the right AutomationElement (AE) clickablePoint = yourAE.GetClickablePoint(); 

BoundingRectangleProperty也可以提供帮助

如果您收到可点击的点,则可以使用

 System.Windows.Forms.Cursor.Position = new System.Drawing.Point((int)clickablePoint.X, (int)clickablePoint.Y); 

移动到该位置,然后通过InputSimulator或一些win32(user32.dll)命令单击它。 (注意:当然你也可以使用InputSimulator或win32来移动鼠标 – 但是当涉及到具有不同位置或分辨率的多个屏幕时,我对InputSimulator有一些问题 – 所以Cursor.Position是最简单的方法,这也很可靠)