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

Coded UI Test Generator has trouble correctly recording actions on a ListViewItem

我目前正在准备一个应用程序 CUIT-Generator。这意味着,作为示例,我将 XAML 设置器添加到设置 Automation.IDAutomationNameDataGridRow 的样式中。工作正常。

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

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

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

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

XAML 代码为 ListView:

<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

显然 none 的控件,除了 Window 将被找到。

我知道我可以将记录的操作转移到 C# 代码,然后自己编辑层次结构和搜索属性,但我想避免这样做,因为我必须记住每次 ListView参与录制的测试。

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

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

我相当确定您要求的是 CodedUi 代码生成器无法处理的内容。

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

现在专门针对您的 CustomUIControlView,我会敦促您定义匹配它的匹配 CodedUI object。照原样,一个 Expander 和 4 children TextBoxes。这将多次减少对该定义的编码。如果你看看生成的代码作为例子来写这些。

根据您对设计器文件的看法,您还可以声明 ListView 的直接预期 parent 节点或其自身作为部分 class 以挂钩这些不匹配的 children 元素放在一个单独的文件中,以避免它被生成器擦除。然后你只需要用小的 partial 语句编辑来更新设计器文件。