Как (правильно) кэшировать AutomationElements для будущего использования? - PullRequest
0 голосов
/ 28 марта 2012

В моем тестовом приложении я постоянно открываю и заново открываю форму.Каждый раз, когда форма открывается, я должен поместить все элементы формы в AutomationElementCollection, чтобы я мог работать с элементами.Тем не менее, кажется дорогостоящим многократное получение этих элементов (из-за древовидной навигации / переключения контекста и т. Д.).

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

Однако, когда я пытаюсь выполнить операции над любым AutomationElement в массиве (во второй раз), элементы, кажется, не доступны.Закрытие формы как-то "отключает" эти элементы?Должен ли я находить эти элементы каждый раз, когда открываю форму, чтобы они были «свежими»?

Я посмотрел на способ CacheRequest, но, похоже, он касается только доступа к свойствам / шаблонам, а не к элементам.

Вот код / ​​сообщение об ошибке:

AutomationElement GAP;
AutomationElementcollection GAP1;
private bool initGAP1 = false;
    public void initGAP()
    {
        if (!initGAP1)
        {
            int refnum = ...;
            int refnum2 = ...;
            AutomationElementCollection temp = MMChildren[refnum].FindAll(TreeScope.Children, findCondition);
            GAP = temp.FindAll(TreeScope.Children, findCondition)[refnum2];
            GAP1 = GAP.FindAll(TreeScope.Children, findCondition); //this contains the elements I want to operate on
            initGAP1 = true;
        }
    }

System.Windows.Automation.ElementNotEnabledException: исключение типа 'System.Windows.Automation.ElementNotEnabledException' было сгенерировано.

1 Ответ

2 голосов
/ 02 апреля 2012

Вам потребуется повторно получить элементы автоматизации для каждого нового окна.Как я понимаю, среда автоматизации пользовательского интерфейса дает вам возможность исследовать работающие окна.Он будет собирать информацию различными методами, в зависимости от того, какую среду использует целевое приложение.В вашем случае, если вы создаете и уничтожаете экземпляры окон, они рассматриваются как разные элементы AutomationElements, поскольку они являются разными окнами (в основном они имеют разные дескрипторы окон в ОС).Даже если базовый управляющий код один и тот же, это разные экземпляры для ОС и, следовательно, для автоматизации пользовательского интерфейса.

Если вы чувствуете, что страдаете от производительности при обходе, возможно, стоит подумать об использовании вместо этого UI Automation COM API, что значительно быстрее в некоторых операциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...