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

时间:2010-09-03 17:44:28

标签: 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>

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

  • 关于必须使用自定义AutomationPeer编写自定义TabControl的一些内容(例如MSFT对论坛问题UI Automation: accessing control in a ControlTemplate的回答,博客Custom Controls and UI Automation)。但是我的每一个本能都说这是疯狂的矫枉过正,“必须有一种更简单的方式!”
  • 关于为ContentPresenter提供名称,x:名称或AutomationProperties.AutomationId的一些建议 - 没有任何效果

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

1 个答案:

答案 0 :(得分:8)

在不同但类似的msdn论坛问题TabControl controls are missing for UI Automation上的MSFT回复中找到答案。

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

<ContentPresenter Name="PART_SelectedContentHost"
                  Content="{TemplateBinding SelectedContent}"/>

这就是全部。 UISpy现在可以看到当前所选标签的内容。