Автоматизация Windows GUI приложений на Python

Доброго всем времени суток. Спешу познакомить вас с модулем pywinauto для python. Он распространяется под лицензией GNU Lesser GPL, так что абсолютно бесплатен, позволяет автоматизировать тестирование или просто рутинные процессы для Windows приложений со стандартными контролами.

Приведу пример кода:

import pywinauto

app = pywinauto.application.Application()
app.start_(“notepad.exe”)
app.Notepad.MenuSelect(“Help->About Notepad”)
app.AboutNotepad.OK.Click()
app.Notepad.Edit.TypeKeys (“pywinauto Works!”, with_spaces = True)

Как видно, все интуитивно просто. Но прежде чем радоваться (или огорчаться), давайте обозначим основные достоинства и недостатки модуля.

Достоинства:

  • pywinauto - нативный модуль python
  • простой интерфейс доступа к элементам графического интерфейса
  • встроенный инструментарий для автоматизации

Из первого пункта, на самом деле, выплывает множество приятных вещей: не нужно таскать лишние dllки, стиль кодирования привычный для любого укротителя питона. А также вся мощь языка (и всех доступных модулей) в одной коробке! Можно с легкостью реализовать любое функциональное тестирование через графический интерфейс.

Со вторым пунктом, я думаю, все понятно из примера. Под встроенным инструментарием я понимаю спектр функций Wait, необходимых для ожидания нового окна или конкретного состояния элемента UI а также возможность делать скриншот любого элемента и возможность сохранить целый диалог в xml.

Недостатки:

  • работа только со стандартными контролами
  • последнее обновление было в начале 2011 года

pywinauto работает только со стандартными (Windows API) контролами. На самом деле, этого вполне достаточно для подавляющего большинства десктоп приложений. Хотя, в принципе, pywinauto будет видеть окно с нестандартными контролами, но кликнуть можно будет лишь по координатам. А это можно и без pywinauto сделать.

Также стоит добавить, что существует утилита, позволяющая значительно облегчить процесс автоматизации на pywinauto.

Утилита SWAPY уже описана в разделе инструменты. Вкратце скажу, что это аналог UI Spy на pywinauto, еще она умеет генерировать python код и выполнять действия непосредственно из себя. Кстати, SWAPY сразу даст вам понять, подходит ли pywinauto для автоматизации Вашего приложения или нет.

В следующей статье я планирую описать конкретный тест для простенького приложения и показать как все просто.

До встречи.

1 лайк

Для определения id нужного элемента использую утилиту swapy GitHub - pywinauto/SWAPY: not maintained any more (will be replaced by py_inspect) - в основном все удобно и понятно и нажимается все что нужно, но по некоторым элементам(таблица guptachildtable в окне) список элементов неактивный, если по такому элементу в таблице пытаюсь кликнуть, то выдается сообщение

AttributeError: The control does not have a __getitem__ method for item access (
i.e. ctrl[key]) so maybe you have requested this in error?

Код:

import pywinauto
import win32com.client
import time

pwa_app = pywinauto.application.Application()
comment back to Services window
w_handle = pywinauto.findwindows.find_windows(title=u'Contracted Services', class_name='Gupta:AccFrame')[0]
window = pwa_app.window_(handle=w_handle)
window.SetFocus()
comment save
ctrl = window[u'Gupta:ChildTable']
ctrl.SetFocus()

comment вот дальше не выполняется, выдается ошибка

ctrl[u'Description'].Select()

тоже самое с .click, clickInput

Подскажите как быть в такой ситуации, может есть другая утилита или можно както по controlid выбрать элемент?

Ну без самого приложения тут не разобраться, увы. Так что надо указать:

  • что запускаем
  • что ищем
  • добавить скриншоты или ссылку на программу

pywinauto не поддерживает иерархическое обращение к контролам больше, чем на 2 уровня. Схема всегда такая:

app.DialogName.ControlName.Method()

Можно выбрать элемент по ControlID вот так:

app.DialogName.ChildWindow(ctrl_id=0x01D8).Method()

В 3+ уровневой схеме не вижу большой необходимости, но вообще можно и реализовать, если будут запросы.

Обновление в 2011 году очень и очень печалит :frowning:

Обновление скоро появится в официальном виде версии 0.5.0. А пока можно попробовать здесь: GitHub - pywinauto/pywinauto: Windows GUI Automation with Python (based on text properties)
Баг-репорты и фича-реквесты приветствуем. Просто “download zip” и затем “python setup.py install”.
Python 3 тоже поддерживается!

2 лайка

Релиз pywinauto 0.5.0 готов!

Доступен также и на PyPI (просто запустите pip install pywinauto).

На всякий случай, ссылка на последний релиз (на текущий момент, 0.5.1):

3 лайка

Прекрасно, Василий :slight_smile: пользуюсь pywinauto в тестировании, здорово, что проект получил новое дыхание!