2

我们为我们的 WPF 应用程序 (.NET 4) 进行了一些自动化 UI 测试;这些测试使用UI 自动化API。

我们调用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树自己手动行走...据我所知,这应该可以工作,因为我的树打印机实用程序功能就是这样做的,没关系,但是它似乎这是不必要且缓慢的:-(

任何帮助将不胜感激

4

3 回答 3

2

我在自动化的一个应用程序中遇到了同样的问题。我有一个位于 AdornerLayer 上的自定义控件,并且我正在修改 UI 自动化树,因此 Adorner 的 AutomationElement 作为它正在装饰的控件的 UI Visual 子项出现,而不是作为应用程序根的子项出现。

当我运行 UI Spy 时,当我在其树中导航时,输出窗口中会出现一些错误,说明有关无效父级的信息。我解决了我的代码中的一个错误,即我如何为 Adorner 的 AutomationElement 设置 AutomationElement。一旦我修复了这个错误,UI Spy 就不再在输出窗口中显示错误,并且我不再从 FindFirst 方法调用中得到失败。

如果原始发布者仍在监视这个问题,我会问 UI Spy 在浏览您的应用程序时是否有任何问题?

于 2010-09-29T19:49:11.020 回答
2

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

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

于 2010-06-09T08:39:52.650 回答
-1

我什至坚持这个问题,但我只是没有看到我的失败。

var window = new System.Windows.Window();
window.Show();
window.Content = addControl;
GetWindow(window.Name);

我创建了一个窗口,并将控件添加为窗口的内容。我在这里的失败是,我显示了窗口,然后分配了内容。这甚至失败了。经过数小时的搜索,我将其代码更改为:

var window = new System.Windows.Window();
window.Content = addControl;
window.Show();
GetWindow(window.Name);

...它的工作原理。

迈克尔

于 2011-01-06T13:23:38.583 回答