使用UIA自动化虚拟化控制

时间:2013-06-12 07:15:22

标签: gridview telerik automation ui-automation uia

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

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

Microsoft建议使用ItemContainer模式,该模式允许在给定条件的特定控件下请求所有AutomationElements,无论它们是否已虚拟化。然后,您可以使用VirtualizedItemPattern的Realize()方法将AutomationElement置于视图中并进行渲染。

这本来有用,遗憾的是Telerik还没有为他们的网格视图实现这种控制模式,即使他们这样做了,我也会遇到问题,因为网格行没有获得一个独特的AutomationId,这使得很难制定一个条件ItemContainer模式将使用的对象。

有没有人知道如何更优雅地实现这一目标?我没有实现“scrolller”方法来呈现行的问题,但我不想处理删除重复的AutomationElements。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以无条件地使用ItemContainer,逐个实现项目,然后像往常一样在代码中测试它们。它已经保存了你的工作滚动和等待直到项目实现滚动'自己'。

但是没有Telerik首先实现模式 - 我担心使用滚动是唯一的选择。