为什么UIAutomation中的FindFirst需要这么长时间?

时间:2014-12-30 14:21:01

标签: c# mfc ui-automation

我试图自动化我们的应用程序WinForms / MFC应用程序的一部分(能够执行自动化测试) - 但是,目前我正在努力寻找主菜单的缓慢发现(SysTreeView32控件) - 基本上是中央组件,可以访问我需要测试的所有屏幕。

我尝试使用AutomationElement.FindFirst()TreeWalker.GetFirstChild()找到它,但这两种方法看起来都太慢了。

有趣的是,一旦我在测试试图找到控件时开始与TreeView进行交互 - 比如展开/折叠一些项目,用鼠标移动到测试的应用程序上 - 几乎立即找到控件。 / p>

捕获的是什么?应用程序反应非常顺利 - 当应用程序处于非活动状态时,只有查找过程需要很长时间。

1 个答案:

答案 0 :(得分:0)

我在尝试找到主窗口的孩子时遇到了同样的问题。您应该尽可能多地提供详细信息(过滤掉内容),以便更快地进行搜索。就我而言,我有一个另存为窗口,我添加了以下内容:

  • 窗口应为ControlType.Window
  • AndCondition
  • 窗口的AutomationElement.NameProperty应为:“另存为”

    var saveWindow = appElement.FindFirst(TreeScope.Children | TreeScope.Descendants,new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.Window),new PropertyCondition(AutomationElement.NameProperty,“Save As”)));

您需要进行进一步的测试,以确定您要搜索的AutomationElement是否可以在后代或子项中找到,并在必要时跳过其中一个搜索。在我的情况下,上面的代码工作正常,但在后续步骤中,我需要找到“文件名:”旁边的编辑控件/文本框,所以我首先创建了一个条件:

var saveWindow = appElement.FindFirst(TreeScope.Children | TreeScope.Descendants, new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window), new PropertyCondition(AutomationElement.NameProperty, "Save As")));

然后将条件添加到搜索中:

var fileName = saveWindow.FindFirst(TreeScope.Children | TreeScope.Descendants, fileNameCondition);

奇怪的是,可能是因为UIAutomation限制和意外行为,上面的一行是在Windows 10 Creators Update机器中立即找到该元素,但是在Windows 10周年更新中被卡住了...所以经过一些调试我发现我可以通过搜索孩子找到这个元素,然后立即找到它。两台机器:

var fileName = saveWindow.FindFirst(TreeScope.Children, fileNameCondition);