@antithesishq/bombadil/browser #

Exports #

Action #

type Action<
  Number = number,
  String = string
> = CustomAction<JSON[]> | "Back" | "Forward" | "Reload" | "Wait" | {
  Click: {
    fingerprint: Fingerprint;
    point: Point<Number>;
  };
} | {
  DoubleClick: {
    fingerprint: Fingerprint;
    point: Point<Number>;
    delayMillis?: Range;
  };
} | {
  TypeText: {
    text: String;
    delayMillis?: Range;
  };
} | {
  PressKey: {
    code: number;
  };
} | {
  ScrollUp: {
    origin: Point;
    distance: Number;
  };
} | {
  ScrollDown: {
    origin: Point;
    distance: Number;
  };
} | {
  SetFileInputFiles: {
    selector: string;
    files: string[];
  };
} | {
  MouseDrag: {
    from: Point;
    to: Point;
    steps: Number;
    delayMillis: Number;
  };
} | {
  SetViewport: {
    width: Number;
    height: Number;
  };
}

ActionTemplate #

type ActionTemplate = Action<Range, StringGenerator>

ConsoleEntry #

type ConsoleEntry = {
  timestamp: number;
  level: "warning" | "error";
  args: JSON[];
}

Fingerprint #

DOM element fingerprint. String fields are either non-blank or null, and structuralPath is set iff all other nullable fields are null.

type Fingerprint = {
  testId: string | null;
  id: string | null;
  role: string | null;
  accessibleName: string | null;
  tag: string;
  href: string | null;
  nameAttr: string | null;
  placeholder: string | null;
  inputType: string | null;
  textContent: string | null;
  structuralPath: string | null;
}
type NavigationEntry = {
  id: number;
  title: string;
  url: string;
}

Point #

type Point<Number = number> = {
  x: Number;
  y: Number;
}

Resources #

interface Resources {
  js_heap_used: number;
  js_heap_total: number;
  dom_nodes: number;
  documents: number;
  js_event_listeners: number;
  layout_objects: number;
  timestamp: number;
  thread_time: number;
  task_duration: number;
  script_duration: number;
}

State #

interface State {
  document: HTMLDocument;
  window: Window;
  navigationHistory: {
    back: NavigationEntry[];
    current: NavigationEntry;
    forward: NavigationEntry[];
  };
  errors: {
    uncaughtExceptions: {
      text: string;
      line: number;
      column: number;
      url: string | null;
      remote_object: {
        type_name: string;
        subtype: string | null;
        class_name: string | null;
        description: string | null;
        value: unknown;
      } | null;
      stacktrace: {
        name: string;
        line: number;
        column: number;
        url: string;
      }[] | null;
    }[];
  };
  console: ConsoleEntry[];
  lastAction: Action | null;
  resources: Resources;
}

actions #

function actions(generate: () => Tree<ActionTemplate> | ActionTemplate[]): ActionGenerator<ActionTemplate>;

extract #

function extract<T extends JSON>(query: (state: State) => T): Cell<T>;

getFingerprint #

function getFingerprint(element: Element): Fingerprint;

registerCustomAction #

Register a new custom action, returning a function used to create action templates in generators. Name must be unique.

The first two parameters to the handler are Document and Window, and then any arguments passed to the function.

function registerCustomAction<Args extends JSON[]>(name: string, handler: (document: Document, window: Window, ...args: Args) => Promise<void>): (...args: Args) => ActionTemplate;

weighted #

function weighted(value: [number, ActionTemplate | ActionGenerator<ActionTemplate>][]): ActionGenerator<ActionTemplate>;