WPF-如何防止DataTemplate中的重复AutomationId

时间:2018-10-29 10:01:56

标签: c# wpf automation ui-automation white

我正在使用AutomationId和white进行测试,由于某些测试始终失败,我最近遇到了一个自动化团队提出的问题。

我有一些DataTemplate:

<DataTemplate DataType="{x:Type local:SomeDataModel}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding NameTitle}" AutomationProperties.AutomationId="NameTitleId"/>
        <TextBlock Text="{Binding Name}" AutomationProperties.AutomationId="NameId"/>
        <Button Content="Apply" Command="{Binding ApplyCommand}" AutomationProperties.AutomationId="ApplyCommandId"/>
    </StackPanel>
</DataTemplate>

在创建AutomationId时,内部控件会收到AutomationId,但这意味着所创建的DataTemplate的每个实例,所有AutomationId都将被复制

这会导致由于单击错误控件中的读数而导致测试失败。

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

只需将您的自动化ID作为属性添加到SomeDataModel中并绑定到它们:

<DataTemplate DataType="{x:Type local:SomeDataModel}">
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding NameTitle}"
               AutomationProperties.AutomationId="{Binding NameTitleId}"/>
    <TextBlock Text="{Binding Name}"
               AutomationProperties.AutomationId="{Binding NameId}"/>
    <Button Content="Apply" Command="{Binding ApplyCommand}"
            AutomationProperties.AutomationId="{Binding ApplyCommandId}"/>
  </StackPanel>
</DataTemplate>

答案 1 :(得分:0)

如果你的数据模型有一个唯一的 id,你可以像这样绑定到它。 (假设 Name 是唯一的)。

<DataTemplate DataType="{x:Type local:SomeDataModel}">
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding NameTitle}"
               AutomationProperties.AutomationId="{Binding Name,StringFormat='NameTitleTextBlockFor_{0}'}"/>
    <TextBlock Text="{Binding Name}"
               AutomationProperties.AutomationId="{Binding Name,StringFormat='NameTextBlockFor_{0}'}"/>
    <Button Content="Apply" Command="{Binding ApplyCommand}"
            AutomationProperties.AutomationId="{Binding Name,StringFormat='ApplyButtonFor_{0}'}"/>
  </StackPanel>
</DataTemplate>