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

m-y*_*m-y 6 c# wpf unit-testing ui-automation coded-ui-tests

我创建了一个小型WPF应用程序(仅用于探索Coded UI测试的工作原理).我的应用程序包含一个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>
Run Code Online (Sandbox Code Playgroud)

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


另外,附注.我已经理解Visual Studio TextBlock在进行Coded UI测试时会忽略s,因为可以生成这么多.现在我更关心ItemsControl自己,而不是TextBlock从内部产生的个体.

m-y*_*m-y 4

在深入研究这个问题后,我找到了一个半解决方案。我查看了UIMap设计器文件如何生成 a 的代码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!
Run Code Online (Sandbox Code Playgroud)

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