SikuliX – автоматизация GUI с распознаванием

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Автоматизация интерфейсов, особенно в условиях отсутствия API, требует нестандартных подходов. Визуальное распознавание элементов — один из таких. SikuliX — уникальный инструмент, позволяющий автоматизировать действия в GUI, опираясь на визуальные шаблоны (скриншоты интерфейса), а не структуру DOM или доступные элементы.

SikuliX изначально написан на Java, но его можно использовать с Python через Jython или с внешним вызовом через subprocess. Он предоставляет мощные средства визуального поиска, нажатия, ожидания и взаимодействия с любым элементом интерфейса, представленным как изображение.

Эта статья подробно рассматривает, как применять SikuliX для автоматизации в связке с Python, с разбором методов, примеров, кейсов, ограничений и лучших практик.

Основная часть

Установка SikuliX

SikuliX — это Java-приложение, его нельзя установить через pip. Необходимо:

  1. Скачать .jar файл с официального сайта

  2. Убедиться, что установлен Java 8 или выше

  3. (Опционально) настроить запуск через Jython или subprocess из Python

Запуск из Python:

import subprocess
subprocess.run(["java", "-jar", "sikulixide-2.0.5.jar"])

Архитектура и подход

SikuliX использует OpenCV для поиска изображений на экране. Вся логика построена на понятии «Region» — участок экрана, в котором выполняется поиск.

Основные объекты:

  • Screen — весь экран

  • Region — часть экрана

  • Pattern — объект изображения с точностью и аннотациями

SikuliX позволяет:

  • Кликать по кнопкам

  • Вводить текст в поля

  • Ожидать появления/исчезновения элементов

  • Выполнять drag-and-drop

  • Работать с несколькими мониторами


Использование Jython для Python-стиля

Пример запуска через Jython:

from sikuli import *
click("button.png")
type("hello")

На практике чаще используют .sikuli-скрипты и запускают их из Python:

runsikulix -r myscript.sikuli

Ключевые методы

click(image)

Нажимает на изображение на экране.

click("submit_button.png")

wait(image, timeout)

Ожидает появления изображения.

wait("dialog_box.png", 10)

type(text)

Вводит текст в текущее активное поле.

type("admin")

find(image)

Возвращает координаты найденного изображения.

region = find("icon.png")
print(region.x, region.y)

hover(image)

Наводит курсор на элемент.

dragDrop(source, target)

Выполняет перетаскивание между двумя изображениями.

exists(image)

Проверяет, есть ли элемент на экране.

doubleClick(image) / rightClick(image)

Дополнительные действия по элементу.


Работа с Region

r = Region(100, 100, 500, 400)
r.click("ok_button.png")

Это позволяет искать только в пределах определённого прямоугольника экрана, что ускоряет работу.


Пример скрипта автоматизации

click("login_button.png")
wait("username_field.png", 10)
type("myuser")
type(Key.TAB)
type("mypassword")
click("submit.png")

Точность распознавания и Pattern

p = Pattern("btn.png").similar(0.85)
click(p)

SikuliX позволяет задавать порог точности распознавания изображения. Это важно при работе с размытыми элементами.


Интеграция с Python

Через subprocess можно запускать .sikuli-скрипты или Java-файлы:

subprocess.run(["runsikulix", "-r", "myscript.sikuli"])

Либо через Jython импортировать скрипты и API.


Практические кейсы использования

  • Автоматизация legacy-систем без API

  • Визуальное тестирование UI

  • Работа с графическими интерфейсами в играх

  • Массовая обработка приложений, работающих в GUI

  • Быстрое прототипирование действий пользователя


Преимущества и ограничения

Плюсы:

  • Не зависит от структуры приложения

  • Работает с любыми окнами

  • Быстрая настройка

Минусы:

  • Зависимость от разрешения экрана и внешнего вида

  • Неустойчив к изменениям интерфейса

  • Требует Java и Jython для полной Python-интеграции


Сравнение с альтернативами

Инструмент Подход Распознавание Язык Платформенность
SikuliX Визуальное Да Java/Python Windows, Linux, macOS
PyAutoGUI Координаты Нет Python Windows, Linux, macOS
AutoHotKey Скрипты + WinAPI Нет AHK Только Windows
OpenCV Обработка фото Да Python/C++ Встроено

