Freigeben über


Festlegen einer eindeutigen Automatisierungseigenschaft für Silverlight-Steuerelemente für Tests

Wenn Sie Tests der codierten UI ausführen oder Aktionsaufzeichnungen für die Silverlight 4-Anwendung erstellen möchten, benötigen Sie eine eindeutige Automatisierungseigenschaft, durch die die einzelnen Steuerelemente gekennzeichnet werden. Weitere Informationen dazu, wie Sie die Silverlight-Anwendung so einrichten, dass die Steuerelemente erkannt werden, finden Sie unter Gewusst wie: Konfigurieren der Silverlight-Anwendung für Tests.

Sie können eine eindeutige Automatisierungseigenschaft auf Grundlage des Typs des Silverlight-Steuerelements in der Anwendung zuweisen. In diesem Thema wird die Zuweisung der eindeutigen Automatisierungseigenschaft in den folgenden Situationen erörtert:

  • Statische XAML-Definition von Steuerelementen

  • Zuweisen von eindeutigen Automatisierungseigenschaften mithilfe von Expression Blend

  • Verwenden einer DataTemplate

  • Verwenden einer Steuerelementvorlage

  • Datenraster

  • Dynamische Steuerelemente

Methoden für die Zuweisung einer eindeutigen Automatisierungseigenschaft

Statische XAML-Definition

Um eine eindeutige Automatisierungseigenschaft für ein Steuerelement anzugeben, das in der XAML-Datei definiert ist, können Sie AutomationProperties.AutomationId oder AutomationProperties.Name implizit oder explizit festlegen (siehe folgende Beispiele). Durch Festlegen eines dieser Werte erhält das Steuerelement eine eindeutige Automatisierungseigenschaft, mit der das Steuerelement identifiziert werden kann, wenn Sie einen Test der codierten UI oder eine Aktionsaufzeichnung erstellen.

Implizites Festlegen der Eigenschaft

Legen Sie AutomationProperties.AutomationId auf ButtonX fest. Verwenden Sie dazu die Name-Eigenschaft in der XAML für das Steuerelement.

<Button Name="ButtonX" Height="31" HorizontalAlignment="Left" Margin="23,26,0,0"  VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />

Legen Sie AutomationProperties.Name auf ButtonY fest. Verwenden Sie dazu die Content-Eigenschaft in der XAML für das Steuerelement.

<Button Content="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />

Explizites Festlegen der Eigenschaft

Legen Sie AutomationProperties.AutomationId explizit in der XAML für das Steuerelement auf ButtonX fest.

<Button AutomationProperties.AutomationId=“ButtonX” Height="31" HorizontalAlignment="Left" Margin="23,26,0,0"  VerticalAlignment="Top" Width="140" Click="ButtonX_Click" />

Legen Sie AutomationProperties.Name explizit in der XAML für das Steuerelement auf ButtonY fest.

<Button AutomationProperties.Name="ButtonY" Height="31" HorizontalAlignment="Left" Margin="23,76,0,0" VerticalAlignment="Top" Width="140" Click="ButtonY_Click" />

Zuweisen von eindeutigen Automatisierungseigenschaften mithilfe von Expression Blend

Sie können auch Expression Blend 3 oder höher verwenden, um eindeutige Namen interaktiven Elementen zuzuordnen, z. B. Schaltflächen, Listenfeldern, Kombinationsfeldern und Textfeldern. Dies gibt dem Steuerelement einen eindeutigen Wert für AutomationProperties.Name. Verwenden Sie eine der folgenden Methoden, um diesen Schritt mit Expression Blend auszuführen.

Tipp

Sie können diese Methode nur für Steuerelemente verwenden, die statisch mit XAML erstellt werden.

So weisen Sie vorhandenen Steuerelementen einen eindeutigen Namen zu

Klicken Sie auf das Menü Extras und auf Interaktive Elemente benennen (siehe folgende Darstellung).

Eindeutige Namen mit Expression Blend zuweisen

So weisen Sie von Ihnen erstellten Steuerelementen einen eindeutigen Namen zu

Zeigen Sie im Menü Extras auf Optionen, und klicken Sie dann auf Projekt. Wählen Sie Interaktive Felder beim Erstellen automatisch benennen aus, und klicken Sie dann auf OK (siehe folgende Abbildung).

Zuweisen eindeutiger Namen mit Expression Blend

Verwenden einer Datenvorlage

Sie können eine einfache Vorlage mit ItemTemplate definieren, um die Werte in einem Listenfeld mithilfe des folgenden XAML-Codes an Variablen zu binden.

<ListBox Name="listBox1 ItemsSource="{Binding Source={StaticResource employees}}">
   <ListBox.ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding EmployeeName}" />
            <TextBlock Text="{Binding EmployeeID}" />
         </StackPanel>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

Sie können auch eine Vorlage mit ItemContainerStyle verwenden, um die Werte mithilfe des folgenden XAML-Codes an Variablen zu binden.

      <ListBox Name="listBox1 ItemsSource="{Binding Source={StaticResource employees}}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <Grid>
                                    <Button Content="{Binding EmployeeName}" AutomationProperties.AutomationId="{Binding EmployeeID}"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>         
        </ListBox>

In beiden Beispielen müssen Sie anschließend die ToString()-Methode von ItemSource entsprechend der Darstellung mit dem folgenden Code überschreiben. Dieser Code gewährleistet, dass der AutomationProperties.Name-Wert festgelegt wird und eindeutig ist, da mit Bindungen nicht für jedes datengebundene Listenelement eine eindeutige Automatisierungseigenschaft festgelegt werden kann. Das Festlegen eines eindeutigen Werts für AutomationProperties.Name ist in diesem Fall ausreichend.

