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>;
}
