В PywinAuto операции с объектами интерфейса некоторых приложений выполняются долго (15-20 секунд). Как можно оптимизировать это?

Всем привет. Может кто сталкивался. Помогите опитимизировать. В PywinAuto операции с найденными элементами для некоторых приложений выполняются достаточно долго. Например, после того как элемент найден, click_input() по нему выполняется через 9-15 секунд. Отслеживаю дебагом - поиск выполняется достаточно быстро (менее секунды), а вот на самой операции 15-20 секунд. Причем не важно какая операция. Еще пример, операция type_keys(), сама печать - все быстро, а вот перед началом операции печати пауза 15 сек

Приложение desktop карта. При просмотре с помощью inspector элементов приложения достаточно много. Может с этим связано? Есть какие-то варианты оптимизации? Заранее спасибо

Пример кода

search_bar = main_window.child_window(auto_id="FullNameBox", class_name='RadWatermarkTextBox') search_bar.click_input()


Ответы (1 шт):

Автор решения: Vasily Ryabov

Дело в том, что первая строка ещё не выполняет поиск, а только создаёт поисковый объект. Поиск неявно вызывается при попытке вызвать метод click_input. Чтобы вызвать явно поиск, нужен метод .wrapper_object() или .wait('ready', timeout=10). Например:

search_bar = main_window.child_window(auto_id="FullNameBox", class_name='RadWatermarkTextBox').wrapper_object()
search_bar.click_input()

Причём main_window - скорее всего тоже поисковый объект (типа WindowSpecification), и по нему поиск запускается в первую очередь. Правда, текущая реализация не позволяет создавать WindowSpecification от враппера. Попозже сделаем в следующем большом релизе. Есть разные трюки, чтобы оптимизировать поиск:

  1. Не использовать доступ по атрибуту, а юзать только child_window(...)
  2. Юзать чаще class_name или control_type (для backend="uia"), потому что предварительная фильтрация по типу контрола сильно быстрее, чем по тексту. Если текст есть в критерии, то по нему поиск будет в последнюю очередь, то есть уже среди мЕньшего числа элементов. Получение текста - самая дорогая операция.
  3. Можно ещё ограничивать поиск в глубину параметром depth=1, но тогда надо больше уровней поиска делать.
→ Ссылка