Как получить все идентификаторы AutomationID приложения WPF в файле?

При автоматизации приложения WPF (с использованием UI Automation; VSTS 2010) мы добавляли все идентификаторы автоматизации в файл ресурсов вручную, а затем обращались к нему один за другим. Учитывая, что приложение может расширяться в любое время, ручное добавление этих идентификаторов может стать утомительным.

Итак, есть ли какой-нибудь инструмент, который может создать это для нас? т.е. получить все идентификаторы в иерархическом формате и сохранить его в файле (xml или csv), а затем мы можем проанализировать его при необходимости.

Я надеялся на такой инструмент, как UISpy, который может не только отслеживать все элементы, но и экспортировать их.

Существуют ли такие инструменты? Или есть альтернативный подход?

Любая ценная обратная связь высоко ценится.

Спасибо!

3 ответа

Я делаю так:

public static class AutomationIds
{
    public static readonly string MyDataGridId= Create();

    private static string Create([CallerMemberName] string name = null)
    {
        return name;
    }
}

<DataGrid AutomationProperties.AutomationId="{x:Static local:AutomationIds.MyDataGridId}"
          ... />

Потом в тестах

var dataGrid = window.Get<ListView>(AutomationIds.MyDataGridId);

Назначьте идентификаторы автоматизации непосредственно в XAML, а затем проанализируйте файлы XAML, так как они все-таки являются XML...

Давайте посмотрим... Во-первых, я думаю, что ваши данные не являются иерархическими - только потому, что элемент управления может быть динамически назначен как дочерний элемент другого.

Если мы изменим задачу на подмножество: "Как мы можем получить иерархическое представление элементов управления в момент времени t?" затем мы можем ответить на это с помощью MS UIA и, скажем, с помощью простого RawViewWalker (простой поиск в ширину в обходчике, начиная с вашего главного окна, будет делать - конечно, пока приложение работает, так что UIA может достигать и запрашивать Это).

Но это подмножество не удовлетворит ваш первоначальный вопрос, потому что вы, вероятно, увидите часть всей вашей коллекции пользовательского интерфейса (поскольку некоторые будут скрыты / не активированы еще в момент времени t).

Таким образом, становится очень трудно использовать инструмент на основе UIA (такой как uispy), потому что тогда вам придется устанавливать представление приложения в разные состояния, чтобы достигать всех элементов управления в вашем приложении в разное время t1, t2...

Я бы посоветовал проанализировать все ваши xmls одновременно и создать полное дерево "статической" карты управления приложением, которое, я считаю, будет наиболее близким к тому, о чем вы просите.

Учитывая, что это старый вопрос, я сомневаюсь, что он имеет значение больше, но просто хотел сделать различия здесь.

Другие вопросы по тегам