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

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

选项1:为应用程序中的每个WPF表单编写unit testing。

这是一种相当简单的方法。 我已经编写了一个方法来检查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)); } 

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

选项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 Viewer。

然后希望它只是一个给reflection器你的组件并说找不到自动化ID的东西的情况。

通过StylesExplorer查看BAML

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

通过LocBAML看BAML

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

使用XamlReader.Load()

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

使用XamlReader.LoadBaml()

其他选择

各种自动化的运行时validation程序