@monitoro/herd
Version:
Automate your browser, build AI web tools and MCP servers with Monitoro Herd
201 lines (200 loc) • 6.19 kB
TypeScript
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>;
}