Введение
Автоматизация интерфейсов, особенно в условиях отсутствия API, требует нестандартных подходов. Визуальное распознавание элементов — один из таких. SikuliX — уникальный инструмент, позволяющий автоматизировать действия в GUI, опираясь на визуальные шаблоны (скриншоты интерфейса), а не структуру DOM или доступные элементы.
SikuliX изначально написан на Java, но его можно использовать с Python через Jython или с внешним вызовом через subprocess. Он предоставляет мощные средства визуального поиска, нажатия, ожидания и взаимодействия с любым элементом интерфейса, представленным как изображение.
Эта статья подробно рассматривает, как применять SikuliX для автоматизации в связке с Python, с разбором методов, примеров, кейсов, ограничений и лучших практик.
Основная часть
Установка SikuliX
SikuliX — это Java-приложение, его нельзя установить через pip. Необходимо:
-
Скачать
.jar
файл с официального сайта -
Убедиться, что установлен Java 8 или выше
-
(Опционально) настроить запуск через 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 (общее)
-
Скачай SikuliX IDE с официального сайта.
-
Создай
.sikuli
-скрипты. -
Можно вызывать их из Python с помощью командной строки или через API.
Главный класс — Screen
Все взаимодействия происходят через объект экрана. Методы этого класса — ключевые в SikuliX.
Полный список основных функций библиотеки SikuliX с описанием
1. click(target)
Кликает по объекту на экране.
-
target
: путь к изображению (.png
) или объектPattern
.
Пример:
2. doubleClick(target)
Двойной клик по изображению.
3. rightClick(target)
Правый клик по изображению.
4. hover(target)
Наводит курсор на изображение.
5. wait(target, timeout)
Ожидает появления объекта target
в течение timeout
секунд.
Пример:
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
.
Пример:
14. keyUp(key)
Отпускает клавишу key
.
15. type(key, KeyModifier)
Нажимает сочетание клавиш.
Пример:
16. dragDrop(start, end)
Перетаскивает элемент с одного изображения к другому.
Пример:
17. mouseDown(button)
Удерживает кнопку мыши (например, Button.LEFT
).
18. mouseUp(button)
Отпускает кнопку мыши.
19. wheel(target, direction, steps)
Прокручивает колесико мыши:
-
direction
:WHEEL_UP
илиWHEEL_DOWN
-
steps
: количество "щелчков"
Пример:
20. capture(region=None)
Снимает скриншот. Можно указать регион.
Пример:
21. Region(x, y, w, h)
Создаёт регион экрана для работы только в его пределах.
Пример:
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)
Открывает приложение.
Пример:
30. App.focus(title)
Переводит фокус на окно с заголовком title
.
31. App.close(title)
Закрывает приложение по заголовку окна.
32. App(name).window()
Получает объект окна приложения.
Заключение
SikuliX остаётся уникальным инструментом визуальной автоматизации, особенно там, где недоступны традиционные средства взаимодействия. Его синергия с Python позволяет создавать мощные сценарии управления, обходя ограничения API или DOM. Несмотря на некоторую устаревшую архитектуру, он остаётся востребованным в задачах автоматизации интерфейсов и нестандартных GUI-приложений.