【问题标题】:How can I define a ControlTemplate for my TabControl without breaking automated testing?如何在不破坏自动化测试的情况下为我的 TabControl 定义 ControlTemplate?
【发布时间】:2010-09-03 17:44:28
【问题描述】:

总结

在我的 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:Name 或 AutomationProperties.AutomationId 的一些建议——这些都没有任何效果

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

【问题讨论】:

    标签: wpf automated-tests qtp ui-automation


    【解决方案1】:

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

    要使 UI 自动化为 ContentTemplated TabControl 工作,请将 Name="PART_SelectedContentHost" 属性添加到 ContentPresenter,如下所示

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

    仅此而已。 UISpy 现在可以看到当前选中标签的内容了。

    【讨论】:

    • .net 4.0 / 4.5 存在问题,此解决方案无效 :((在此处查看最后一篇文章:social.msdn.microsoft.com/Forums/vstudio/en-US/…)有什么解决方法的想法吗?
    • 对不起,自从我从事那个项目以来已经很久了。我建议提出一个针对 .net 4.5 的新问题,就像这个问题针对 .net 3.5 一样
    猜你喜欢
    • 2011-01-10
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2011-12-04
    • 2021-01-23
    相关资源
    最近更新 更多