Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么UIAutomation中的FindFirst需要这么长时间?_C#_Mfc_Ui Automation - Fatal编程技术网

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

C# 为什么UIAutomation中的FindFirst需要这么长时间?,c#,mfc,ui-automation,C#,Mfc,Ui Automation,我正在尝试自动化我们的应用程序WinForms/MFC应用程序的一部分,以便能够执行自动化测试——然而,目前我正在努力寻找主菜单SysTreeView32控件——基本上是核心组件,它允许访问我需要测试的所有屏幕 我尝试使用AutomationElement.FindFirst和TreeWalker.GetFirstChild查找它,但这两种方法似乎都太慢了 有趣的是,当我在测试试图找到控件时开始与这个树状视图交互——比如展开/折叠一些项目,用鼠标在测试的应用程序上移动——控件几乎立即被找到 有什

我正在尝试自动化我们的应用程序WinForms/MFC应用程序的一部分,以便能够执行自动化测试——然而,目前我正在努力寻找主菜单SysTreeView32控件——基本上是核心组件,它允许访问我需要测试的所有屏幕

我尝试使用AutomationElement.FindFirst和TreeWalker.GetFirstChild查找它,但这两种方法似乎都太慢了

有趣的是,当我在测试试图找到控件时开始与这个树状视图交互——比如展开/折叠一些项目,用鼠标在测试的应用程序上移动——控件几乎立即被找到


有什么问题吗?应用程序的反应非常平稳-当应用程序处于非活动状态时,只有查找过程需要很长时间。

我在尝试查找主窗口的子窗口时遇到了同样的问题。你应该提供尽可能多的细节,你可以过滤出来的东西,以便搜索速度更快。在我的例子中,我有一个“另存为”窗口,我添加了以下内容:

窗口应为ControlType.window 和条件 窗口的AutomationElement.NameProperty应为:另存为

var saveWindow=appElement.FindFirstTreeScope.Children | TreeScope.substands,new and ConditionNew Property ConditionAutomationElement.ControlTypeProperty,ControlType.Window,new Property ConditionAutomationElement.NameProperty,另存为

您需要进行进一步的测试,以确定您正在搜索的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更新机器中立即找到了元素,但在Windows 10周年纪念更新中被卡住了。。。因此,经过一些调试后,我发现我可以通过在子元素中搜索来找到元素,并立即在中找到它。两台机器:

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

您正在尝试搜索参数中的TreeScope?你是从哪个自动元素开始的?桌面/根?@VasilyRyabov TreeScope。子体在搜索中没有区别,我从应用程序的主窗口开始搜索,没有桌面/根节点。真正让我困惑的是,当窗口中有一些交互时,为什么UI自动化会很快找到元素。我在我的代码中观察到了这一点,但在e.q.UISpy中也观察到了这一点——当扩展此应用程序树的某些元素时,扩展可能需要更长的时间,但当将光标移动到应用程序上时,扩展速度非常快。请注意,“子代”和“后代”是不同的“子女”指父母的直系子女,其中“后代”还包括子女及其子女的子女“后代”可能是一个非常深入的搜索层次结构,并可能导致性能问题。如果您知道您的元素是直接子元素,请始终使用“Children”。搜索“后代”和“子女”是多余的,因为“后代”也包括“子女”。