テスト用に UWP コントロールの一意のオートメーション プロパティを設定するSet a Unique Automation Property for UWP Controls for Testing

XAML ベースの UWP アプリケーション用のコード化された UI テストを実行する場合は、各コントロールを識別する一意のオートメーション プロパティが必要です。If you want to run coded UI tests for your XAML-based UWP application, you must have a unique automation property that identifies each control.

アプリケーションで XAML コントロールの種類に基づいて固有のオートメーション プロパティを割り当てることができます。You can assign a unique automation property based on the type of XAML control in your application. ここでは、次のような状況において、この一意のオートメーション プロパティを割り当てる方法について説明します。Here's how to assign this unique automation property in the following situations:

いくつかの方法で一意のオートメーション プロパティを割り当てるUse methods to assign a unique automation property

静的な XAML 定義Static XAML definition

XAML ファイルに定義されているコントロールに一意のオートメーション プロパティを指定する目的で、次の例のように、AutomationProperties.AutomationId または AutomationProperties.Name を暗黙的または明示的に設定できます。To specify a unique automation property for a control that is defined in your XAML file, you can set the AutomationProperties.AutomationId or AutomationProperties.Name implicitly or explicitly, as shown in the examples that follow. これらの値のいずれかを設定すると、コントロールに一意のオートメーション プロパティが割り当てられ、コード化された UI テストまたは操作の記録を作成するとき、コントロールを識別するために使用できます。Setting either of these values gives the control a unique automation property that can be used to identify the control when you create a coded UI test or action recording.

プロパティを暗黙的に設定するSet the property implicitly

コントロールの XAML で Name プロパティを使用して、AutomationProperties.AutomationId を ButtonX に設定します。Set the AutomationProperties.AutomationId to ButtonX using the Name property in the XAML for the control.

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

コントロールの XAML で Content プロパティを使用して、AutomationProperties.Name を ButtonY に設定します。Set the AutomationProperties.Name to ButtonY using the Content property in the XAML for the control.

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

プロパティを明示的に設定するSet the property explicitly

コントロールの XAML で AutomationProperties.AutomationId を ButtonX に明示的に設定します。Set the AutomationProperties.AutomationId to ButtonX explicitly in the XAML for the control.

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

コントロールの XAML で AutomationProperties.Name を ButtonY に明示的に設定します。Set the AutomationProperties.Name to ButtonY explicitly in the XAML for the control.

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

Visual Studio または Blend for Visual Studio を使用して一意のオートメーション プロパティを割り当てるAssign unique automation properties using Visual Studio or Blend for Visual Studio

Visual Studio または Blend for Visual Studio を使用し、ボタン、リスト ボックス、コンボ ボックス、テキスト ボックスなど、対話型要素に一意の名前を割り当てることができます。You can use Visual Studio or Blend for Visual Studio to assign unique names to interactive elements such as buttons, list boxes, combo boxes, and text boxes. これにより、コントロールの AutomationProperties.Name に一意の値が割り当てられます。This gives the control a unique value for AutomationProperties.Name.

Visual Studio: [ツール] メニューの [オプション] をポイントし、[テキスト エディター][XAML][その他] の順に選択します。Visual Studio: On the Tools menu, point to Options and then choose Text Editor, then XAML, and finally Miscellaneous.

[対話要素の作成時に自動的に名前を付ける] を選択し、[OK] をクリックします。Select Automatically name interactive elements on creation and then choose OK.

その他の XAML オプションXAML Miscellaneous options

Blend for Visual Studio: これを Blend for Visual Studio から実行するには、次のいずれかの方法を使用します。Blend for Visual Studio: Use one of the following methods to do this from Blend for Visual Studio.

注意

この方法は、XAML を使用して静的に作成されたコントロールの場合のみ行うことができます。You can only use this method for controls that are created statically using XAML.

既存のコントロールに一意の名前を付けるにはTo give a unique name to existing controls

