如何在一个文件中获取WPF应用程序的所有自动ID?

如何在一个文件中获取WPF应用程序的所有自动ID?,wpf,export,objectid,uia,Wpf,Export,Objectid,Uia,在WPF应用程序的自动化(使用UI自动化;VSTS 2010)中,我们手动将所有自动化ID添加到资源文件中,然后逐个访问它。考虑到应用程序可以随时扩展,手动添加这些ID可能会变得单调乏味 那么,是否有任何工具可以为我们创造这一点?i、 e.以分层格式获取所有ID并将其存储在文件(xml或csv)中,然后我们可以在需要时解析它 我希望能有一个像UISpy这样的工具,它不仅可以监视所有元素,还可以导出相同的元素 有这样的工具吗?或者是否有其他方法 任何有价值的反馈都将受到高度赞赏 谢谢 直接在XAM

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

那么,是否有任何工具可以为我们创造这一点?i、 e.以分层格式获取所有ID并将其存储在文件(xml或csv)中,然后我们可以在需要时解析它

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

有这样的工具吗?或者是否有其他方法

任何有价值的反馈都将受到高度赞赏


谢谢

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

我喜欢这样做:

public static class AutomationIds
{
    public static readonly string MyDataGridId= Create();

    private static string Create([CallerMemberName] string name = null)
    {
        return name;
    }
}


然后在测试中

var dataGrid = window.Get<ListView>(AutomationIds.MyDataGridId);
var-dataGrid=window.Get(AutomationIds.MyDataGridId);
让我们看看。。。 首先,我认为您的数据不是分层的——这仅仅是因为可以动态地将一个控件分配给另一个控件的子控件

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

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

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

我建议您同时解析所有XML,并构建一个完整的应用程序“静态”控制映射树,我认为这与您的要求最接近


考虑到这是一个老问题,我不再怀疑它的重要性,但我只是想在这里进行区分。

m0sa..感谢您的回答..但问题是,我们有多个XAML文件,如何以分层格式获取自动化ID?
var dataGrid = window.Get<ListView>(AutomationIds.MyDataGridId);