如何在不破坏自动化测试的情况下为我的TabControl定义ControlTemplate?

Dar*_*ryn 7 wpf automated-tests qtp ui-automation

摘要

在我的WPF应用程序中,我需要一个带左侧按钮的TabControl,所以我用我想要的布局定义了一个ControlTemplate,它运行正常.

但是,我的测试人员的自动测试工具无法看到选项卡的任何内容,包括当前选定的选项卡.

问题:如何通过自动化测试工具保持我的TabControl可测试,同时仍然定义ControlTemplate?


细节

我正在使用WPF 3.5开发WPF应用程序
我的测试人员正在使用一个名为QTP的自动测试工具
他说他可以使用UISpy.exe测试任何你能看到的内容

  • 当我使用没有应用模板的直接TabControl时,UISpy可以看到当前所选选项卡的内容.
  • 但是,当我使用ContentTemplate更改布局(下面显示的代码)时,UISpy仍然可以看到选项卡标题...但它无法看到内容.

示例WPF应用程序(Xaml):

<Window x:Class="TabControlTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Tab Control Test"
        Height="300"
        Width="300">
    <Window.Resources>
        <ControlTemplate x:Key="ButtonsOnLeftTabLayout"
                         TargetType="{x:Type TabControl}">
            <DockPanel>
                <StackPanel DockPanel.Dock="Left"
                            IsItemsHost="True" />
                <ContentPresenter Content="{TemplateBinding SelectedContent}" />
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>
    <TabControl Template="{StaticResource ButtonsOnLeftTabLayout}">
        <TabItem Header="Tab 1">
            <StackPanel>
                <Button HorizontalAlignment="Center">Button 1</Button>
            </StackPanel>
        </TabItem>
        <TabItem Header="Tab 2">
            <StackPanel>
                <Button HorizontalAlignment="Center">Button 2</Button>
            </StackPanel>
        </TabItem>
    </TabControl>
</Window>
Run Code Online (Sandbox Code Playgroud)

到目前为止我的搜索结果:

  • 关于必须使用自定义AutomationPeer编写自定义TabControl的一堆内容(例如MSFT对论坛问题UI自动化的回答:访问ControlTemplate中的控件,博客发布自定义控件和UI自动化).但是我的每一个本能都说这是疯狂的矫枉过正,"必须有一种更简单的方法!"
  • 关于为ContentPresenter提供名称,x:名称或AutomationProperties.AutomationId的一些建议 - 没有任何效果

(搜索之后我终于找到了答案,但它花了比我想象的更长的时间,而且AutomationPeer的早期发现确实是错误的,所以我把它写成一个SO问题并自我回答,以防它在将来帮助其他人)

Dar*_*ryn 8

在不同但相似的msdn论坛问题的MSFT响应中找到答案,UI Automation缺少TabControl控件.

要使UI自动化适用于ContentTemplated TabControl,请将Name ="PART_SelectedContentHost"属性添加到ContentPresenter,就像这样

<ContentPresenter Name="PART_SelectedContentHost"
                  Content="{TemplateBinding SelectedContent}"/>
Run Code Online (Sandbox Code Playgroud)

这就是全部.UISpy现在可以看到当前所选选项卡的内容.