UNPKG

browse

Version:

Unified Browserbase CLI for browser automation and cloud APIs.

87 lines (86 loc) • 3.07 kB
import { z } from "zod"; import { updateCursorOverlayPosition } from "../cursor-overlay.js"; const ButtonSchema = z.enum(["left", "right", "middle"]).optional(); export const mouseHandlers = { async "mouse.click"(manager, params) { const { button, clickCount, x, y } = z .object({ button: ButtonSchema, clickCount: z.number().int().positive().optional(), x: z.number(), y: z.number(), }) .strict() .parse(params); const page = await manager.activePage(); await positionCursorOverlay(manager, page, x, y); await page.click(x, y, { ...(button === undefined ? {} : { button }), ...(clickCount === undefined ? {} : { clickCount }), }); return { clicked: true }; }, async "mouse.hover"(manager, params) { const { x, y } = z .object({ x: z.number(), y: z.number(), }) .strict() .parse(params); const page = await manager.activePage(); await positionCursorOverlay(manager, page, x, y); await page.hover(x, y); return { hovered: true }; }, async "mouse.scroll"(manager, params) { const { deltaX, deltaY, x, y } = z .object({ deltaX: z.number(), deltaY: z.number(), x: z.number(), y: z.number(), }) .strict() .parse(params); const page = await manager.activePage(); await positionCursorOverlay(manager, page, x, y); await page.scroll(x, y, deltaX, deltaY); return { scrolled: true }; }, async "mouse.drag"(manager, params) { const { button, delay, fromX, fromY, steps, toX, toY } = z .object({ button: ButtonSchema, delay: z.number().int().nonnegative().optional(), fromX: z.number(), fromY: z.number(), steps: z.number().int().positive().optional(), toX: z.number(), toY: z.number(), }) .strict() .parse(params); const page = await manager.activePage(); await positionCursorOverlay(manager, page, fromX, fromY); await page.dragAndDrop(fromX, fromY, toX, toY, { ...(button === undefined ? {} : { button }), ...(delay === undefined ? {} : { delay }), ...(steps === undefined ? {} : { steps }), }); await positionCursorOverlay(manager, page, toX, toY); return { dragged: true }; }, }; async function positionCursorOverlay(manager, page, x, y) { if (!manager.isCursorOverlayEnabled(page)) return; // The overlay is visual-only. A navigation can destroy its execution // context, but that must not prevent or invalidate the real mouse action. try { await page.evaluate(updateCursorOverlayPosition, { x, y }); } catch { // Best-effort parity with V3's cursor updates. } }