2

我正在尝试使用 Microsoft 的 UIA 自动化某个控件(Telerik 的 Rad GridView)。我创建了一个包装类,它公开了几个帮助方法供我的测试使用 - 最突出的示例是返回所有网格行集合的 GetAllRows() 方法。

我的问题是这个特定的控件是虚拟化的,这意味着在任何给定时间,只有可见的行在 UI 中呈现和表示。要获取所有行,我不得不使用 ScrollPattern 并反复向下滚动,直到达到 100% 滚动,每次都请求所有子行元素。除了这纯粹是丑陋的代码外,我还面临删除多次提取的行的问题,这很复杂,因为在这个特定的网格中,允许重复值。

Microsoft 建议使用 ItemContainer 模式,该模式允许在给定条件下请求特定控件下的所有 AutomationElement,无论它们是否被虚拟化。然后,您可以使用 VirtualizedItemPattern 的 Realize() 方法将 AutomationElement 带入视图并呈现它。

这本来可行的,不幸的是 Telerik 没有为他们的网格视图实现这个控制模式,即使他们这样做了,我也会在使用它时遇到问题,因为网格行没有获得唯一的 AutomationId,这使得很难制定一个 Condition 对象ItemContainer 模式将使用。

有谁知道如何更优雅地实现这一点?我在实现“滚动”方法来呈现行方面没有问题,但我不想处理删除重复的 AutomationElements。

4

2 回答 2

0

为了跟进我自己的问题,我最终只是实现了滚动直到获得所有元素的代码。我通过始终在滚动之前保存最后一个元素来处理重复值,从而找出我的实际位置。它并不漂亮,但它相当通用且可重用。

于 2013-06-20T16:50:51.393 回答
0

您可以在没有条件的情况下使用 ItemContainer,逐个实现项目,然后像往常一样在代码中测试它们。它可以节省您使用滚动并等待“自行”滚动后实现项目的工作。

但是如果没有 Telerik 首先实现该模式 - 恐怕使用滚动是唯一的选择。

于 2014-04-20T23:36:03.430 回答