WebUserSimLib - это легковесная Java-библиотека, предназначенная для реалистичной симуляции поведения пользователя при взаимодействии с веб-приложениями.
Управление браузером осуществляется через Chrome DevTools Protocol (CDP) по протоколу WebSocket без использования веб-драйверов.
- Human-like ввод: Симуляция движения мыши по нелинейным траекториям и набора текста с естественными ошибками.
- Прямое управление через CDP: Низкоуровневая отправка событий ввода (
Input.dispatchMouseEvent,Input.dispatchKeyEvent). - Многовкладочный режим: Управление жизненным циклом вкладок Chromium, группировка сессий и переключение контекста.
- Fluent Scenario API: Удобный декларативный подход для цепочечного вызова действий (клики, заполнение форм).
- Расширяемая система профилей: Возможность точечной настройки физических и психологических параметров "оператора".
Симуляция базируется на математических моделях человеческой моторики и когнитивных реакций. Поведение разделено на два ключевых компонента: профиль мыши и профиль клавиатуры.
Движение курсора мыши не является прямой линией. Оно основано на:
- Законе Фиттса (Fitts's Law): Математическая модель человеческого движения, связывающая время перемещения с расстоянием до цели и её размером. Расчет шагов и микро-задержек (
MotionProfile) динамически адаптируется под размер целевого web-элемента. - Траекториях Безье с осцилляцией: Курсор перемещается по кубической кривой Безье с применением сглаживания скорости (Ease-In-Out). Дополнительно накладываются гармонические микро-колебания (волны с настраиваемой амплитудой и частотой), имитирующие естественное дрожание человеческой руки.
Ниже представлена настройка MotionProfile и MouseProfile
MotionProfile motionProfile = new MotionProfile.Builder()
.a(1)
.b(4)
.maxSteps(1000)
.build();
MouseProfile mouseProfile = new CustomMouseProfile.Builder()
.speed(40)
.amplitude(10)
.frequency(10)
.curveOffset(10)
.trajectoryStyle(PresetTrajectoryStyle.BEZIER)
.motionProfile(motionProfile)
.build();В законе Фиттса:
- a - Базовое время реакции/подготовки (в секундах). Это время, которое требуется человеку чисто на «подумать» и начать движение, либо минимальное время на клик по гигантской кнопке, которая находится прямо под курсором.
- b - Индекс скорости обработки информации (коэффициент Фиттса). Он завязан на пропускную способность человеческой моторики. Чем выше этот коэффициент, тем сильнее общее время движения будет увеличиваться при росте расстояния до объекта или уменьшении размера самой кнопки.
Процесс набора текста полностью копирует поведение человека на основе теории вероятностей:
- Имитация опечаток: С заданной вероятностью (
mistakeChance) оператор нажимает на соседнюю физическую клавишу на раскладке (вычисляется геометрически черезKeyUtils.getNearbyKeyдля QWERTY и ЙЦУКЕН). - Когнитивный контроль: С определенной вероятностью оператор может заметить или не заметить (
unnoticedMistakeChance) допущенную ошибку. Если ошибка замечена, симулятор выдерживает паузу осознания, нажимаетBackspace, ждет фиксацию исправления и вводит верный символ.
Ниже представлена настройка KeyboardProfile
KeyboardProfile keyboardProfile = new CustomKeyboardProfile.Builder()
.mistakeChance(0.5)
.unnoticedMistakeChance(0.5)
.delayAfterMistake(3000)
.delayBetweenKeys(2000)
.build();Доступны готовые пресеты: PRO (быстрый, безошибочный), BASIC (средний пользователь) и BEGINNER (медленный, часто ошибающийся).
Ниже представлен рабочий сценарий: автоматический запуск процесса Chromium, инициализация контроллера, создание кастомных профилей человеческого поведения и запуск цепочки действий через Scenario API.
// 1. Запуск процесса браузера и контроллера CDP
BrowserProcess browser = BrowsersFactory.Chrome();
BrowserController browserController = ControllersFactory.Chromium(browser.getPort());
// 2. Инициализация фасада управления вкладками
Tab tabs = new ChromiumTab(browserController);
// Открываем тестовую страницу из ресурсов или указываем url
String testPage = Objects.requireNonNull(Main.class.getResource("/templates/test_page.html")).toURI().toString();
tabs.openTab("test", testPage);
Thread.sleep(3000); // Ожидаем визуальной стабилизации страницы
try {
// 3. Конфигурация модели движения мыши (Закон Фиттса)
MotionProfile motionProfile = new MotionProfile.Builder()
.a(1)
.b(4)
.maxSteps(1000)
.build();
// 4. Тонкая настройка кастомного профиля мыши
MouseProfile mouseProfile = new CustomMouseProfile.Builder()
.speed(40)
.amplitude(10)
.frequency(10)
.curveOffset(10)
.trajectoryStyle(PresetTrajectoryStyle.BEZIER)
.motionProfile(motionProfile)
.build();
// 5. Тонкая настройка профиля клавиатуры (50% шанс опечатки)
KeyboardProfile keyboardProfile = new CustomKeyboardProfile.Builder()
.mistakeChance(0.5)
.unnoticedMistakeChance(0.5)
.delayAfterMistake(3000)
.delayBetweenKeys(2000)
.build();
// 6. Декларативное выполнение сценария симуляции поведения
Scenario.create(tabs)
.toggleAll() // Включаем логирование/отслеживание всех действий
.setMouseProfile(mouseProfile)
.setKeyboardProfile(keyboardProfile)
.click(new JSONObject().put("selector", "#btn1"))
.fill(new JSONObject().put("selector", "#input1").put("text", "123"))
.run();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7. Корректное закрытие сессий и ресурсов
tabs.disconnect();
browserController.close();
}