Устаревшее дерево автоматизации пользовательского интерфейса

Я пытаюсь запрограммировать автоматизированное приложение для тестирования, используя новый родной интерфейс Microsoft UI Automation 3.0 (в VC++ 2010, Win7). Тестируемое приложение (AUT) — это приложение WPF.

Почти все работает нормально... Я могу устанавливать обработчики событий, перемещаться по дереву, искать элементы по различным условиям и управлять найденными элементами по их шаблонам.

Но вчера я обнаружил поведение, которое приводит меня в отчаяние: дерево UIA моего AUT просто не обновляется после переключения его главной панели GUI нажатием одной из кнопок главного меню.

После нажатия кнопки главного меню я могу увидетьновые виджеты в графическом интерфейсе AUT, но дерево UIA по-прежнему содержит элементы управления, которые были там донажатия кнопки главного меню . (Устаревшее) дерево UIA все еще можно полностью прочитать с помощью функций поиска или с помощью Walker, но, конечно, его нельзя записать, поскольку виджетов больше не существует.

Это похоже на устаревший кеш... однако я вообще НЕ использую никаких кеширующих функций UIA. Никто. Никогда. Нигде.

Мне не удалось программно обновить дерево UIA... ни путем вызова каких-либо функций UIA, ни путем перезапуска приложения тестера, ни путем переключения графического интерфейса AUT вперед и назад. Это происходит не каждый раз. Иногда после нажатия на главную кнопку дерево выглядит должным образом обновленным, и все работает нормально. Однако большую часть запусков он терпит неудачу. Существует только один (загадочный) способ надежного обновления дерева UIA: использование inspect.exe. При использовании инструмента inspect.exe для краткого просмотра поддерева UIA AUT проблема внезапно исчезает, и мое приложение-тестер может немедленно получить доступ к фактическому обновленному дереву! Конечно, проблема снова появляется после перезапуска AUT.

Что инспектирует.exe сделать, чтобы обновить дерево UIA (другого приложения!!!)? Как вообще возможно получить доступ к исчезнувшим элементам без использования кэширования? Что я пропустил?

Мне очень нужна помощь.


Хорошо, еще несколько выводов:

  1. UISpy.exe может обновлять дерево UIA таким же таинственным образом, как и inspect.exe (это особенно странно, потому что inspect.exe использует тот же родной интерфейс, что и я, но UISpy. exe использует интерфейс .NET AFAIK). Это означает, что это своего рода общесистемная и постоянная проблема UIA, а не чисто собственная проблема UIA.

  2. Проблема не возникает, если я не обращаюсь к дереву допереключения вида. т.е. если мое тестовое приложение не обращается к представлению AUT перед переключением представления нажатием кнопки главного меню, оно без проблем видит новые виджеты. Это явно указывает на некоторые проблемы с кэшированием собственного API UIA - даже если я понятия не имею, как это могло произойти, потому что я вообще не кэширую. Кто-нибудь знает, есть ли какое-то внутреннее кэширование?

Я думаю, это может быть ошибка API. Однако, учитывая мой нынешний опыт работы с Microsoft Connect, я немного потерялся с этой демонстрацией :-(

У кого-нибудь есть идеи?


Я также протестировал инструмент Snoop. Использование Snoop НЕ устраняет проблему временно, как это делают Inspect и UISpy. По поводу Inspect.exe есть еще одна деталь... достаточно свернуть и развернуть поддерево AUT, чтобы временно залечить проблему.

6
задан Silicomancer 30 May 2012 в 17:49
поделиться