SlideShare a Scribd company logo
20 Международная конференция
по вопросам качества ПО
sqadays.com
Нижний Новгород. 10 декабря 2016
Василий Рябов
AQuantia Rus, Нижний Новгород
GUI тесты на чистом питоне:
Win32 API, MS UI Automation и
щепотка чёрной магии
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Автоматизация десктопного GUI
Задачи:
(1) уметь управлять GUI приложением
(2) уметь получать текстовые данные из него
Проблема: нет единых стандартов
- разные оконные / widget системы
- огромное разнообразие фреймворков и библиотек
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Известные подходы
1. Координатный метод (autopy, PyAutoGUI)
click(120, 170)
type_keys(“If I was lucky, I'd be at the edit box.”)
2. Распознавание изображений (Sikuli, Lackey)
find(“OK_button.png”).click()
3. Accessibility технологии
btn = window(title_re=”Browse.*”, class_name=”Button”)
btn.get_text()
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Accessibility технологии
MS UI Automation
WinForms, WPF, Qt, браузеры,
Store apps (Inspect.exe)
Apple Accessibility API
Cocoa, ...
AT SPI (через Dbus)
Qt, GTK, wxWidgets, ...
Win32 API
MFC, VCL, частично WinForms
(Spy++)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Open Source Tools for Win32 API
AutoIt
Большое сообщество, pyautoit (Sep, 2014)
Basic-like language, нет отладчика, нет планов на .NET
AutoHotKey
.ahk скрипты (исходный код на C++), есть COM интерфейс
pywinauto
Чистый Python, красивый ООП, permissive license
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Пример скрипта на pywinauto
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
История pywinauto
(2006-2010) Mark McMahon, 32-bit Python, pywinauto 0.4.0
(2010-2011) портирована на 64-битный Python (Intel)
2014 Python 2/3 compatibility (2.6+, 3.3+)
2015 внутренний fork (Intel) вышел как 0.5.0+
2016 MS UI Automation есть в 0.6.0 (31 октября)
есть планы ещё на 2 года минимум
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
MS UI Automation
- Native COM interface (UIAutomationCore.dll)
- .NET interface
Open Source Tools:
TestStack.White (C#) - with a long history (563 stars)
Winium.Desktop (C#) - young but good (105 stars)
pywinauto (310 stars)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Проблемы MS UI Automation
- Громоздко и сложно для изучения
- В .NET интерфейсе есть ошибки, которых нет
в нативном (UiaComWrapper)
- Custom COM interface (не IDispatch)
- Не поддерживает Java AWT/Swing и GTK+
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Решение для Python
IronPython
пытались использовать .NET интерфейс
есть ошибка с ArrayList^ (нужен костыль на C#)
CPython
пакет comtypes поддерживает custom COM интерфейсы
Ограничения: недогружает регистрацию
custom controls & custom properties
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Изменения в pywinauto
Низкоуровневый слой (backend)
“win32” (Win32 API, pywinauto 0.5.4)
“uia” (MS UI Automation, pywinauto 0.6.0+)
Было: app = Application().start(“sample.exe”)
Стало: app = Application(backend=”uia”).start(“sample.exe”)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Объект Application
app = Application().start(“sample.exe”)
app = Application(backend='win32').connect(path=”sample.exe”)
app = Application(backend='uia').connect(title_re=”^.*Sample$”)
app.kill_()
# process-agnostic way
desktop = Desktop(backend=”uia”)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Спецификация окна/контрола
WindowSpecification
описание критериев поиска (title, class_name, ...)
элемент может ещё/уже не существовать
умеет искать контролы, дожидаться их исчезновения, ...
Wrapper
объект, привязанный к реальному контролу
умеет посылать команды, получать данные
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Как создать описание?
app.MainWindow.OK
app[“Main Window”][“OK”]
app.window(best_match=”Main Window”) 
.child_window(best_match=”OK”)
app.MainWindow.child_window(title=”OK”,
работает быстрее ---> class_name=”Button”)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Подъёмник за гобеленом
app.Properties.OK.click()
работает так же, как
app.Properties.OK.wrapper_object().click()
Но:
app.Properties.OK возвращает WindowSpecification
app.Properties.OK.wrapper_object() ← ButtonWrapper
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Registry pattern с помощью метакласса
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Registry pattern с помощью метакласса
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Registry pattern с помощью метакласса
Пример для explorer.exe
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Пример для explorer.exe
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Пример для explorer.exe
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Где взять имена для доступа?
app.MainWindow.print_control_identifiers()
ComboBox - 'Gray' (L789, T594, R906, B615)
'Border sizeComboBox' 'ComboBox' ()
Button - 'Set' (L1083, T592, R1157, B615)
'Button' 'Button0' 'Button1' 'Set' 'SetButton' ()
Button - 'OK' (L1048, T695, R1123, B718)
'Button2' 'OK' 'OKButton' ()
Button - 'Cancel' (L1129, T695, R1204, B718)
'Button3' 'Cancel' 'CancelButton' ()
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Способы делать магию
1. By title: app.Properties.OK.click()
2. By title+type: app.PropertiedDialog.OKButton.click()
3. By type+index: app.Properties.Button3.click()
4. By top-left label: app.SaveAs.FileNameEdit.set_text(“”)
5. By item text:
app.Properties.TabControlSharing.select(“General”)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Обработка ожиданий
window = app.Window_(title=”Main Window”)
window.wait(“active”, timeout=20)
window.wait_not(“visible enabled”)
window.exists() / .visible() / .enabled() / .active()
# wait until CPU usage < 2%
app.wait_cpu_usage_lower(threshold=2, timeout=10)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
GUI тесты это ...
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Общие проблемы GUI Automation
Нужен активный desktop
чтобы работал ввод: click_input(), type_keys(“”)
Разовый запуск по RDP (Remote Desktop)
держим RDP не свёрнутым, не в полном экране → OK
Для регулярного запуска под Continuous Integration в лабе
настраиваем autologon
ставим VNC server (можно делать безопасный disconnect)
не запускаем Jenkins slave как сервис
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Другие платформы
Linux (есть pyatspi2 и LDTP)
реализованы mouse/keyboard модули через python-xlib
AT SPI: пока только планы
OS X (есть pyatom)
простой прототип для окон верхнего уровня
Java (есть Jemmy на Java)
Python-to-Java bridge: JPype (кросс-платформенный)
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Ещё больше фич
win32_hooks (a.k.a. hot keys)
оттестированы, улучшения войдут в 0.6.1
Automation Event Handlers (MS UI Automation)
обработчики на любое событие (знаем, как сделать)
Тестирование локализаций
1 скрипт для разных языков (есть тесты, нет реальных примеров)
Поиск типичных ошибок на окне
есть простые проверки, нужно расширять и ревьюить
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Процесс разработки
“Unit” тесты на Windows/Linux (модуль unittest)
AppVeyor CI
Travis CI
Code coverage ~95% (codecov.io)
Static analyzers
Landscape.io Quantified Code Codacy
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Благодарности
Valentin Kroupkin (Auckland, New Zeland)
MS UI Automation, тесты, Continuous Integration & more
Denis Matiychuk (Kharkiv, Ukraine)
GUI инспектор объектов + генератор кода: SWAPY
Alexander Rumyantsev (Lobachevsky State University, NN)
MS UI Automation, multi-backend
Ivan Magazinnik (Lobachevsky State University, NN)
модули mouse/keyboard на Linux
and more…
GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
Контакты
@gmail.com & Skype: vasily.v.ryabov
сайт: pywinauto.github.io
GitHub: pywinauto/pywinauto
Доки: pywinauto.readthedocs.io
Русскоязычный чат: room on Gitter
tag “pywinauto” on StackOverflow

More Related Content

PPTX
course js day 1
PDF
Разница в подходах анализа кода компилятором и выделенным инструментом
PPSX
PDF
О сложностях программирования, или C# нас не спасет?
PDF
Павел Довгалюк, Обратная отладка
PPTX
Automation patterns on practice
PPTX
Автоматизируем GUI тесты на питоне
PPT
Опыт тестирования API САПР платформы
course js day 1
Разница в подходах анализа кода компилятором и выделенным инструментом
О сложностях программирования, или C# нас не спасет?
Павел Довгалюк, Обратная отладка
Automation patterns on practice
Автоматизируем GUI тесты на питоне
Опыт тестирования API САПР платформы

Similar to GUI тесты на чистом питоне: Win32, MS UI Automation и щепотка чёрной магии (20)

PPTX
Automation testing desktop applications
PPTX
PDF
White automation
PPTX
Кросс-платформенная мобильная разработка
PPTX
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
PDF
Особенности тестирования мобильных приложений (Android, iOS)
PPTX
Автоматизация тестирования iOS и Android приложений
PPTX
Автоматизация тестирования iOS приложений: от идеи к готовому решению
PPT
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
PDF
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
PDF
Так круто, что даже отвратительно
PPTX
разработка Metro style приложений
PDF
Алексей Андросов - Debugger: Отладка кода
PDF
Доклад Ильи Агеева "Bounty-программа в Badoo сказ о том, как хакеры нас на уя...
PPTX
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
PPTX
Sqadays 8-barancev
PDF
Илья Агеев, QA Lead, Badoo, Security Meetup 4 декабря 2014, Mail.Ru Group
PPT
Эффективная архитектура мобильной автоматизации
PDF
CodeFest 2012. Анкудинов Д. — О специфике мультиплатформенного тестирования игр
PPTX
Mobile automation overview
Automation testing desktop applications
White automation
Кросс-платформенная мобильная разработка
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Особенности тестирования мобильных приложений (Android, iOS)
Автоматизация тестирования iOS и Android приложений
Автоматизация тестирования iOS приложений: от идеи к готовому решению
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
Так круто, что даже отвратительно
разработка Metro style приложений
Алексей Андросов - Debugger: Отладка кода
Доклад Ильи Агеева "Bounty-программа в Badoo сказ о том, как хакеры нас на уя...
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
Sqadays 8-barancev
Илья Агеев, QA Lead, Badoo, Security Meetup 4 декабря 2014, Mail.Ru Group
Эффективная архитектура мобильной автоматизации
CodeFest 2012. Анкудинов Д. — О специфике мультиплатформенного тестирования игр
Mobile automation overview
Ad

GUI тесты на чистом питоне: Win32, MS UI Automation и щепотка чёрной магии

  • 1. 20 Международная конференция по вопросам качества ПО sqadays.com Нижний Новгород. 10 декабря 2016 Василий Рябов AQuantia Rus, Нижний Новгород GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии
  • 2. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Автоматизация десктопного GUI Задачи: (1) уметь управлять GUI приложением (2) уметь получать текстовые данные из него Проблема: нет единых стандартов - разные оконные / widget системы - огромное разнообразие фреймворков и библиотек
  • 3. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Известные подходы 1. Координатный метод (autopy, PyAutoGUI) click(120, 170) type_keys(“If I was lucky, I'd be at the edit box.”) 2. Распознавание изображений (Sikuli, Lackey) find(“OK_button.png”).click() 3. Accessibility технологии btn = window(title_re=”Browse.*”, class_name=”Button”) btn.get_text()
  • 4. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Accessibility технологии MS UI Automation WinForms, WPF, Qt, браузеры, Store apps (Inspect.exe) Apple Accessibility API Cocoa, ... AT SPI (через Dbus) Qt, GTK, wxWidgets, ... Win32 API MFC, VCL, частично WinForms (Spy++)
  • 5. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Open Source Tools for Win32 API AutoIt Большое сообщество, pyautoit (Sep, 2014) Basic-like language, нет отладчика, нет планов на .NET AutoHotKey .ahk скрипты (исходный код на C++), есть COM интерфейс pywinauto Чистый Python, красивый ООП, permissive license
  • 6. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Пример скрипта на pywinauto
  • 7. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии История pywinauto (2006-2010) Mark McMahon, 32-bit Python, pywinauto 0.4.0 (2010-2011) портирована на 64-битный Python (Intel) 2014 Python 2/3 compatibility (2.6+, 3.3+) 2015 внутренний fork (Intel) вышел как 0.5.0+ 2016 MS UI Automation есть в 0.6.0 (31 октября) есть планы ещё на 2 года минимум
  • 8. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии MS UI Automation - Native COM interface (UIAutomationCore.dll) - .NET interface Open Source Tools: TestStack.White (C#) - with a long history (563 stars) Winium.Desktop (C#) - young but good (105 stars) pywinauto (310 stars)
  • 9. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Проблемы MS UI Automation - Громоздко и сложно для изучения - В .NET интерфейсе есть ошибки, которых нет в нативном (UiaComWrapper) - Custom COM interface (не IDispatch) - Не поддерживает Java AWT/Swing и GTK+
  • 10. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Решение для Python IronPython пытались использовать .NET интерфейс есть ошибка с ArrayList^ (нужен костыль на C#) CPython пакет comtypes поддерживает custom COM интерфейсы Ограничения: недогружает регистрацию custom controls & custom properties
  • 11. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Изменения в pywinauto Низкоуровневый слой (backend) “win32” (Win32 API, pywinauto 0.5.4) “uia” (MS UI Automation, pywinauto 0.6.0+) Было: app = Application().start(“sample.exe”) Стало: app = Application(backend=”uia”).start(“sample.exe”)
  • 12. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Объект Application app = Application().start(“sample.exe”) app = Application(backend='win32').connect(path=”sample.exe”) app = Application(backend='uia').connect(title_re=”^.*Sample$”) app.kill_() # process-agnostic way desktop = Desktop(backend=”uia”)
  • 13. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Спецификация окна/контрола WindowSpecification описание критериев поиска (title, class_name, ...) элемент может ещё/уже не существовать умеет искать контролы, дожидаться их исчезновения, ... Wrapper объект, привязанный к реальному контролу умеет посылать команды, получать данные
  • 14. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Как создать описание? app.MainWindow.OK app[“Main Window”][“OK”] app.window(best_match=”Main Window”) .child_window(best_match=”OK”) app.MainWindow.child_window(title=”OK”, работает быстрее ---> class_name=”Button”)
  • 15. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Подъёмник за гобеленом app.Properties.OK.click() работает так же, как app.Properties.OK.wrapper_object().click() Но: app.Properties.OK возвращает WindowSpecification app.Properties.OK.wrapper_object() ← ButtonWrapper
  • 16. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Registry pattern с помощью метакласса
  • 17. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Registry pattern с помощью метакласса
  • 18. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Registry pattern с помощью метакласса
  • 20. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Пример для explorer.exe
  • 21. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Пример для explorer.exe
  • 22. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Где взять имена для доступа? app.MainWindow.print_control_identifiers() ComboBox - 'Gray' (L789, T594, R906, B615) 'Border sizeComboBox' 'ComboBox' () Button - 'Set' (L1083, T592, R1157, B615) 'Button' 'Button0' 'Button1' 'Set' 'SetButton' () Button - 'OK' (L1048, T695, R1123, B718) 'Button2' 'OK' 'OKButton' () Button - 'Cancel' (L1129, T695, R1204, B718) 'Button3' 'Cancel' 'CancelButton' ()
  • 23. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Способы делать магию 1. By title: app.Properties.OK.click() 2. By title+type: app.PropertiedDialog.OKButton.click() 3. By type+index: app.Properties.Button3.click() 4. By top-left label: app.SaveAs.FileNameEdit.set_text(“”) 5. By item text: app.Properties.TabControlSharing.select(“General”)
  • 24. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Обработка ожиданий window = app.Window_(title=”Main Window”) window.wait(“active”, timeout=20) window.wait_not(“visible enabled”) window.exists() / .visible() / .enabled() / .active() # wait until CPU usage < 2% app.wait_cpu_usage_lower(threshold=2, timeout=10)
  • 25. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии GUI тесты это ...
  • 26. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Общие проблемы GUI Automation Нужен активный desktop чтобы работал ввод: click_input(), type_keys(“”) Разовый запуск по RDP (Remote Desktop) держим RDP не свёрнутым, не в полном экране → OK Для регулярного запуска под Continuous Integration в лабе настраиваем autologon ставим VNC server (можно делать безопасный disconnect) не запускаем Jenkins slave как сервис
  • 27. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Другие платформы Linux (есть pyatspi2 и LDTP) реализованы mouse/keyboard модули через python-xlib AT SPI: пока только планы OS X (есть pyatom) простой прототип для окон верхнего уровня Java (есть Jemmy на Java) Python-to-Java bridge: JPype (кросс-платформенный)
  • 28. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Ещё больше фич win32_hooks (a.k.a. hot keys) оттестированы, улучшения войдут в 0.6.1 Automation Event Handlers (MS UI Automation) обработчики на любое событие (знаем, как сделать) Тестирование локализаций 1 скрипт для разных языков (есть тесты, нет реальных примеров) Поиск типичных ошибок на окне есть простые проверки, нужно расширять и ревьюить
  • 29. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Процесс разработки “Unit” тесты на Windows/Linux (модуль unittest) AppVeyor CI Travis CI Code coverage ~95% (codecov.io) Static analyzers Landscape.io Quantified Code Codacy
  • 30. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Благодарности Valentin Kroupkin (Auckland, New Zeland) MS UI Automation, тесты, Continuous Integration & more Denis Matiychuk (Kharkiv, Ukraine) GUI инспектор объектов + генератор кода: SWAPY Alexander Rumyantsev (Lobachevsky State University, NN) MS UI Automation, multi-backend Ivan Magazinnik (Lobachevsky State University, NN) модули mouse/keyboard на Linux and more…
  • 31. GUI тесты на чистом питоне: Win32 API, MS UI Automation и щепотка чёрной магии Контакты @gmail.com & Skype: vasily.v.ryabov сайт: pywinauto.github.io GitHub: pywinauto/pywinauto Доки: pywinauto.readthedocs.io Русскоязычный чат: room on Gitter tag “pywinauto” on StackOverflow