我正在尝试用微软的UIA自动化一个特定的控制(Telerik的Rad GridView)。我已经创建了一个包装类,它公开了几个辅助方法供我的测试使用-最突出的例子是返回所有网格行的集合的GetAllRows()方法。
我的问题是,这个特定的控件是虚拟化的,这意味着在任何给定时间,UI中都只呈现和表示可见的行。为了获得所有行,我不得不使用ScrollPattern并反复向下滚动,直到达到100%的滚动,每次都请求所有的子行元素。除了这是非常丑陋的代码之外,我还面临着删除多次拾取的行的问题,这是很复杂的,因为在这个特定的网格中,允许重复的值。
微软建议使用ItemContainer模式,该模式允许在给定条件下请求特定控制下的所有AutomationElements,而不管它们是否被虚拟化。然后,您可以使用VirtualizedItemPattern的Realize()方法将AutomationElement带到视图中并呈现它。
这是可行的,不幸的是,Telerik没有为他们的网格视图实现这个控制模式,即使他们实现了,我也会遇到问题,因为网格行没有获得唯一的AutomationId,这使得很难制定一个ItemContainer模式将利用的条件对象。
有没有人知道如何更优雅地实现这一点?在实现“滚动”方法来呈现行时,我没有问题,但我不想处理删除重复的AutomationElements。
发布于 2013-06-21 00:50:51
为了跟进我自己的问题,我最终只实现了滚动直到获得所有元素的代码。我总是在滚动前保存最后一个元素,从而找出我的实际位置,从而处理重复的值。它并不美观,但它相当通用和可重用。
发布于 2014-04-21 07:36:03
您可以不带条件地使用ItemContainer,逐个实现项,然后像往常一样在代码中测试它们。它可以节省你使用scroll的工作,并等待项目在滚动“本身”后实现。
但是如果没有Telerik,首先要实现模式--恐怕使用scroll是唯一的选择。
https://stackoverflow.com/questions/17059706
复制相似问题