4

我需要一种方法来检查我的代码库中的每个 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 属性的方法。有没有办法做到这一点?

4

1 回答 1

0

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

通过 .NET Reflector 和插件查看 BAML

一种方法是编写一个反射器插件。

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

然后希望这只是将您的程序集提供给反射器并说在没有自动化 ID 的情况下给我找东西的情况。

通过 StylesExplorer 查看 BAML

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

通过 LocBAML 查看 BAML

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

使用 XamlReader.Load()

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

使用 XamlReader.LoadBaml()

其他选项

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

于 2012-08-24T18:55:29.533 回答