Как (правильно) кэшировать AutomationElements для будущего использования?
В моем тестовом приложении я постоянно открываю и заново открываю форму. Каждый раз, когда форма открыта, я должен поместить все элементы формы в 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 ответ
Вам нужно будет повторно получить элементы автоматизации для каждого нового окна. Как я понимаю, среда автоматизации пользовательского интерфейса дает вам возможность исследовать работающие окна. Он будет собирать информацию различными методами в зависимости от того, какую платформу использует целевое приложение. В вашем случае, если вы создаете и уничтожаете экземпляры окон, они рассматриваются как разные элементы Automation Elements, поскольку они являются разными окнами (в основном они имеют разные дескрипторы окон в ОС). Даже если базовый управляющий код один и тот же, это разные экземпляры для ОС и, следовательно, для автоматизации пользовательского интерфейса.
Если вы чувствуете, что страдаете от производительности во время обхода, возможно, стоит подумать об использовании вместо этого UI Automation COM API, что значительно быстрее в некоторых операциях.