gpt4 book ai didi

WPF UI 自动化 - AutomationElement.FindFirst 在有大量元素时失败

转载 作者:行者123 更新时间:2023-12-04 06:51:51 26 4
gpt4 key购买 nike

我们为 WPF 应用程序 (.NET 4) 提供了一些自动化的 UI 测试;这些测试使用 UI Automation蜜蜂。

我们调用 AutomationElement.FindFirst找到一个目标元素,然后与之交互。

示例(伪代码):

var nameEquals = new PropertyCondition(AutomationElement.NameProperty, "OurAppWindow");
var appWindow = DesktopWindow.FindFirst(TreeScope.Children, nameEquals);
// this succeeds

var idEquals = new PropertyCondition(AutomationElement.AutomationIdProperty, "ControlId");
var someItem = appWindow.FindFirst(TreeScope.Descendants, idEquals);
// this suceeds sometimes, and fails sometimes!

问题是, appWindow.FindFirst有时会失败并返回 null,即使该元素存在。我编写了一个辅助函数,它手动遍历 UI 自动化树并将其打印出来,并且在所有情况下都存在具有正确 ID 的元素。

这似乎与窗口中还显示了多少其他项目有关。如果没有其他项目,那么它总是成功,但是当有许多其他复杂的 UI 元素显示在它旁边时,则查找失败。

看起来好像我们达到了某种内部元素限制。我找不到针对任何自动化 API 提到的任何文档化元素限制 - 有没有办法解决这个问题?我想我可能必须编写自己的 FindFirst 实现树本身是手动行走的...据我所知这应该可以工作,因为我的树打印机实用程序功能正是这样做的,而且没关系,但似乎这将是不必要且缓慢的:-(

任何帮助将不胜感激

最佳答案

手动执行树遍历可能是解决此问题的最佳方法。

实际上,您可能会发现 FindFirst 的实现使用 tree walk 会比使用 FindFirst 更快在具有大量子元素的元素上。如果您查看 AutomationElement.FindFirst 的代码在 Reflector 中,您会看到它的工作原理是通过自动化边界拉动所有符合条件的子项,然后返回其中的第一个。相比之下,TreeWalker 方法只会尝试将单个第一个 child 拉过边界。

关于WPF UI 自动化 - AutomationElement.FindFirst 在有大量元素时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com