Я пытаюсь запрограммировать автоматизированное приложение для тестирования, используя новый родной интерфейс 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 (другого приложения!!!)? Как вообще возможно получить доступ к исчезнувшим элементам без использования кэширования? Что я пропустил?
Мне очень нужна помощь.
Хорошо, еще несколько выводов:
UISpy.exe может обновлять дерево UIA таким же таинственным образом, как и inspect.exe (это особенно странно, потому что inspect.exe использует тот же родной интерфейс, что и я, но UISpy. exe использует интерфейс .NET AFAIK). Это означает, что это своего рода общесистемная и постоянная проблема UIA, а не чисто собственная проблема UIA.
Проблема не возникает, если я не обращаюсь к дереву допереключения вида. т.е. если мое тестовое приложение не обращается к представлению AUT перед переключением представления нажатием кнопки главного меню, оно без проблем видит новые виджеты. Это явно указывает на некоторые проблемы с кэшированием собственного API UIA - даже если я понятия не имею, как это могло произойти, потому что я вообще не кэширую. Кто-нибудь знает, есть ли какое-то внутреннее кэширование?
Я думаю, это может быть ошибка API. Однако, учитывая мой нынешний опыт работы с Microsoft Connect, я немного потерялся с этой демонстрацией :-(
У кого-нибудь есть идеи?
Я также протестировал инструмент Snoop. Использование Snoop НЕ устраняет проблему временно, как это делают Inspect и UISpy. По поводу Inspect.exe есть еще одна деталь... достаточно свернуть и развернуть поддерево AUT, чтобы временно залечить проблему.