Ein Problem beim Testen von Silverlight-Anwendungen mittels CodedUI ist, das Ermitteln einzelner TreeViewItems, ListBoxItems, ComboBoxItems oder DataGridCells. Dazu gibt es explizit das Property AutomationID. Die Items werden allerdings zur Laufzeit erzeugt und ein einfaches Data-Binding wird nicht übernommen. Als Lösung stellt Microsoft das Überschreiben von ToString der jeweiligen Entities vor (http://msdn.microsoft.com/de-de/library/gg413373.aspx). Das ist aber keine saubere Lösung für ein sauberes DomainModel.
Dazu habe ich ein paar Behaviors geschrieben (impuls SilverlightAutomationIDBehaviors) und sind ab heute bei der Expression Gallery veröffentlicht. Worin diese kostenfrei zum Download bereitstehen.

Hier ist eine Beschreibung für die Verwendung der Behaviors
1, Die Behaviors von der Expression Gallery downloaden (http://gallery.expression.microsoft.com/SLAutomationID*)
Die Assemblys aus der heruntergeladenen ZIP-Datei referenzieren.
* Rechtsklick auf ZIP-Datei und unter den Eigenschaften das „Zulassen“ nicht vergessen vor dem entpacken.
2, Anschließend muss das Silverlight-Projekt mit Microsoft Expression Blend 4 geöffnet werden.
3, In Expression Blend wird im Bereich „Behaviors“ die SilverlightAutomationIDBehaviors angeboten (siehe Abbildung 1).
Hier wird als Beispiel das SilverlightAutomationIDTreeViewBehavior (1) mittels Drag & Drop auf ein TreeView (2) gedropt. Das Behavior steht dann direkt als Kinderelement (3) vom TreeView. Auf der rechten Seite (4) sind dann alle dazugehörigen Eigenschaften.

Abbildung 1 – Das TreeView um das AutomationTreeViewBehavior erweitern.
Sobald die Silverlight-Anwendung geladen wird und das TreeView seine Daten erhält, vergibt das Behavior automatisch die AutomationIDs für die TreeViewItems. Diese sind als Standard der Index des jeweiligen TreeViewItems.

Abbildung 2 – Die TreeViewItems erhalten als Standard deren Indexnummer als AutomationID und Namen.
Das Behavior kann auch ohne Expression Blend zum Einsatz kommen. Der passende XAML-Code würde wie folgt aussehen:
1: <sdk:TreeView x:Name="treeViewUsers" ItemsSource="{Binding Users}">
2: <sdk:TreeView.ItemTemplate>
3: <sdk:HierarchicalDataTemplate ItemsSource="{Binding Friends, Mode=TwoWay}">
4: <TextBlock Text="{Binding Name, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Stretch" />
5: </sdk:HierarchicalDataTemplate>
6: </sdk:TreeView.ItemTemplate>
7:
8: <i:Interaction.Behaviors>
9: <SetAutomationIdBehavior:AutomationTreeViewBehavior />
10: </i:Interaction.Behaviors>
11: </sdk:TreeView>
Um beim Debuggen visuell testen zu können, kann die Eigenschaft ActiveDebugColor aktiviert werden.

Abbildung 3 – ActiveDebugColor aktivieren.
Das TreeView wird dann die TreeViewItems mit einem orangenen Hintergrund belegen, sobald diese ihre ID erhalten haben.

Abbildung 4 – TreeView mit ActiveDebugColor.
Wenn ActiveDebugColor aktiv ist, wird zudem eine detaillierte Information bei der Debug-Console von Visual Studio angezeigt.

Abbildung 5 – Weitere Informationen werden beim Output-Fenster während des Debuggens angezeigt.
Mit einem weiteren Feature beim Feld ID, kann man den Wert eines TreeViewItems als ID verwenden. Dazu muss mit dem gebundenen Typen der Propertyname als string eingetragen werden.
Hier im Beispiel wurde von der User-Klasse das Property Name ausgewählt. Mit AddNumberToID wird zusätzlich eine Nummerierung zum Namen erzeugt.

Abbildung 6 – Das Name-Property von der User-Klasse wird bei ID definiert.

Abbildung 7 – Der TreeViewItem-Wert wird als AutomationId verwendet.
Wichtig! Dieses Feature darf nur verwendet werden, wenn gewährleistet wird, dass alle Werte im TreeView nur einmalig vorkommen können.
Jetzt wird mit Visual Studio 2010 – Coded UI auch jedes TreeViewItem bestens erkannt.

Abbildung 8 – TreeViewItems werden vom Coded UI Test Builder bestens erkannt.
Bitte um Feedback
Haben dir die Behaviors weiterhelfen können? Werden auch welche für dein WPF, Windows Phone oder WinRT Projekt benötigt? Dann freue ich mich jetzt schon auf dein Feedback!
Besten Dank an die Firma impuls Informationsmanagement GmbH für das Sponsoren der Behaviors für die Community.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
