编码 UI 测试生成器无法正确记录 ListViewItem 上的操作
Coded UI Test Generator has trouble correctly recording actions on a ListViewItem
我目前正在准备一个应用程序 CUIT-Generator。这意味着,作为示例,我将 XAML 设置器添加到设置 Automation.ID
和 AutomationName
的 DataGridRow
的样式中。工作正常。
现在我的问题是有一个 ListView
,其中 ItemTemplate
包含一个 DataTemplate
,后者又具有自定义 UI 控件。
在自定义 UI 控件内记录文本控件上的任何操作时,它只抓取自定义 UI 控件及其下方的层次结构,但不会记录它在内部一个 ListView
和一个 ListViewItem
.
因此,在测试执行期间或在 UIMap 中选择控件并单击 Search UI control
时找不到控件。
我尝试在 ListViewItem
和 ListView
上设置 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
语句编辑来更新设计器文件。
我目前正在准备一个应用程序 CUIT-Generator。这意味着,作为示例,我将 XAML 设置器添加到设置 Automation.ID
和 AutomationName
的 DataGridRow
的样式中。工作正常。
现在我的问题是有一个 ListView
,其中 ItemTemplate
包含一个 DataTemplate
,后者又具有自定义 UI 控件。
在自定义 UI 控件内记录文本控件上的任何操作时,它只抓取自定义 UI 控件及其下方的层次结构,但不会记录它在内部一个 ListView
和一个 ListViewItem
.
因此,在测试执行期间或在 UIMap 中选择控件并单击 Search UI control
时找不到控件。
我尝试在 ListViewItem
和 ListView
上设置 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
语句编辑来更新设计器文件。