编码的UI测试生成器无法正确记录ListViewItem上的操作

时间:2017-10-13 11:18:39

标签: c# wpf listview coded-ui-tests

我正在努力使应用程序CUIT-Generator准备就绪。这意味着,作为示例,我将XAML设置器添加到设置DataGridRowAutomation.ID的{​​{1}}的样式中。工作得很好。

现在我的问题是AutomationName ListView包含ItemTemplate,其中DataTemplate又有自定义UI控件。

在自定义UI控件内的文本控件上录制任何操作时,它只会抓取自定义UI控件及其下方的层次结构,但它不会记录它位于ListView内和ListViewItem

因此,在测试执行期间或在UIMap中选择控件并单击Search UI control时无法找到控件。

我尝试在ListViewItemListView上设置AutomationID / Name,但这对记录的层次结构没有影响。

ListView

的XAML代码
<ListView x:Name="sampleControl" Margin="3" ItemsSource="{Binding ObservableCollectionOfViewModelItems}">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="AutomationProperties.Name">
                <Setter.Value>
                    <Binding Path="AutoID"/>
                </Setter.Value>
            </Setter>
            <Setter Property="AutomationProperties.AutomationId">
                <Setter.Value>
                    <Binding Path="AutoID"/>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <SampleNamespace:CustomUIControlView />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

CustomUIControlView的代码:

<UserControl x:Class="SampleNamespace.CustomUIControlView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d">
    <Border BorderThickness="3">
        <Expander>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBox Grid.Column="1" Grid.Row="0" Name="SampleBox1" Height="20" Margin="5" Text="{Binding SampleProp1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                <TextBox Grid.Column="1" Grid.Row="1" Name="SampleBox2" Height="20" Margin="5" Text="{Binding SampleProp2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                <TextBox Grid.Column="1" Grid.Row="2" Name="SampleBox3" Height="20" Margin="5" Text="{Binding SampleProp3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                <TextBox Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="7" Name="SampleBox4" Height="20" Margin="5" Text="{Binding SampleProp4, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </Grid>
        </Expander>
    </Border>
</UserControl>

SampleBox1上记录的操作的记录层次结构如下所示:

SampleAppWindow
---- CustomUIControlView
-------- Expander
------------ SampleBox1/TextBox

显然除了Window之外,没有任何控件可以找到。

我知道我可以将录制的动作转移到C#代码,然后自己编辑层次结构和搜索属性,但我想避免这样做,因为每次涉及ListView时我都要记住这样做在记录测试中。

我之所以提到这一点,因为SO或其他网站上的大多数解决方案都可以解决这个问题。

这是在Visual Studio 2017 15.3.5和.NET Framework 4.5.2上。

1 个答案:

答案 0 :(得分:1)

我相当肯定你要求的东西超出了CodedUi代码生成器可以处理的范围。

我会从生成的对象结构中指出它完全错过了ListView。我建议的路线首先是确保您可以找到ListView,生成或您自己的代码,可能会调用DrawHighlight来确定。我试图避免使用自己的代码来定义对象定义,但是编写自己的代码可能是可行的。

现在专门针对您的CustomUIControlView,我建议您定义匹配它的匹配CodedUI对象。原样,Expander有4个孩子TextBoxes。这会多次减少编码这个定义。如果您将生成的代码视为示例来编写这些代码。

根据您对设计器文件的看法,您还可以将ListView或其自身的预期父节点声明为部分类,以将这些不匹配的子元素挂钩到单独的文件中,以避免被其擦除发电机。然后,您只需要使用小partial语句编辑来更新设计器文件。