我需要一种方法来检查我的代码库中的每个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和加载项查看BAML
一种实现方法是编写Reflector加载项。
您可能基于已经可用的BAML Viewer。
http://reflectoraddins.codeplex.com/wikipage?title=BamlViewer&referringTitle=Home
http://wpf.2000things.com/tag/baml/
希望这只是将反射器装到您的装配体中并说没有自动化ID的帮助。
通过StylesExplorer查看BAML
http://stylesexplorer.codeplex.com/
允许您使用BamlAssembly
类在程序集中访问BAML。
通过LocBAML查看BAML
http://msdn.microsoft.com/en-us/library/ms746621.aspx
http://bloc.codeplex.com/releases/view/44124(相关链接)
Windows SDK中提供了该工具的源代码。您可以修改以查找自动化属性,而不是可本地化的属性。
使用XamlReader.Load()
您甚至可能只用XamlReader.Load()
来处理未编译的.xaml文件。
http://go4answers.webhost4life.com/Example/xamlreaderloadbaml-removed-125290.aspx
使用XamlReader.LoadBaml()
http://wpftutorial.net/baml.html
其他选择
各种自动化的运行时验证器
http://acccheck.codeplex.com/releases/view/46527