UNPKG

@monitoro/herd

Version:

Automate your browser, build AI web tools and MCP servers with Monitoro Herd

201 lines (200 loc) 6.19 kB
import { EventEmitter } from 'events'; import { JSDOM } from 'jsdom'; import type { HerdClient } from './HerdClient.js'; import type { Device } from './Device.js'; import type { ElementInfo, FindOptions, ClickOptions, FillOptions, WaitForOptions, Tab } from './types.js'; import { Node, SerializedDOMNode } from './Node.js'; export type NavigationCondition = 'load' | 'change' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'; export type ExtractSelectors = Record<string, string | { _$: string; attribute?: string; regex?: string | RegExp; pipes?: string[]; } | { _$r: string; [key: string]: any; }>; export declare class Page extends EventEmitter { private client; private device; private tabId; private tab; constructor(client: HerdClient, device: Device, tabId: string | number); get id(): number; get url(): string; get title(): string; get active(): boolean; /** * Navigate to a URL */ goto(url: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Find an element on the page */ find(selector: string, options?: FindOptions): Promise<ElementInfo | null>; /** * Click an element */ click(selector: string, options?: ClickOptions & { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Type text into a form field */ type(selector: string, text: string, options?: FillOptions & { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Focus an element */ focus(selector: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Blur an element */ blur(selector: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Press a key */ press(key: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Hover over an element */ hover(selector: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Move mouse to coordinates or element */ moveMouse(target: { x: number; y: number; } | string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Drag and drop elements */ drag(sourceSelector: string, targetSelector: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Scroll by x,y amount */ scroll(x: number, y: number, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Scroll to absolute position */ scrollTo(x: number, y: number, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Scroll element into view */ scrollIntoView(selector: string, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Dispatch an event */ dispatchEvent(eventName: string, selector?: string, detail?: unknown, options?: { waitForNavigation?: NavigationCondition; }): Promise<void | -1>; /** * Set value of form element */ setValue(selector: string, value: string | boolean, options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; private executeWithNavigation; querySelector(selector: string): Promise<Node | null>; querySelectorAll(selector: string): Promise<Node[]>; /** * Query the page for a single element (deserialized) */ $(selector: string, rootSelector?: string): Promise<Node | null>; /** * Query the page for multiple elements (deserialized) */ $$(selector: string, rootSelector?: string): Promise<Node[]>; elementFromPoint(x: number, y: number): Promise<Node | null>; /** * Query the page for a single element (serialized) */ _$(selector: string, rootSelector?: string): Promise<SerializedDOMNode | null>; /** * Query the page for multiple elements (serialized) */ _$$(selector: string, rootSelector?: string): Promise<SerializedDOMNode[]>; _elementFromPoint(x: number, y: number): Promise<SerializedDOMNode | null>; /** * Extract data from the page using selectors */ extract<T extends Record<keyof ExtractSelectors, any>>(config: ExtractSelectors): Promise<T>; /** * Wait for an element to appear/disappear */ waitForElement(selector: string, options?: WaitForOptions): Promise<ElementInfo | null>; /** * Wait for a selector to appear/disappear (alias for waitForElement) */ waitForSelector(selector: string, options?: WaitForOptions): Promise<ElementInfo | null>; /** * Wait for navigation to complete */ waitForNavigation(condition: 'load' | 'change' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'): Promise<void>; /** * Evaluate JavaScript in the page context */ evaluate<T>(script: string | (() => T)): Promise<T>; /** * Go back in history */ back(options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Go forward in history */ forward(options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Reload the page */ reload(options?: { waitForNavigation?: NavigationCondition; }): Promise<void>; /** * Make the tab active */ activate(): Promise<void>; /** * Close the page */ close(): Promise<void>; /** * Subscribe to page events * * WARNING: This method doesn't match any of the provided method names. * Consider renaming or removing if not needed. */ onEvent(callback: (event: any) => void): () => void; /** * Update tab information */ updateInfo(tab: Tab): void; /** * Returns a read-only DOM representation of the page. WARNING: events are not replicated to the remote page. */ dom(): Promise<JSDOM>; }