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

本文关键字:长时间 UIAutomation 中的 FindFirst 为什么 | 更新日期: 2023-09-27 18:35:43

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

我试图用AutomationElement.FindFirst()找到它,也用TreeWalker.GetFirstChild(),但这两种方法似乎都太慢了。

有趣的是,一旦我在测试尝试查找控件期间开始与此 TreeView 交互 - 例如展开/折叠某些项目,将鼠标移到测试的应用程序上 - 控件几乎立即被找到。

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

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

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

  • 该窗口应为ControlType.Window
  • 和条件
  • 窗口的AutomationElement.NameProperty应为:"另存为"

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

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

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);