如何让Microsoft Coded UI测试生成器识别ItemsControl?

6
我创建了一个小的WPF应用程序(只是为了探索Coded UI测试的工作原理)。我的应用程序包含一个ItemsControl,但是Coded UI测试生成器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,Coded UI测试生成器也无法定位要添加到UIMap中的控件。我唯一解决的方法是获取根AutomationElement,然后利用TreeWalker.ControlViewWalker(我使用了this answer中的代码),但这种解决方案并没有让我访问控件本身,只有AutomationElement。理想情况下,由于该控件有一个AutomationPeer,我想知道是否有更好的方法来访问此控件(即使对于UIMap来说是不可能的)。
另外,顺便一提。我已经了解到 Visual Studio 在进行 Coded UI 测试时会忽略 TextBlock,因为可能会产生大量的 TextBlock。现在我更关心的是如何获取 ItemsControl 本身,而不是从中生成的单个 TextBlock
2个回答

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。所以,我猜这是一个部分解决方案。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接