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

时间:2012-08-24 15:53:26

标签: c# wpf xaml

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

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

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

    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));
    }

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

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

元素

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

1 个答案:

答案 0 :(得分:0)

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

通过.NET Reflector和AddIn

查看BAML

这样做的一种方法是编写一个Reflector加载项。

您可以将其基于已有的BAML Viewer。

然后希望它只是给你的装配反射器并说找不带自动化ID的东西。

通过StylesExplorer查看BAML

允许您访问具有BamlAssembly类的程序集中的BAML。

通过LocBAML

查看BAML

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

使用XamlReader.Load()

您甚至可以使用未编译的.xaml文件单独使用XamlReader.Load()

使用XamlReader.LoadBaml()

其他选项

各种自动化的运行时验证程序