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