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从内部产生的个体.
在深入研究这个问题后,我找到了一个半解决方案。我查看了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. 所以,我想这是一个部分解决方案。
| 归档时间: |
|
| 查看次数: |
1800 次 |
| 最近记录: |