我创建了一个小型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
。
答案 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。