Библиотека SikuliX — это уникальный инструмент автоматизации, который управляет приложениями и элементами на экране с помощью распознавания изображений. Она позволяет взаимодействовать с интерфейсом так, как это делает человек — через клики, поиск и ввод, ориентируясь на визуальные элементы (скриншоты).

Важно: SikuliX официально работает через Jython (Python на Java) или через Java API. Для работы с Python 3 рекомендуется использовать SikuliX через Java + Py4J или subprocess. Однако функции библиотеки остаются теми же.


Установка и запуск SikuliX (общее)

  1. Скачай SikuliX IDE с официального сайта.

  2. Создай .sikuli-скрипты.

  3. Можно вызывать их из Python с помощью командной строки или через API.


Главный класс — Screen

Все взаимодействия происходят через объект экрана. Методы этого класса — ключевые в SikuliX.


Полный список основных функций библиотеки SikuliX с описанием


1. click(target)

Кликает по объекту на экране.

  • target: путь к изображению (.png) или объект Pattern.

Пример:

python
click("button.png")

2. doubleClick(target)

Двойной клик по изображению.


3. rightClick(target)

Правый клик по изображению.


4. hover(target)

Наводит курсор на изображение.


5. wait(target, timeout)

Ожидает появления объекта target в течение timeout секунд.

Пример:

python
wait("loading.png", 10)

6. exists(target, timeout=0)

Проверяет, существует ли объект на экране. Возвращает Match или None.


7. find(target)

Ищет изображение на экране. Если не найдено — выбрасывает исключение FindFailed.


8. findAll(target)

Возвращает все совпадения изображения на экране (генератор Match-объектов).


9. type(target, text)

Печатает text в элемент, обозначенный target. Сначала кликает по target, затем печатает.


10. paste(target, text)

Вставляет text с помощью буфера обмена. Лучше для Unicode-символов.


11. type(text)

Печатает текст в текущем фокусе (без выбора цели).


12. paste(text)

Вставляет текст без указания цели, в текущий фокус.


13. keyDown(key)

Удерживает клавишу key.

Пример:

python
keyDown(Key.CTRL)

14. keyUp(key)

Отпускает клавишу key.


15. type(key, KeyModifier)

Нажимает сочетание клавиш.

Пример:

python
type("a", Key.CTRL) # Ctrl + A

16. dragDrop(start, end)

Перетаскивает элемент с одного изображения к другому.

Пример:

python
dragDrop("file.png", "folder.png")

17. mouseDown(button)

Удерживает кнопку мыши (например, Button.LEFT).


18. mouseUp(button)

Отпускает кнопку мыши.


19. wheel(target, direction, steps)

Прокручивает колесико мыши:

  • direction: WHEEL_UP или WHEEL_DOWN

  • steps: количество "щелчков"

Пример:

python
wheel("scrollbar.png", WHEEL_DOWN, 5)

20. capture(region=None)

Снимает скриншот. Можно указать регион.

Пример:

python
path = capture() # снимок всего экрана

21. Region(x, y, w, h)

Создаёт регион экрана для работы только в его пределах.

Пример:

python
reg = Region(0, 0, 500, 500) reg.click("icon.png")

22. highlight(seconds)

Выделяет регион экрана цветной рамкой.


23. sleep(seconds)

Пауза выполнения скрипта.


24. popup(text)

Показывает системное окно с сообщением.


25. alert(text)

Похож на popup, но ожидает подтверждения.


26. input(text)

Запрашивает ввод у пользователя.


27. Env.getClipboard()

Получает данные из буфера обмена.


28. Env.setClipboard(text)

Устанавливает данные в буфер обмена.


29. App.open(path_or_command)

Открывает приложение.

Пример:

python
App.open("notepad.exe")

30. App.focus(title)

Переводит фокус на окно с заголовком title.


31. App.close(title)

Закрывает приложение по заголовку окна.


32. App(name).window()

Получает объект окна приложения.


Заключение

SikuliX остаётся уникальным инструментом визуальной автоматизации, особенно там, где недоступны традиционные средства взаимодействия. Его синергия с Python позволяет создавать мощные сценарии управления, обходя ограничения API или DOM. Несмотря на некоторую устаревшую архитектуру, он остаётся востребованным в задачах автоматизации интерфейсов и нестандартных GUI-приложений.