Как я могу получить DataContext элемента управления из внешнего приложения, используя UI Automation (и / или White) - PullRequest
2 голосов
/ 21 августа 2009

Я использую Белый для управления пользовательским интерфейсом приложения WPF, и до сих пор он работал хорошо.

Однако я нахожусь в точке, где мне нужно проверить внутреннее состояние тестируемого приложения, чтобы проверить некоторые условия.

В частности, у меня есть DataGrid (из WPFToolkit ), который привязан к List<MyBusinessObject>. Поэтому каждая строка имеет DataContext из MyBusinessObject

Я могу получить сетку, используя белый, найдя ее по идентификатору автоматизации.

Тогда я могу сделать это:

var row = Grid.Rows[0]
row.AutomationElement.Current.Name

, которая возвращает строку "MyCompany.Namespace.MyBusinessObject", поэтому я почти там, но я не могу получить сам фактический бизнес-объект.

Я смотрел на WPF UIAutomation AutomationPeers (из AutomationPeer вы можете получить свойство Owner, которое является фактическим бизнес-объектом), но, кажется, вам нужно быть в процессе, чтобы использовать их поскольку все они имеют конструкторы, которые требуют от вас предоставить элемент управления WPF.

Можно ли каким-либо образом создать AutomationPeer из внешнего процесса или иным образом углубиться в фактический DataContext элемента управления WPF?

Ответы [ 2 ]

4 голосов
/ 04 декабря 2009

ItemStatus (свойство Attached)

Это свойство позволяет клиенту выяснить, передает ли элемент статус об элементе. Например, элемент, связанный с контактом в приложении обмена сообщениями, может быть «Занят» или «Подключен».

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

4 голосов
/ 21 августа 2009

Не думаю, что ты можешь. Единственный способ обмена информацией с помощью UI Automation - через предопределенных провайдеров, которые ориентированы на пользовательский интерфейс и то, что он отображает, а не на данные за ним: вы никогда не обмениваетесь фактическими объектами между вашим приложением и тестовым приложением.

Я думаю, что самое близкое, что вы можете получить, используя UIA, - это закодировать ваш BusinessObject или, по крайней мере, соответствующие данные, в строку и извлечь эту строку, используя ValuePattern.

...