如何让Microsoft Coded UI Test Builder识别ItemsControl?

时间:2014-01-27 15:25:31

标签: c# wpf unit-testing ui-automation coded-ui-tests

我创建了一个小型WPF应用程序(仅用于探索Coded UI Testing的工作原理)。我的应用程序包含ItemsControl,但Coded UI Test Builder UIMap找不到合适的控件。

XAML

<ItemsControl ItemsSource="{Binding Path=Customers, Mode=OneTime}"
              AutomationProperties.AutomationId="CustomersItemsControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock AutomationProperties.AutomationId="{Binding Path=Id, StringFormat='Customer_{0}', Mode=OneWay}"
                       Margin="5">
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{1}, {0}">
                        <Binding Path="FirstName" />
                        <Binding Path="LastName" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我遇到的问题是即使WPF有ItemsControlAutomationPeer,编码的UI测试生成器也无法找到要添加到UIMap的控件。我解决它的唯一方法是获取根AutomationElement,然后使用TreeWalker.ControlViewWalker(我使用this answer中的代码),但是该解决方案不允许我访问控件本身,只是AutomationElement。理想情况下,由于控件有一个AutomationPeer,我想知道是否有更好的方法来获得这个控件(即使不可能获得UIMap)。


另外,附注。我已经理解Visual Studio在进行Coded UI测试时会忽略TextBlock,因为可能会生成这么多。现在我更关心到ItemsControl本身,而不是从其中生成的单个TextBlock

2 个答案:

答案 0 :(得分:4)

在深入研究这个问题之后,我发现了一个半解决方案。我查看了UIMap设计器文件如何为ListView生成代码(我为自己的变量调整了一些代码):

var itemscontrol = new WpfList(window);
itemscontrol.SearchProperties[WpfList.PropertyNames.AutomationId] = "CustomersItemsControl";
itemscontrol.WindowTitles.Add("MainWindow");

var count = itemscontrol.Items.Count(); // Returns the correct value!

我复制了此代码,它似乎也适用于ItemsControl,至少有一些属性可用,例如WpfList.Items。所以,我认为这是一个部分解决方案。

答案 1 :(得分:0)

ItemsControl和TextBlock内部没有AutomationPeer。 ItemsControlAutomationPeer是一个抽象类。 这是查找项目的解决方案之一,而不是ItemsControl本身:WPF ItemsControl with TestStack White