C# 如何检查XAML元素是否支持AutomationId属性

C# 如何检查XAML元素是否支持AutomationId属性,c#,wpf,xaml,C#,Wpf,Xaml,我需要一种方法来检查代码库中的每个WPF控件是否都有AutomationProperties.AutomationId属性。(这是自动化UI测试所必需的。)我还需要确保将来在所有可能添加到代码库的表单上强制执行此要求。我已经考虑过几种不同的方法,到目前为止,没有一种方法是正确的 选项1:为应用程序中的每个WPF表单编写单元测试 这是一个相当简单的方法。我已经编写了一个方法来检查DependencyControl的所有逻辑后代,并确保每个后代都有一个AutomationId。这里有一些C#: 这种

我需要一种方法来检查代码库中的每个WPF控件是否都有AutomationProperties.AutomationId属性。(这是自动化UI测试所必需的。)我还需要确保将来在所有可能添加到代码库的表单上强制执行此要求。我已经考虑过几种不同的方法,到目前为止,没有一种方法是正确的

选项1:为应用程序中的每个WPF表单编写单元测试

这是一个相当简单的方法。我已经编写了一个方法来检查DependencyControl的所有逻辑后代,并确保每个后代都有一个AutomationId。这里有一些C#:

这种方法的问题是,我假设其他开发人员会为他们的表单编写单元测试,这不是一个好的假设。如果我不能假设AutomationID将被添加到所有WPF控件中,那么我也不能假设单元测试将被编写

选项2:使用System.Xml.XmlDocument读取每个XAML文件。检查文档中的元素以获取AutomationProperties.AutomationId


这种方法似乎很有希望。我最初的计划是将每个XAML文件加载到一个XmlDocument中,并检查文档中每个元素的AutomationProperties.AutomationId属性。但是,我意识到并非XAML中的每个元素类型都支持AutomationProperties.AutomationId属性。我需要的是一种读取XAML文件中的元素并确定该元素是否支持AutomationProperties.AutomationId属性的方法。有办法做到这一点吗

您可以在代码库的所有程序集中查看BAML(编译的XAML)……有多种方法可以做到这一点

通过.NET Reflector和加载项查看BAML 一种方法是编写一个Reflector插件

您也许可以基于已经可用的BAML查看器

然后,希望它只是一个例子,给reflector你的组件,并说找我的东西没有自动化ID

通过StylesPlooler查看BAML
允许您使用
BamlAssembly
类访问程序集中的BAML

通过LocBAML查看BAML
  • (相关链接)

该工具的源代码在Windows SDK中提供。您可以修改以查找自动化属性,而不是可本地化的属性

使用XamlReader.Load() 您甚至可能只需要
XamlReader.Load()
和未编译的.xaml文件就可以到达某个地方

使用XamlReader.LoadBaml()
其他选择 各种自动化的运行时验证器


请注意:如果您是通过UI进行测试,那么这不是单元测试。
    private bool AllControlsHaveAutomationId(DependencyObject control)
    {
        bool result = true;

        if (this.ControlHasAutomationId(control))
        {
            foreach (object o in LogicalTreeHelper.GetChildren(control))
            {
                FrameworkElement frameworkElement = o as FrameworkElement;
                if (frameworkElement != null)
                {
                    result = this.AllControlsHaveAutomationId(frameworkElement);
                }
            }
        }
        else
        {
            result = false;
        }

        return result;
    }

    private bool ControlHasAutomationId(DependencyObject control)
    {
        return !string.IsNullOrEmpty(AutomationProperties.GetAutomationId(control));
    }