【问题标题】:Automating a Virtualized Control with UIA使用 UIA 自动化虚拟化控制
【发布时间】:2013-06-08 05:21:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: gridview telerik automation ui-automation uia


    【解决方案1】:

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

    【讨论】:

    • 如果您也可以发布您的代码,那将非常有帮助。它将帮助我和其他面临类似问题的人。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多