Как заставить Microsoft Coded UI Test Builder распознавать ItemsControl?
Я создал небольшое приложение WPF (просто чтобы изучить, как работает закодированное тестирование пользовательского интерфейса). Мое заявление содержало ItemsControl
, но кодированный 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
, построитель закодированных тестов пользовательского интерфейса не может найти элемент управления для добавления в UIMap. Единственный способ обойти это - достать корень. Automationelement, которые, затем, используя TreeWalker.ControlViewWalker
(я использовал код, находящийся в ответ), однако это решение не дает мне доступа к самому элементу управления, просто AutomationElement
. В идеале, поскольку есть AutomationPeer для управления, мне было интересно, есть ли лучший способ получить этот контроль (даже если невозможно добраться до UIMap).
кроме того, замечу. Я уже понимаю, что Visual Studio игнорирует TextBlock
s при выполнении закодированного пользовательского интерфейса Тестирование, потому что их может быть так много. Прямо сейчас я больше озабочен тем, чтобы добраться до ItemsControl
себя, а не индивидуума TextBlock
s, которые генерируются из него.
2 ответов
немного покопавшись в этой проблеме, я нашел полу-решение. Я посмотрел, как 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
. Думаю, это частичное решение.
ItemsControl и TextBlock не имеют AutomationPeer внутри. The ItemsControlAutomationPeer является абстрактным классом. Вот одно из решений для поиска элементов, а не сам ItemsControl:WPF ItemsControl с TestStack Белый.