コードベース内のすべての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属性をサポートしているかどうかを判断する方法です。これを行う方法はありますか?