次に示すように、[ツール] メニューの [対話型要素に名前を付ける] をクリックします。On the Tools menu, choose Name Interactive Elements, as shown here:

[ツール] メニューの [対話型要素に名前を付ける] をクリックChoose Name Interactive Elements from Tools menu

作成されるコントロールに自動的に一意の名前を付けるにはTo automatically give a unique name to controls that you create

[ツール] メニューの [オプション] をポイントし、[プロジェクト] をクリックします。On the Tools menu, point to Options, and then choose Project. 次に示すように、[対話要素の作成時に自動的に名前を付ける] を選択し、[OK] をクリックします。Select Automatically name interactive elements on creation and then choose OK, as shown here:

対話型要素に名前を付けるためプロジェクトを設定Set project to name interactive elements

データ テンプレートを使用するUse a data template

ItemTemplate を使用して簡単なテンプレートを定義すると、リスト ボックスの値を変数にバインドできます。次のような XAML を使用します。You can define a simple template using ItemTemplate to bind the values in a list box to variables using the following 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>

ItemContainerStyle を含むテンプレートを使用して、値を変数にバインドすることもできます。次のような XAML を使用します。You can also use a template with ItemContainerStyle to bind the values to variables by using the following XAML:

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

いずれの例でも、後続のコード例のように、ItemSource の ToString() メソッドをオーバーライドする必要があります。For both of these examples, you must then override the ToString() method of ItemSource, as shown using the code example that follows. バインディングによって各データ バインド リスト項目に一意のオートメーション プロパティを設定することはできないため、このコードを使用して、AutomationProperties.Name 値を設定し、その値が確実に一意になるようにします。This code makes sure that the AutomationProperties.Name value is set and is unique, because you cannot set a unique automation property for each data bound list item using binding. この場合、Automation Properties.Name に一意の値を設定するだけで十分です。Setting a unique value for the Automation Properties.Name is sufficient in this case.

注意

この方法を使用すると、リスト項目の内部コンテンツをバインディングによって Employee クラスの文字列に設定することもできます。Using this approach, the inner contents of the list item can also be set to a string in the Employee class through binding. この例に示されているように、各リスト項目内のボタン コントロールには、Employee ID を表す一意のオートメーション ID が割り当てられます。As shown in the example, the button control inside each list item is assigned a unique automation id, which is the Employee ID.

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
}

コントロール テンプレートを使用するUse a control template

コントロール テンプレートを使用すると、特定の型の各インスタンスがコードで定義されるときに、一意のオートメーション プロパティが与えられるようにすることができます。You can use a control template so that each instance of a specific type obtains a unique automation property when it is defined in the code. AutomationProperty がコントロール インスタンスの一意の ID にバインドされるようにテンプレートを作成します。Create the template so that the AutomationProperty binds to a unique ID in the control instance. 次の XAML は、コントロール テンプレートを使用してこのバインディングを作成する方法を示しています。The following XAML demonstrates one approach to create this binding with a control template.

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

このコントロール テンプレートを使用して 1 つのボタンのインスタンスを 2 つ定義すると、テンプレート内のコントロールのオートメーション ID は一意のコンテンツ文字列に設定されます。このときの XAML を次に示します。When you define two instances of a button using this control template, the automation id is set to the unique content string for the controls in the template, as shown in the following XAML:

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

ダイナミック コントロールDynamic controls

コードから動的に作成され、静的に、または XAML ファイルのテンプレートから作成されていないコントロールがある場合は、コントロールの Content プロパティまたは Name プロパティを設定する必要があります。If you have controls that are created dynamically from your code and not created statically or through templates in XAML files, you must set the Content or Name properties for the control. これにより、各ダイナミック コントロールに確実に一意のオートメーション プロパティが与えられるようにします。This makes sure that each dynamic control has a unique automation property. たとえば、リスト項目を選択したときに表示するチェック ボックスがある場合は、次に示すようにこれらのプロパティを設定できます。For example, if you have a check box that must be displayed when you select a list item, you can set these properties, as shown here:

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

関連項目See also