Как заставить 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 игнорирует TextBlocks при выполнении закодированного пользовательского интерфейса Тестирование, потому что их может быть так много. Прямо сейчас я больше озабочен тем, чтобы добраться до ItemsControl себя, а не индивидуума TextBlocks, которые генерируются из него.

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 Белый.