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

标签 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 属性的方法。有没有办法做到这一点?

最佳答案

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

通过 .NET Reflector 和 AddIn 查看 BAML

一种方法是编写一个 Reflector 插件。

您或许可以将其基于已经可用的 BAML 查看器。

然后希望这只是一个给反射器你的程序集并说找到没有自动化 ID 的东西的情况。

通过 StylesExplorer 查看 BAML

允许您使用 BamlAssembly 类访问程序集中的 BAML。

通过 LocBAML 查看 BAML

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

使用 XamlReader.Load()

您甚至可以只使用 XamlReader.Load() 来处理未编译的 .xaml 文件。

使用 XamlReader.LoadBaml()

其他选项

各种自动化的运行时验证器

关于c# - 如何检查 XAML 元素是否支持 AutomationId 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112745/

相关文章:

xaml - Metro 风格 : Scrolling with mouse wheel

xaml - windows phone 8.1 ComboBox 当项目数量更多时,将多个项目显示为已选择

c# - 使用C#以编程方式调整网格中的行数

c# - Linq 查询返回具有特定属性值的嵌套数组

c# - 从 session 中的列表中删除特定项目

wpf - VirtualizingStackPanel + MVVM + 多选

wpf - 使用 MVVM 构建应用程序

c# - 从矩阵变换计算角度

c# - Server.transfer 回发问题

c# - IEnumerable<Enum> 的扩展方法?