Condividi tramite


Impostare una proprietà di automazione univoca dei controlli Silverlight per il test

Se si desiderano eseguire i test codificati dell'interfaccia utente o creare le registrazioni delle azioni per l'applicazione Silverlight 4, è necessario disporre di una proprietà di automazione univoca che identifica ciascun controllo. Per ulteriori informazioni su come impostare l'applicazione Silverlight in modo che i controlli vengano riconosciuti, vedere Procedura: impostare l'applicazione Silverlight in uso per il test.

È possibile assegnare una proprietà di automazione univoca basata sul tipo di controllo Silverlight nell'applicazione. In questo argomento viene illustrato come assegnare questa proprietà di automazione univoca nelle seguenti situazioni:

  • Definizione XAML statica dei controlli

  • Assegnazione delle proprietà di automazione univoche utilizzando Expression Blend

  • Utilizzo di un elemento DataTemplate

  • Utilizzo di modello dei controlli

  • Griglie dei dati

  • Controlli dinamici

Metodi da utilizzare per assegnare una proprietà di automazione univoca

Definizione XAML statica

Per specificare una proprietà di automazione univoca per un controllo definito nel file XAML, è possibile impostare AutomationProperties.AutomationId o AutomationProperties.Name in modo implicito o esplicito, come illustrato negli esempi riportati di seguito. Impostando uno di questi valori si fornisce al controllo una proprietà di automazione univoca che può essere utilizzata per identificare il controllo quando si crea un test codificato dell'interfaccia utente o una registrazione delle azioni.

Impostare la proprietà in modo implicito

Impostare AutomationProperties.AutomationId su ButtonX utilizzando la proprietà Name nell'XAML per il controllo.

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

Impostare AutomationProperties.Name su ButtonY utilizzando la proprietà Content nell'XAML per il controllo.

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

Impostare la proprietà in modo esplicito

Impostare AutomationProperties.AutomationId su ButtonX in modo esplicito nell'XAML per il controllo.

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

Impostare AutomationProperties.Name su ButtonY in modo esplicito nell'XAML per il controllo.

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

Assegnazione delle proprietà di automazione univoche utilizzando Expression Blend

È inoltre possibile utilizzare Expression Blend 3 o versione successiva per assegnare i nomi univoci agli elementi interattivi quali pulsanti, caselle di riepilogo, caselle combinate e caselle di testo. Ciò fornisce al controllo un valore univoco per AutomationProperties.Name. Utilizzare uno dei metodi seguenti per eseguire questa operazione da Expression Blend.

Nota

È possibile utilizzare il metodo solo per i controlli creati in modo statico utilizzando l'XAML.

Per assegnare un nome univoco ai controlli esistenti

Nel menu Strumenti, fare clic su Denomina elementi interattivi, come mostrato nell'illustrazione seguente.

Utilizzo di Expression Blend per assegnare nomi univoci

Per assegnare automaticamente un nome univoco ai controlli creati

Scegliere Opzioni dal menu Strumenti, quindi Progetto. Selezionare Denomina automaticamente elementi interattivi durante la creazione, quindi fare clic su OK, come mostrato nell'illustrazione seguente.

Assegnazione di nomi univoci con Expression Blend

Utilizzare un modello di dati

È possibile definire un modello semplice mediante ItemTemplate per associare i valori di una casella di riepilogo a variabili utilizzando il seguente XAML.

<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>

È inoltre possibile utilizzare un modello con ItemContainerStyle per associare i valori alle variabili con l'XAML seguente.

      <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>

Per entrambi questi esempi, è quindi necessario eseguire l'override del metodo ToString() di ItemSource, come indicato utilizzando il codice seguente. Questo codice verifica che il valore di AutomationProperties.Name sia impostato e univoco, perché non è possibile impostare una proprietà di automazione univoca per ogni elemento dell'elenco con associazione a dati mediante l'associazione. In questo caso è sufficiente impostare un valore univoco per l'automazione di Properties.Name.

Nota

Utilizzando questo approccio, anche il contenuto interno dell'elemento di elenco può essere impostato su una stringa nella classe Employee tramite l'associazione. Come mostrato nell'esempio, il controllo del pulsante all'interno di ogni elemento di elenco viene assegnato un ID di automazione univoco che è l'ID del dipendente.

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
}

Utilizzo di modello dei controlli

È possibile utilizzare un modello dei controlli in modo che ogni istanza di un tipo specifico ottenga una proprietà di automazione univoca quando viene definita nel codice. È necessario creare il modello, in modo che AutomationProperty si associ a un ID univoco nell'istanza del controllo. Il codice XAML riportato di seguito indica un approccio per creare questa associazione con un modello dei controlli.

<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>

Quando si definiscono due istanze di un pulsante utilizzando questo modello dei controlli, l'ID di automazione è impostato sulla stringa di contenuto univoca per i controlli del modello, come illustrato nel seguente esempio di codice XAML.

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

Griglie dei dati

Nel codice XAML seguente viene fornito l'esempio di un controllo griglia dei dati Silverlight che viene associato ai dati.

<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>

Nel codice seguente viene illustrato come viene popolato il contenuto della griglia dei dati da un'origine dell'elemento.

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;

Per impostazione predefinita, questo codice assegnerà lo stesso valore per AutomationProperties.Name a ogni riga nella griglia dei dati. Questo valore è il valore restituito dal metodo ToString() per l'oggetto PersonalDetails. Per modificare questo valore in modo che sia univoco per ogni riga nella griglia dei dati, è necessario eseguire l'override del metodo ToString() del metodo ItemsSource. Ad esempio, è possibile utilizzare il codice seguente per eseguire l'override del metodo ToString() in modo che restituisca un valore univoco che viene quindi assegnato a AutomationProperties.Name.

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

Controlli dinamici

Se si dispone di controlli creati in modo dinamico dal codice e non creati in modo statico o in base ai modelli in un file XAML, è necessario impostare le proprietà del nome o del contenuto del controllo. Ciò garantisce che ogni controllo dinamico disponga di una proprietà di automazione univoca. Ad esempio, se si dispone di una casella di controllo che deve essere visualizzata quando si seleziona un elemento dell'elenco, è possibile impostare queste proprietà, come illustrato nell'esempio di codice riportato di seguito.

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);
    }

Vedere anche

Altre risorse

Test di applicazioni Silverlight mediante test codificati dell'interfaccia utente o registrazioni delle azioni