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