【问题标题】:How to get all the AutomationIDs of a WPF application in a file?如何在文件中获取 WPF 应用程序的所有 AutomationID?
【发布时间】:2012-11-19 16:29:17
【问题描述】:

在 WPF 应用程序的自动化中(使用 UI 自动化;VSTS 2010),我们手动将所有自动化 ID 添加到资源文件中,然后一个一个地访问它。考虑到应用程序可以随时扩展,手动添加这些 ID 可能会变得乏味。

那么,有什么工具可以为我们创建这个吗?即以分层格式获取所有 id 并将其存储在文件(xml 或 csv)中,然后我们可以在需要时对其进行解析。

我希望有一个像 UISpy 这样的工具,它不仅可以监视所有元素,还可以导出相同的元素。

这样的工具存在吗?或者有什么替代方法?

非常感谢任何有价值的反馈。

谢谢!

【问题讨论】:

    标签: wpf export objectid uia


    【解决方案1】:

    我喜欢这样:

    public static class AutomationIds
    {
        public static readonly string MyDataGridId= Create();
    
        private static string Create([CallerMemberName] string name = null)
        {
            return name;
        }
    }
    

    <DataGrid AutomationProperties.AutomationId="{x:Static local:AutomationIds.MyDataGridId}"
              ... />
    

    然后在测试中

    var dataGrid = window.Get<ListView>(AutomationIds.MyDataGridId);
    

    【讨论】:

      【解决方案2】:

      直接在 XAML 中分配自动化 ID,然后解析 XAML 文件,因为它们毕竟是 XML...

      【讨论】:

      • m0sa.. 感谢您的回复.. 但问题是,我们有多个 XAML 文件,我们如何获得分层格式的自动化 ID?
      【解决方案3】:

      让我们看看... 首先,我认为您的数据不是分层的 - 只是因为可以动态地将控件分配为另一个控件的子级。

      如果我们将问题更改为一个子集:“我们如何才能在时间 t 获得控件的分层视图?”那么我们可以用 MS UIA 来回答这个问题,比如说,使用一个简单的 RawViewWalker(只需在 walker 上进行简单的广度优先搜索,从您的主窗口开始即可 - 当然,在应用程序运行时,UIA 可以访问和查询它)。

      但是这个子集不能满足您最初的问题,因为您可能会看到整个 ui 集合的一部分(因为有些会在时间 t 被隐藏/尚未激活)。

      因此使用基于 UIA 的工具(例如 uispy)变得非常困难,因为您必须将应用程序视图设置为不同的状态才能在不同时间 t1、t2 访问应用程序中的所有控件...

      我建议同时解析您的所有 xml,并构建应用程序“静态”控制图的完整树,我相信这将最接近您的要求。

      鉴于这是一个老问题,我怀疑它不再重要,但只是想在这里做出区分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多