테스트를 위해 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, each control must be identified by a unique automation property. 응용 프로그램에서 XAML 컨트롤의 형식에 따라 고유한 자동화 속성을 할당할 수 있습니다.You can assign a unique automation property based on the type of XAML control in your application.

정적 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에서 컨트롤에 대한 이름 속성을 사용하여 AutomationProperties.AutomationIdButtonX로 설정합니다.Set 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에서 컨트롤에 대한 콘텐츠 속성을 사용하여 AutomationProperties.NameButtonY로 설정합니다.Set 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.AutomationIdButtonX로 설정합니다.Set 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.NameButtonY로 설정합니다.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" />

고유한 이름 할당Assign unique names

Blend for Visual Studio에서 단추, 목록 상자, 콤보 상자 및 텍스트 상자와 같은 대화형 요소에 고유한 이름을 할당하는 옵션을 선택할 수 있습니다.In Blend for Visual Studio, you can select an option to assign unique names to interactive elements such as buttons, list boxes, combo boxes, and text boxes. 이렇게 하면 AutomationProperties.Name에 대한 고유한 값을 컨트롤에 부여하게 됩니다.This gives the controls unique values for AutomationProperties.Name.

기존 컨트롤에 고유한 이름을 할당하려면 도구 > 대화형 요소 이름 지정을 선택합니다.To assign unique names to existing controls, select Tools > Name Interactive Elements.

Blend for Visual Studio에서 대화형 요소 이름 지정

추가한 새 컨트롤에 고유한 이름을 자동으로 지정하려면 도구 > 옵션을 선택하여 옵션 대화 상자를 엽니다.To automatically give unique names to new controls that you add, select Tools > Options to open the Options dialog. XAML 디자이너를 선택한 다음, 생성 시 대화형 요소에 자동으로 이름 지정을 선택합니다.Select XAML Designer and then select Automatically name interactive elements on creation. 확인을 선택하여 대화 상자를 닫습니다.Select OK to close the dialog box.

데이터 템플릿 사용Use a data template

ItemTemplate을 사용하여 간단한 템플릿을 정의하고 목록 상자의 값을 변수에 바인딩할 수 있습니다.You can define a simple template using ItemTemplate to bind the values in a list box to variables:

<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과 함께 사용하여 값을 변수에 바인딩할 수도 있습니다.You can also use a template with ItemContainerStyle to bind the values to variables:

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

그런 다음, 이 예제 모두에 대해 다음 코드를 사용하여 ItemSourceToString() 메서드를 재정의해야 합니다.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. 예제에서와 같이 각 목록 항목 안에 있는 단추 컨트롤에는 직원 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>

이 컨트롤 템플릿을 사용하여 단추의 두 인스턴스를 정의할 때 다음 XAML과 같이 템플릿의 컨트롤에 대한 고유한 콘텐츠 문자열에 자동화 ID가 설정됩니다.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 파일에서는 정적으로 또는 템플릿을 통해 생성되지 않은 컨트롤이 있으면 컨트롤의 콘텐츠 또는 이름 속성을 설정해야 합니다.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