即使我能够使用名称检索它,也无法单击按钮

时间:2013-12-19 12:40:20

标签: unit-testing ui-automation white

  var navigator = BonusAppControllers.EbsControl.CurrentApp.GetWindow("XWindow").Get(SearchCriteria.ByAutomationId("AnimatedExplorerNavigator"));
  AutomationElement dashboardElement = navigator.AutomationElement.FindFirst(TreeScope.Subtree,SearchConditionFactory.CreateForName("NavigateLink_1").AutomationCondition);
  var dashBoardBtn = new Button(dashboardElement, navigator.ActionListener);
  dashBoardBtn.Click();

我将此代码用于名称为NavigateLink_1的按钮。现在,当我运行并调试它时,我发现我能够在dashBoardBtn变量中获得正确的按钮实例,但Click()函数不起作用。即使我尝试使用按钮名称来执行所有操作,如使用Get(SearchCriteria.ByText(" NavigateLink_1")),我也面临同样的问题。我尝试使用同一组按钮的其他按钮部分也是一样,但在这种情况下工作正常。

任何人都可以告诉我可能是什么问题。我正在使用White Framework和UI Spy作为我的应用程序的UI检查器

1 个答案:

答案 0 :(得分:1)

我没有使用White,但我使用了原生的UIA库。您偶尔遇到的问题是您将拥有一个可点击的对象,但根据内部处理点击的方式,您可能不一定能够使用InvokePattern执行点击。这可能是这种情况。

作为替代方法,您可以使用一些代码将鼠标光标移动到AutomationElement上,并使用P / Invoke发出单击。这有点像黑客,但是当你遇到这个问题时,这通常是最简单的选择。

private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;

[DllImport("user32.dll")]
private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);

...
...

AutomationElement buttonToClick;

...
...

Cursor.Position = buttonToClick.GetClickablePoint();
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, new IntPtr());
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, new IntPtr());