Tipp

Damit können die inneren Inhalte des Listenelements auch auf eine Zeichenfolge in der Mitarbeiterklasse festgelegt werden. Wie im vorliegenden Beispiel gezeigt, wird dem Schaltflächen-Steuerelement innerhalb jedes Listenelements eine eindeutige Automatisierungs-ID zugewiesen, bei der es sich um die Mitarbeiter-ID handelt.

Employee[] employees = new Employee[] 
{
   new Employee("john", "4384"),
   new Employee("margaret", "7556"),
   new Employee("richard", "8688"),
   new Employee("george", "1293")
};

listBox1.ItemsSource = employees;

public override string ToString()
{
    return EmployeeName + EmployeeID; // Unique Identification to be set as the AutomationProperties.Name
}

Verwenden einer Steuerelementvorlage

Sie können eine Steuerelementvorlage verwenden, damit jede Instanz eines bestimmten Typs eine eindeutige Automatisierungseigenschaft erhält, wenn sie im Code definiert ist. Sie müssen die Vorlage erstellen, damit die AutomationProperty an eine eindeutige ID in der Steuerelementinstanz gebunden wird. Der folgende XAML-Code veranschaulicht eine Methode zur Erstellung der Bindung mit einer Steuerelementvorlage.

<Style x:Key="MyButton" TargetType="Button">
<Setter Property="Template">
   <Setter.Value>
<ControlTemplate TargetType="Button">
   <Grid>
      <CheckBox HorizontalAlignment="Left" AutomationProperties.AutomationId="{TemplateBinding Content}"></CheckBox>
      <Button Width="90" HorizontalAlignment="Right" Content="{TemplateBinding Content}" AutomationProperties.AutomationId="{TemplateBinding Content}"></Button>
   </Grid>
</ControlTemplate>
   </Setter.Value>
</Setter>
</Style>

Wenn Sie zwei Instanzen einer Schaltfläche mithilfe dieser Steuerelementvorlage definieren, wird die Automatisierungs-ID auf die eindeutige Inhaltszeichenfolge für die Steuerelemente in der Vorlage festgelegt (siehe folgender XAML-Code).

<Button Content=”Button1” Style="{StaticResource MyButton}" Width="140"/>
<Button Content=”Button2” Style="{StaticResource MyButton}" Width="140"/>

Datenraster

Der folgende XAML-Code zeigt ein Beispiel eines Silverlight-Datenrastersteuerelements, das an Daten gebunden wird.

<Grid >
<data:DataGrid Name="Details" Margin="5" HeadersVisibility="All" AutoGenerateColumns="False" >
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name"
Binding="{Binding name}" />
<data:DataGridTextColumn Header="Age"
Binding="{Binding age}" />
<data:DataGridTextColumn Header="Education"
Binding="{Binding education}" />

</data:DataGrid.Columns>
</data:DataGrid>
</Grid>

Der folgende Code zeigt, wie der Inhalt des Datenrasters anhand einer Elementquelle aufgefüllt wird.

List<PersonalDetails> persons = new List<PersonalDetails>();
String[] Education = { "High School", "Graduate", "Post Graduate" };
for (int i=0; i<10; i++)
   {
      persons.Add(new PersonalDetails()
      {
          name = "name" + i,
          education = Education[i%3],
          age = 20 + i + i/2 + i*2
      });
   }
Details.ItemsSource = persons;

Standardmäßig wird mit diesem Code jeder Zeile im Datenraster der gleiche Wert für AutomationProperties.Name zugewiesen. Dabei handelt es sich um den Wert, der von ToString() für das PersonalDetails-Objekt zurückgegeben wird. Um diesen Wert so zu ändern, dass er für jede Zeile im Datenblatt eindeutig ist, muss die ToString()-Methode der ItemsSource-Methode überschrieben werden. Beispiel: Sie können mit dem folgenden Code die ToString()-Methode überschreiben, damit sie einen eindeutigen Wert zurückgibt, der anschließend AutomationProperties.Name zugewiesen wird.

public override string ToString()
   {
       return name.ToString() + age.ToString();
   }

Dynamische Steuerelemente

Wenn Sie über Steuerelemente verfügen, die dynamisch mit dem Code und nicht statisch oder mithilfe von Vorlagen in den XAML-Dateien erstellt wurden, müssen Sie die Content- oder die Name-Eigenschaft für das Steuerelement festlegen. Dadurch wird sichergestellt, dass jedes dynamische Steuerelement über eine eindeutige Automatisierungseigenschaft verfügt. Wenn beispielsweise ein Kontrollkästchen angezeigt werden muss, wenn ein Listenelement ausgewählt wird, können Sie diese Eigenschaften festlegen (siehe folgendes Codebeispiel).

private void CreateCheckBox(string txt, StackPanel panel)
   {
      CheckBox cb = new CheckBox();
      cb.Content = txt; // Sets the AutomationProperties.Name
      cb.Height = 50;
      cb.Width = 100;
      cb.Name = "DynamicCheckBoxAid"+ txt; // Sets the AutomationProperties.AutomationId
      panel.Children.Add(cb);
    }

Siehe auch

Weitere Ressourcen

Testen von Silverlight-Anwendungen mit Tests der codierten UI oder Aktionsaufzeichnungen