我正在尝试使用 Microsoft 的 UIA 自动化某个控件(Telerik 的 Rad GridView)。我创建了一个包装类,它公开了几个帮助方法供我的测试使用 - 最突出的示例是返回所有网格行集合的 GetAllRows() 方法。
我的问题是这个特定的控件是虚拟化的,这意味着在任何给定时间,只有可见的行在 UI 中呈现和表示。要获取所有行,我不得不使用 ScrollPattern 并反复向下滚动,直到达到 100% 滚动,每次都请求所有子行元素。除了这纯粹是丑陋的代码外,我还面临删除多次提取的行的问题,这很复杂,因为在这个特定的网格中,允许重复值。
Microsoft 建议使用 ItemContainer 模式,该模式允许在给定条件下请求特定控件下的所有 AutomationElement,无论它们是否被虚拟化。然后,您可以使用 VirtualizedItemPattern 的 Realize() 方法将 AutomationElement 带入视图并呈现它。
这本来可行的,不幸的是 Telerik 没有为他们的网格视图实现这个控制模式,即使他们这样做了,我也会在使用它时遇到问题,因为网格行没有获得唯一的 AutomationId,这使得很难制定一个 Condition 对象ItemContainer 模式将使用。
有谁知道如何更优雅地实现这一点?我在实现“滚动”方法来呈现行方面没有问题,但我不想处理删除重复的 AutomationElements。