UNPKG

taiko

Version:

Taiko is a Node.js library for automating Chromium based browsers

804 lines (729 loc) 22.2 kB
// Minimum TypeScript Version: 3.5 // Custom Typings for Taiko - https://docs.taiko.dev/api/reference // eslint-disable-next-line no-unused-vars import type Protocol from "devtools-protocol"; export type Cookie = Protocol.Network.Cookie; export type BrowserEvent = | "DOMContentLoaded" | "loadEventFired" | "networkAlmostIdle" | "networkIdle" | "firstPaint" | "firstContentfulPaint" | "firstMeaningfulPaint" | "targetNavigated"; /** * Options */ export interface BrowserOptions { headless?: boolean; args?: string[]; host?: string; port?: number; ignoreCertificateErrors?: boolean; observe?: boolean; observeTime?: number; dumpio?: boolean; } export interface EventOptions { waitForEvents?: BrowserEvent[]; } export interface VeryBasicNavigationOptions extends ForceOption { waitForNavigation?: boolean; } export interface BasicNavigationOptions extends VeryBasicNavigationOptions { navigationTimeout?: number; } export interface NavigationOptions extends BasicNavigationOptions, EventOptions { headers?: object; waitForStart?: number; } export interface ScrollOptions extends NavigationOptions { blockAlignment?: "start" | "center" | "end" | "nearest"; inlineAlignment?: "start" | "center" | "end" | "nearest"; } export interface ReloadOptions extends NavigationOptions { ignoreCache?: boolean; } export interface ClickOptions extends NavigationOptions, ForceOption { button?: "left" | "right" | "middle"; clickCount?: number; position?: string; elementsToMatch?: number; } export interface GlobalConfigurationOptions { navigationTimeout?: number; observeTime?: number; retryInterval?: number; retryTimeout?: number; noOfElementToMatch?: number; observe?: boolean; waitForNavigation?: boolean; waitForEvents?: BrowserEvent[]; ignoreSSLErrors?: boolean; headful?: boolean; criConnectionRetries?: number; firefox?: boolean; highlightOnAction?: boolean; local?: boolean; } export interface TapOptions extends BasicNavigationOptions, EventOptions, ForceOption {} export interface KeyOptions extends NavigationOptions { text?: string; delay?: number; } export interface WriteOptions extends NavigationOptions, ForceOption { delay?: number; hideText?: boolean; } export interface ScreenshotOptions { path?: string; fullPage?: boolean; encoding?: string; } // TODO: remove this type declaration and replace with devtools-protocol Emulation.SetDeviceMetricsOverrideRequest export interface ViewPortOptions { width: number; height: number; deviceScaleFactor?: number; mobile?: boolean; scale?: number; screenWidth?: number; screenHeight?: number; positionX?: number; positionY?: number; dontSetVisibleSize?: boolean; screenOrientation?: ViewPortScreenOrientation; viewport?: ViewPort; } export interface CookieOptions { url?: string; domain?: string; path?: string; } export interface ResizeWindowOptions { height?: number; width?: number; } export interface CookieDetailOptions extends CookieOptions { secure?: boolean; httpOnly?: boolean; sameSite?: string; expires?: number; } export interface LocationOptions { latitude: number; longitude: number; accuracy?: number; } export interface ProximitySelectorNearOptions { offset: number; } export interface EvaluateHandlerArgs { [key: string]: any; } export interface EvaluateOptions extends Omit<NavigationOptions, "headers"> { args?: EvaluateHandlerArgs; } export interface DollarOptions { args?: any; } export interface TableCellOptions { row: number; col: number; } export interface MatchingOptions { exactMatch?: boolean; } export interface OpenWindowOrTabOptions extends NavigationOptions { name: string; } export interface BasicResponse { url: string; status: { code: number; text: string }; } export interface Response extends BasicResponse { redirectedResponse?: BasicResponse[]; } export interface ForceOption { force?: boolean; } export interface ForcedNavigationOptions extends NavigationOptions, ForceOption {} /** * Elements, Selectors and Searches */ export interface Element { objectId: string; description?: string; runtimeHandler?: any; get(): string; text(): Promise<string>; value(): Promise<string>; select(value?: string | number): Promise<void>; check(): Promise<void>; uncheck(): Promise<void>; isChecked(): Promise<boolean>; deselect(): Promise<void>; isSelected(): Promise<boolean>; isVisible(): Promise<boolean>; create(objectIds: string[], runtimeHandler?: any): Element[]; isDisabled(): Promise<boolean>; isDraggable(): Promise<boolean>; getAttribute(value: string): Promise<string>; isWritable(): Promise<boolean>; isConnected(): Promise<boolean>; isPassword(): Promise<boolean>; } export interface ElementWrapper { get(retryInterval?: number, retryTimeout?: number): Promise<ElementWrapper>; readonly description: string; exists(retryInterval?: number, retryTimeout?: number): Promise<boolean>; text(): Promise<string>; isVisible(retryInterval?: number, retryTimeout?: number): Promise<boolean>; isDisabled(retryInterval?: number, retryTimeout?: number): Promise<boolean>; isDraggable(retryInterval?: number, retryTimeout?: number): Promise<boolean>; attribute(name: string): Promise<string>; elements(retryInterval?: number, retryTimeout?: number): Promise<Element[]>; element( index: number, retryInterval?: number, retryTimeout?: number, ): Promise<Element>; } export interface ValueWrapper extends ElementWrapper { value(): Promise<string>; } export interface ButtonWrapper extends ElementWrapper {} export interface DollarWrapper extends ElementWrapper {} export interface ImageWrapper extends ElementWrapper {} export interface LinkWrapper extends ElementWrapper {} export interface ListItemWrapper extends ElementWrapper {} export interface TableCellWrapper extends ElementWrapper {} export interface TextWrapper extends ElementWrapper {} export interface ColorWrapper extends ValueWrapper { select(value?: string | number): Promise<void>; } export interface FileFieldWrapper extends ValueWrapper {} export interface TextBoxWrapper extends ValueWrapper {} export interface DropDownWrapper extends ValueWrapper { select( value?: string | number | string[] | number[] | { index: number[] }, ): Promise<void>; } export interface TimeFieldWrapper extends ValueWrapper { select(value?: Date): Promise<void>; } export interface RangeWrapper extends ValueWrapper { select(value?: string | number): Promise<void>; } export interface CheckBoxWrapper extends ElementWrapper { check(): Promise<void>; uncheck(): Promise<void>; isChecked(): Promise<boolean>; } export interface RadioButtonWrapper extends ElementWrapper { select(value?: string | number): Promise<void>; deselect(): Promise<void>; isSelected(): Promise<boolean>; } // BasicSelector mimics isSelector export interface BasicSelector { elements: Element[] | MatchingNode[] | string[]; exists(retryInterval?: number, retryTimeout?: number): Promise<boolean>; [key: string]: any; } export interface MatchingNode { elem: Element; dist: number; } /** * a relative search element is returned by proximity methods such as near, */ export interface RelativeSearchElement { desc: string; condition(element: Element, value: number): boolean; findProximityElementRects(): { elem: Element; result: any }; // result is wrapped in a callback validNodes(objectId: Element): MatchingNode; } // isSelector also allows ElementWrapper instances export type Selector = BasicSelector | ElementWrapper; // SearchElement mimics isSelector, isString, isElement and also allows relative search elements export type SearchElement = | string | Selector | Element | RelativeSearchElement | object; export interface AttrValuePairs { [key: string]: string; } /** * Intercept */ export type InterceptRedirectUrl = string; export interface InterceptMockData { [key: string]: any; } export interface InterceptRequest { continue(overrides?: { url?: string; method?: string; postData?: string; headers?: Record<string, unknown>; }): Promise<void>; respond(response: InterceptMockData): Promise<void>; requestId: string; request: { url: string; method: string; headers: { [key: string]: string }; postData?: string; hasPostData: boolean; postDataEntries: Array<{ bytes: string }>; initialPriority: string; referrerPolicy: string; }; frameId: string; resourceType: string; networkId: string; } export type interceptRequestHandler = ( request: InterceptRequest, ) => Promise<void>; /** * Viewport */ export interface ViewPortScreenOrientation { type: | "portraitPrimary" | "portraitSecondary" | "landscapePrimary" | "landscapeSecondary"; angle: number; } export interface ViewPort { x: number; y: number; width: number; height: number; scale: number; } /** * Distances */ export interface DragAndDropDistance { up: number; down: number; left: number; right: number; } /** * Coordinates */ export interface MouseCoordinates { x: number; y: number; } /** * Browser Actions */ // https://docs.taiko.dev/api/openbrowser export function openBrowser(options?: BrowserOptions): Promise<void>; // https://docs.taiko.dev/api/closebrowser export function closeBrowser(): Promise<void>; // https://docs.taiko.dev/api/client export function client(): any; // TODO: no TS Bindings available: https://github.com/cyrus-and/chrome-remote-interface/issues/112 // https://docs.taiko.dev/api/switchto // TODO: fix corresponding JSDoc in lib/taiko.js export function switchTo( target: RegExp | OpenWindowOrTabOptions, ): Promise<void>; // https://docs.taiko.dev/api/intercept // https://github.com/getgauge/taiko/issues/98#issuecomment-42024186 export function intercept( requestUrl: string, options?: InterceptMockData | interceptRequestHandler | InterceptRedirectUrl, count?: number, ): Promise<void>; // https://docs.taiko.dev/api/emulatenetwork export function emulateNetwork( networkType: | "GPRS" | "Regular2G" | "Good2G" | "Good3G" | "Regular3G" | "Regular4G" | "DSL" | "WiFi" | "Offline" | { offline?: boolean; downloadThroughput?: number; uploadThroughput?: number; latency?: number; }, ): Promise<void>; // https://docs.taiko.dev/api/emulatedevice export function emulateDevice(deviceModel: string): Promise<void>; // https://docs.taiko.dev/api/setviewport export function setViewPort(options: ViewPortOptions): Promise<void>; export function resizeWindow(options: ResizeWindowOptions): Promise<void>; // https://docs.taiko.dev/api/emulateTimezone export function emulateTimezone(timezoneId: string): Promise<void>; // https://docs.taiko.dev/api/opentab export function openTab( targetUrl?: string | OpenWindowOrTabOptions, options?: OpenWindowOrTabOptions, ): Promise<void>; // https://docs.taiko.dev/api/closetab export function closeTab(targetUrl?: string | RegExp): Promise<void>; // https://docs.taiko.dev/api/openincognitowindow export function openIncognitoWindow( url?: string | OpenWindowOrTabOptions, options?: OpenWindowOrTabOptions, ): Promise<void>; // https://docs.taiko.dev/api/closeincognitowindow export function closeIncognitoWindow(name: string): Promise<void>; // https://docs.taiko.dev/api/overridepermissions // TODO: use the proper type for the second param from devtools-protocol export function overridePermissions( origin: string, permissions: string[], ): Promise<void>; // https://docs.taiko.dev/api/clearpermissionoverrides export function clearPermissionOverrides(): Promise<void>; // https://docs.taiko.dev/api/setcookie export function setCookie( name: string, value: string, options?: CookieDetailOptions, ): Promise<void>; // https://docs.taiko.dev/api/deletecookies export function deleteCookies( cookieName?: string, options?: CookieOptions, ): Promise<void>; // https://docs.taiko.dev/api/getcookies export function getCookies(options?: { urls: string[] }): Promise<Cookie[]>; // https://docs.taiko.dev/api/setlocation export function setLocation(options: LocationOptions): Promise<void>; /** * Page Actions */ // https://docs.taiko.dev/api/goto export function goto( url: string, options?: NavigationOptions, ): Promise<Response>; // https://docs.taiko.dev/api/reload export function reload(url?: string, options?: ReloadOptions): Promise<void>; // https://docs.taiko.dev/api/goback export function goBack(options?: NavigationOptions): Promise<void>; // https://docs.taiko.dev/api/goforward export function goForward(options?: NavigationOptions): Promise<void>; // https://docs.taiko.dev/api/title export function title(): Promise<string>; // https://docs.taiko.dev/api/click export function click( selector: SearchElement | MouseCoordinates, options?: ClickOptions | RelativeSearchElement, ...args: RelativeSearchElement[] ): Promise<void>; // https://docs.taiko.dev/api/doubleclick export function doubleClick( selector: SearchElement | MouseCoordinates, options?: VeryBasicNavigationOptions | RelativeSearchElement, ...args: RelativeSearchElement[] ): Promise<void>; // https://docs.taiko.dev/api/rightclick export function rightClick( selector: SearchElement | MouseCoordinates, options?: VeryBasicNavigationOptions | RelativeSearchElement, ...args: RelativeSearchElement[] ): Promise<void>; // https://docs.taiko.dev/api/draganddrop export function dragAndDrop( source: SearchElement, destinationOrDistance: SearchElement | DragAndDropDistance, options?: ForceOption, ): Promise<void>; // https://docs.taiko.dev/api/hover export function hover( selector: SearchElement, options?: ForcedNavigationOptions, ): Promise<void>; // https://docs.taiko.dev/api/focus export function focus( selector: SearchElement, options?: ForcedNavigationOptions, ): Promise<void>; // https://docs.taiko.dev/api/write export function write( text: string, into?: SearchElement, options?: WriteOptions, ): Promise<void>; // https://docs.taiko.dev/api/clear export function clear( selector?: SearchElement, options?: ForcedNavigationOptions, ): Promise<void>; // https://docs.taiko.dev/api/attach export function attach( filepath: string, to: SearchElement, options?: ForceOption, ): Promise<void>; // https://docs.taiko.dev/api/press export function press( keys: string | string[], options?: KeyOptions, ): Promise<void>; // https://docs.taiko.dev/api/highlight export function highlight( selector: SearchElement, ...args: RelativeSearchElement[] ): Promise<void>; // https://docs.taiko.dev/api/clearHighlights export function clearHighlights(): Promise<void>; // https://docs.taiko.dev/api/mouseaction export function mouseAction( selector: SearchElement | "press" | "move" | "release", action?: "press" | "move" | "release" | MouseCoordinates, coordinates?: MouseCoordinates | NavigationOptions, options?: ForcedNavigationOptions, ): Promise<void>; // https://docs.taiko.dev/api/scrollto export function scrollTo( selector: SearchElement, options?: ScrollOptions, ): Promise<void>; // https://docs.taiko.dev/api/scrollright export function scrollRight( selector?: SearchElement | number, px?: number, ): Promise<void>; // https://docs.taiko.dev/api/scrollleft export function scrollLeft( selector?: SearchElement | number, px?: number, ): Promise<void>; // https://docs.taiko.dev/api/scrollup export function scrollUp( selector?: SearchElement | number, px?: number, ): Promise<void>; // https://docs.taiko.dev/api/scrolldown export function scrollDown( selector?: SearchElement | number, px?: number, ): Promise<void>; // https://docs.taiko.dev/api/screenshot export function screenshot( selector?: SearchElement, options?: ScreenshotOptions, ): Promise<Buffer | undefined>; // https://docs.taiko.dev/api/tap export function tap( selector: SearchElement, options?: TapOptions | RelativeSearchElement, ...args: SearchElement[] ): Promise<void>; /** * Selectors */ // https://docs.taiko.dev/api/$ export function $( selector: string | ((args?: any) => any), _options?: DollarOptions | RelativeSearchElement, ...args: RelativeSearchElement[] ): DollarWrapper; // https://docs.taiko.dev/api/image export function image( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): ImageWrapper; // https://docs.taiko.dev/api/link export function link( selector: SearchElement, options?: RelativeSearchElement, ...args: SearchElement[] ): LinkWrapper; // https://docs.taiko.dev/api/listitem export function listItem( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): ListItemWrapper; // https://docs.taiko.dev/api/button export function button( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): ButtonWrapper; // https://docs.taiko.dev/api/filefield export function fileField( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): FileFieldWrapper; // https://docs.taiko.dev/api/timefield export function timeField( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): TimeFieldWrapper; // https://docs.taiko.dev/api/range export function range( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): RangeWrapper; // https://docs.taiko.dev/api/color export function color( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): ColorWrapper; // https://docs.taiko.dev/api/tableCell export function tableCell( options?: TableCellOptions | SearchElement, selector?: SearchElement, ...args: RelativeSearchElement[] ): TableCellWrapper; // https://docs.taiko.dev/api/textbox export function textBox( labelOrAttrValuePairs?: string | AttrValuePairs | RelativeSearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): TextBoxWrapper; // https://docs.taiko.dev/api/dropdown export function dropDown( labelOrAttrValuePairs?: string | AttrValuePairs | RelativeSearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): DropDownWrapper; // https://docs.taiko.dev/api/checkbox export function checkBox( labelOrAttrValuePairs?: string | AttrValuePairs | RelativeSearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): CheckBoxWrapper; // https://docs.taiko.dev/api/radiobutton export function radioButton( selector: SearchElement, options?: RelativeSearchElement, ...args: RelativeSearchElement[] ): RadioButtonWrapper; // https://docs.taiko.dev/api/text export function text( selector: string | RegExp, options?: MatchingOptions | RelativeSearchElement, ...args: RelativeSearchElement[] ): TextWrapper; /** * Proximity Selectors */ // https://docs.taiko.dev/api/toleftof export function toLeftOf( selector: SearchElement | ElementWrapper, ): RelativeSearchElement; // https://docs.taiko.dev/api/torightof export function toRightOf( selector: SearchElement | ElementWrapper, ): RelativeSearchElement; // https://docs.taiko.dev/api/above export function above( selector: SearchElement | ElementWrapper, ): RelativeSearchElement; // https://docs.taiko.dev/api/below export function below( selector: SearchElement | ElementWrapper, ): RelativeSearchElement; // https://docs.taiko.dev/api/within export function within( selector: SearchElement | ElementWrapper, ): RelativeSearchElement; // https://docs.taiko.dev/api/near export function near( selector: SearchElement | ElementWrapper, opts?: ProximitySelectorNearOptions, ): RelativeSearchElement; /** * Events */ export interface DialogValue { message: string; type: string; url: string; defaultPrompt: string; } export type DialogHandler = (value: DialogValue) => void; // https://docs.taiko.dev/api/alert export function alert( messageOrCallback: string | RegExp | DialogHandler, callback?: DialogHandler, ): void; // https://docs.taiko.dev/api/prompt export function prompt( messageOrCallback: string | RegExp | DialogHandler, callback?: DialogHandler, ): void; // https://docs.taiko.dev/api/confirm export function confirm( messageOrCallback: string | RegExp | DialogHandler, callback?: DialogHandler, ): void; // https://docs.taiko.dev/api/beforeunload export function beforeunload(callback: () => Promise<void>): void; export type EvaluateHandler<T> = ( element: HTMLElement, args?: EvaluateHandlerArgs, ) => T; /** * Helpers */ // https://docs.taiko.dev/api/evaluate export function evaluate<T>( selector?: Selector | string | EvaluateHandler<T>, handlerCallback?: EvaluateHandler<T>, options?: EvaluateOptions, ): Promise<T>; // https://docs.taiko.dev/api/to export function to<T extends string | Selector>(value: T): T; // https://docs.taiko.dev/api/into export function into<T extends SearchElement>(value: T): T; // https://docs.taiko.dev/api/accept export function accept(text?: string): Promise<void>; // https://docs.taiko.dev/api/dismiss export function dismiss(): Promise<void>; // https://docs.taiko.dev/api/setconfig export function setConfig(options: GlobalConfigurationOptions): void; // https://docs.taiko.dev/api/getconfig export function getConfig(): GlobalConfigurationOptions; export function getConfig<T extends keyof GlobalConfigurationOptions>( option: T, ): Required<GlobalConfigurationOptions>[T]; // https://docs.taiko.dev/api/currenturl export function currentURL(): Promise<string>; // https://docs.taiko.dev/api/waitfor export function waitFor(time: number): Promise<void>; export function waitFor( elementOrCondition: SearchElement | (() => Promise<boolean>), time?: number, ): Promise<void>; export function clearIntercept(requestUrl?: string): void; // TODO // trying to support recorder.repl, not sure this is the right approach // export namespace recorder { // export function repl(): Promise<void>; // }