From 52f161fd6aaa7cea8c34a69c4ad70226cb7a1a7f Mon Sep 17 00:00:00 2001 From: Edward Jibson Date: Tue, 5 Nov 2024 10:36:36 +0000 Subject: [PATCH] feat(client): Allow tracing without FS --- .../playwright-core/src/client/tracing.ts | 2 + packages/playwright-core/types/types.d.ts | 11662 +++++++++------- 2 files changed, 6797 insertions(+), 4867 deletions(-) diff --git a/packages/playwright-core/src/client/tracing.ts b/packages/playwright-core/src/client/tracing.ts index 9d887c4a8b..5503d38cc5 100644 --- a/packages/playwright-core/src/client/tracing.ts +++ b/packages/playwright-core/src/client/tracing.ts @@ -89,11 +89,13 @@ export class Tracing async stopChunk() { this._traceBuffer = await this._collectTraceAsBuffer(); + return this._traceBuffer; } async stop() { this._traceBuffer = await this._collectTraceAsBuffer(); await this._channel.tracingStop(); + return this._traceBuffer; } private async _collectTraceAsBuffer(): Promise { diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index d963203643..0c2a294f00 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -14,19 +14,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ChildProcess } from 'child_process'; -import { EventEmitter } from 'events'; -import { Readable } from 'stream'; -import { ReadStream } from 'fs'; -import { Protocol } from './protocol'; -import { Serializable, EvaluationArgument, PageFunction, PageFunctionOn, SmartHandle, ElementHandleForTag, BindingSource } from './structs'; +import { ChildProcess } from "child_process"; +import { ReadStream } from "fs"; +import { Readable } from "stream"; +import { Protocol } from "./protocol"; +import { + BindingSource, + ElementHandleForTag, + EvaluationArgument, + PageFunction, + PageFunctionOn, + Serializable, + SmartHandle, +} from "./structs"; type PageWaitForSelectorOptionsNotHidden = PageWaitForSelectorOptions & { - state?: 'visible'|'attached'; -}; -type ElementHandleWaitForSelectorOptionsNotHidden = ElementHandleWaitForSelectorOptions & { - state?: 'visible'|'attached'; + state?: "visible" | "attached"; }; +type ElementHandleWaitForSelectorOptionsNotHidden = + ElementHandleWaitForSelectorOptions & { + state?: "visible" | "attached"; + }; /** * Page provides methods to interact with a single tab in a [Browser](https://playwright.dev/docs/api/class-browser), @@ -219,7 +227,10 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-evaluate-handle-option-expression). */ - evaluateHandle(pageFunction: PageFunction, arg: Arg): Promise>; + evaluateHandle( + pageFunction: PageFunction, + arg: Arg + ): Promise>; /** * Returns the value of the * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-evaluate-handle-option-expression) invocation as a @@ -264,7 +275,10 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-evaluate-handle-option-expression). */ - evaluateHandle(pageFunction: PageFunction, arg?: any): Promise>; + evaluateHandle( + pageFunction: PageFunction, + arg?: any + ): Promise>; /** * Adds a script which would be evaluated in one of the following scenarios: @@ -305,7 +319,10 @@ export interface Page { * [`script`](https://playwright.dev/docs/api/class-page#page-add-init-script-option-script) (only supported when * passing a function). */ - addInitScript(script: PageFunction | { path?: string, content?: string }, arg?: Arg): Promise; + addInitScript( + script: PageFunction | { path?: string; content?: string }, + arg?: Arg + ): Promise; /** * **NOTE** Use locator-based [page.locator(selector[, options])](https://playwright.dev/docs/api/class-page#page-locator) @@ -317,7 +334,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - $(selector: K, options?: { strict: boolean }): Promise | null>; + $( + selector: K, + options?: { strict: boolean } + ): Promise | null>; /** * **NOTE** Use locator-based [page.locator(selector[, options])](https://playwright.dev/docs/api/class-page#page-locator) * instead. Read more about [locators](https://playwright.dev/docs/locators). @@ -328,7 +348,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - $(selector: string, options?: { strict: boolean }): Promise | null>; + $( + selector: string, + options?: { strict: boolean } + ): Promise | null>; /** * **NOTE** Use locator-based [page.locator(selector[, options])](https://playwright.dev/docs/api/class-page#page-locator) @@ -338,7 +361,9 @@ export interface Page { * the return value resolves to `[]`. * @param selector A selector to query for. */ - $$(selector: K): Promise[]>; + $$( + selector: K + ): Promise[]>; /** * **NOTE** Use locator-based [page.locator(selector[, options])](https://playwright.dev/docs/api/class-page#page-locator) * instead. Read more about [locators](https://playwright.dev/docs/locators). @@ -381,7 +406,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-option-expression). * @param options */ - $eval(selector: K, pageFunction: PageFunctionOn, arg: Arg): Promise; + $eval( + selector: K, + pageFunction: PageFunctionOn, + arg: Arg + ): Promise; /** * **NOTE** This method does not wait for the element to pass actionability checks and therefore can lead to the flaky tests. * Use @@ -414,7 +443,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-option-expression). * @param options */ - $eval(selector: string, pageFunction: PageFunctionOn, arg: Arg): Promise; + $eval( + selector: string, + pageFunction: PageFunctionOn, + arg: Arg + ): Promise; /** * **NOTE** This method does not wait for the element to pass actionability checks and therefore can lead to the flaky tests. * Use @@ -447,7 +480,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-option-expression). * @param options */ - $eval(selector: K, pageFunction: PageFunctionOn, arg?: any): Promise; + $eval( + selector: K, + pageFunction: PageFunctionOn, + arg?: any + ): Promise; /** * **NOTE** This method does not wait for the element to pass actionability checks and therefore can lead to the flaky tests. * Use @@ -480,7 +517,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-option-expression). * @param options */ - $eval(selector: string, pageFunction: PageFunctionOn, arg?: any): Promise; + $eval( + selector: string, + pageFunction: PageFunctionOn, + arg?: any + ): Promise; /** * **NOTE** In most cases, @@ -511,7 +552,11 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-all-option-expression). */ - $$eval(selector: K, pageFunction: PageFunctionOn, arg: Arg): Promise; + $$eval( + selector: K, + pageFunction: PageFunctionOn, + arg: Arg + ): Promise; /** * **NOTE** In most cases, * [locator.evaluateAll(pageFunction[, arg])](https://playwright.dev/docs/api/class-locator#locator-evaluate-all), @@ -541,7 +586,11 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-all-option-expression). */ - $$eval(selector: string, pageFunction: PageFunctionOn, arg: Arg): Promise; + $$eval( + selector: string, + pageFunction: PageFunctionOn, + arg: Arg + ): Promise; /** * **NOTE** In most cases, * [locator.evaluateAll(pageFunction[, arg])](https://playwright.dev/docs/api/class-locator#locator-evaluate-all), @@ -571,7 +620,11 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-all-option-expression). */ - $$eval(selector: K, pageFunction: PageFunctionOn, arg?: any): Promise; + $$eval( + selector: K, + pageFunction: PageFunctionOn, + arg?: any + ): Promise; /** * **NOTE** In most cases, * [locator.evaluateAll(pageFunction[, arg])](https://playwright.dev/docs/api/class-locator#locator-evaluate-all), @@ -601,7 +654,11 @@ export interface Page { * @param arg Optional argument to pass to * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-eval-on-selector-all-option-expression). */ - $$eval(selector: string, pageFunction: PageFunctionOn, arg?: any): Promise; + $$eval( + selector: string, + pageFunction: PageFunctionOn, + arg?: any + ): Promise; /** * Returns when the @@ -641,7 +698,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-wait-for-function-option-expression). * @param options */ - waitForFunction(pageFunction: PageFunction, arg: Arg, options?: PageWaitForFunctionOptions): Promise>; + waitForFunction( + pageFunction: PageFunction, + arg: Arg, + options?: PageWaitForFunctionOptions + ): Promise>; /** * Returns when the * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-wait-for-function-option-expression) returns a @@ -680,7 +741,11 @@ export interface Page { * [`pageFunction`](https://playwright.dev/docs/api/class-page#page-wait-for-function-option-expression). * @param options */ - waitForFunction(pageFunction: PageFunction, arg?: any, options?: PageWaitForFunctionOptions): Promise>; + waitForFunction( + pageFunction: PageFunction, + arg?: any, + options?: PageWaitForFunctionOptions + ): Promise>; /** * **NOTE** Use web assertions that assert visibility or a locator-based @@ -725,7 +790,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - waitForSelector(selector: K, options?: PageWaitForSelectorOptionsNotHidden): Promise>; + waitForSelector( + selector: K, + options?: PageWaitForSelectorOptionsNotHidden + ): Promise>; /** * **NOTE** Use web assertions that assert visibility or a locator-based * [locator.waitFor([options])](https://playwright.dev/docs/api/class-locator#locator-wait-for) instead. Read more @@ -769,7 +837,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - waitForSelector(selector: string, options?: PageWaitForSelectorOptionsNotHidden): Promise>; + waitForSelector( + selector: string, + options?: PageWaitForSelectorOptionsNotHidden + ): Promise>; /** * **NOTE** Use web assertions that assert visibility or a locator-based * [locator.waitFor([options])](https://playwright.dev/docs/api/class-locator#locator-wait-for) instead. Read more @@ -813,7 +884,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - waitForSelector(selector: K, options: PageWaitForSelectorOptions): Promise | null>; + waitForSelector( + selector: K, + options: PageWaitForSelectorOptions + ): Promise | null>; /** * **NOTE** Use web assertions that assert visibility or a locator-based * [locator.waitFor([options])](https://playwright.dev/docs/api/class-locator#locator-wait-for) instead. Read more @@ -857,7 +931,10 @@ export interface Page { * @param selector A selector to query for. * @param options */ - waitForSelector(selector: string, options: PageWaitForSelectorOptions): Promise>; + waitForSelector( + selector: string, + options: PageWaitForSelectorOptions + ): Promise>; /** * The method adds a function called @@ -910,7 +987,11 @@ export interface Page { * @param callback Callback function that will be called in the Playwright's context. * @param options */ - exposeBinding(name: string, playwrightBinding: (source: BindingSource, arg: JSHandle) => any, options: { handle: true }): Promise; + exposeBinding( + name: string, + playwrightBinding: (source: BindingSource, arg: JSHandle) => any, + options: { handle: true } + ): Promise; /** * The method adds a function called * [`name`](https://playwright.dev/docs/api/class-page#page-expose-binding-option-name) on the `window` object of @@ -962,7 +1043,11 @@ export interface Page { * @param callback Callback function that will be called in the Playwright's context. * @param options */ - exposeBinding(name: string, playwrightBinding: (source: BindingSource, ...args: any[]) => any, options?: { handle?: boolean }): Promise; + exposeBinding( + name: string, + playwrightBinding: (source: BindingSource, ...args: any[]) => any, + options?: { handle?: boolean } + ): Promise; /** * Removes all the listeners of the given type (or all registered listeners if no type given). Allows to wait for @@ -1005,19 +1090,22 @@ export interface Page { * @param type * @param options */ - removeAllListeners(type: string | undefined, options: { - /** - * Specifies whether to wait for already running listeners and what to do if they throw errors: - * - `'default'` - do not wait for current listener calls (if any) to finish, if the listener throws, it may result in unhandled error - * - `'wait'` - wait for current listener calls (if any) to finish - * - `'ignoreErrors'` - do not wait for current listener calls (if any) to finish, all errors thrown by the listeners after removal are silently caught - */ - behavior?: 'wait'|'ignoreErrors'|'default' - }): Promise; + removeAllListeners( + type: string | undefined, + options: { + /** + * Specifies whether to wait for already running listeners and what to do if they throw errors: + * - `'default'` - do not wait for current listener calls (if any) to finish, if the listener throws, it may result in unhandled error + * - `'wait'` - wait for current listener calls (if any) to finish + * - `'ignoreErrors'` - do not wait for current listener calls (if any) to finish, all errors thrown by the listeners after removal are silently caught + */ + behavior?: "wait" | "ignoreErrors" | "default"; + } + ): Promise; /** * Emitted when the page closes. */ - on(event: 'close', listener: (page: Page) => any): this; + on(event: "close", listener: (page: Page) => any): this; /** * Emitted when JavaScript within the page calls one of console API methods, e.g. `console.log` or `console.dir`. @@ -1038,7 +1126,7 @@ export interface Page { * ``` * */ - on(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + on(event: "console", listener: (consoleMessage: ConsoleMessage) => any): this; /** * Emitted when the page crashes. Browser pages might crash if they try to allocate too much memory. When the page @@ -1058,7 +1146,7 @@ export interface Page { * ``` * */ - on(event: 'crash', listener: (page: Page) => any): this; + on(event: "crash", listener: (page: Page) => any): this; /** * Emitted when a JavaScript dialog appears, such as `alert`, `prompt`, `confirm` or `beforeunload`. Listener **must** @@ -1078,19 +1166,19 @@ export interface Page { * listeners are present, all dialogs are automatically dismissed. * */ - on(event: 'dialog', listener: (dialog: Dialog) => any): this; + on(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Emitted when the JavaScript * [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded) event is dispatched. */ - on(event: 'domcontentloaded', listener: (page: Page) => any): this; + on(event: "domcontentloaded", listener: (page: Page) => any): this; /** * Emitted when attachment download started. User can access basic file operations on downloaded content via the * passed [Download](https://playwright.dev/docs/api/class-download) instance. */ - on(event: 'download', listener: (download: Download) => any): this; + on(event: "download", listener: (download: Download) => any): this; /** * Emitted when a file chooser is supposed to appear, such as after clicking the ``. Playwright can @@ -1105,27 +1193,27 @@ export interface Page { * ``` * */ - on(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + on(event: "filechooser", listener: (fileChooser: FileChooser) => any): this; /** * Emitted when a frame is attached. */ - on(event: 'frameattached', listener: (frame: Frame) => any): this; + on(event: "frameattached", listener: (frame: Frame) => any): this; /** * Emitted when a frame is detached. */ - on(event: 'framedetached', listener: (frame: Frame) => any): this; + on(event: "framedetached", listener: (frame: Frame) => any): this; /** * Emitted when a frame is navigated to a new url. */ - on(event: 'framenavigated', listener: (frame: Frame) => any): this; + on(event: "framenavigated", listener: (frame: Frame) => any): this; /** * Emitted when the JavaScript [`load`](https://developer.mozilla.org/en-US/docs/Web/Events/load) event is dispatched. */ - on(event: 'load', listener: (page: Page) => any): this; + on(event: "load", listener: (page: Page) => any): this; /** * Emitted when an uncaught exception happens within the page. @@ -1141,7 +1229,7 @@ export interface Page { * ``` * */ - on(event: 'pageerror', listener: (error: Error) => any): this; + on(event: "pageerror", listener: (error: Error) => any): this; /** * Emitted when the page opens a new tab or window. This event is emitted in addition to the @@ -1170,14 +1258,14 @@ export interface Page { * wait until the page gets to a particular state (you should not need it in most cases). * */ - on(event: 'popup', listener: (page: Page) => any): this; + on(event: "popup", listener: (page: Page) => any): this; /** * Emitted when a page issues a request. The [request] object is read-only. In order to intercept and mutate requests, * see [page.route(url, handler[, options])](https://playwright.dev/docs/api/class-page#page-route) or * [browserContext.route(url, handler[, options])](https://playwright.dev/docs/api/class-browsercontext#browser-context-route). */ - on(event: 'request', listener: (request: Request) => any): this; + on(event: "request", listener: (request: Request) => any): this; /** * Emitted when a request fails, for example by timing out. @@ -1196,130 +1284,133 @@ export interface Page { * error net::ERR_FAILED. * */ - on(event: 'requestfailed', listener: (request: Request) => any): this; + on(event: "requestfailed", listener: (request: Request) => any): this; /** * Emitted when a request finishes successfully after downloading the response body. For a successful response, the * sequence of events is `request`, `response` and `requestfinished`. */ - on(event: 'requestfinished', listener: (request: Request) => any): this; + on(event: "requestfinished", listener: (request: Request) => any): this; /** * Emitted when [response] status and headers are received for a request. For a successful response, the sequence of * events is `request`, `response` and `requestfinished`. */ - on(event: 'response', listener: (response: Response) => any): this; + on(event: "response", listener: (response: Response) => any): this; /** * Emitted when [WebSocket](https://playwright.dev/docs/api/class-websocket) request is sent. */ - on(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + on(event: "websocket", listener: (webSocket: WebSocket) => any): this; /** * Emitted when a dedicated [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is spawned * by the page. */ - on(event: 'worker', listener: (worker: Worker) => any): this; + on(event: "worker", listener: (worker: Worker) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'close', listener: (page: Page) => any): this; + once(event: "close", listener: (page: Page) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + once( + event: "console", + listener: (consoleMessage: ConsoleMessage) => any + ): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'crash', listener: (page: Page) => any): this; + once(event: "crash", listener: (page: Page) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'dialog', listener: (dialog: Dialog) => any): this; + once(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'domcontentloaded', listener: (page: Page) => any): this; + once(event: "domcontentloaded", listener: (page: Page) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'download', listener: (download: Download) => any): this; + once(event: "download", listener: (download: Download) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + once(event: "filechooser", listener: (fileChooser: FileChooser) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'frameattached', listener: (frame: Frame) => any): this; + once(event: "frameattached", listener: (frame: Frame) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'framedetached', listener: (frame: Frame) => any): this; + once(event: "framedetached", listener: (frame: Frame) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'framenavigated', listener: (frame: Frame) => any): this; + once(event: "framenavigated", listener: (frame: Frame) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'load', listener: (page: Page) => any): this; + once(event: "load", listener: (page: Page) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'pageerror', listener: (error: Error) => any): this; + once(event: "pageerror", listener: (error: Error) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'popup', listener: (page: Page) => any): this; + once(event: "popup", listener: (page: Page) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'request', listener: (request: Request) => any): this; + once(event: "request", listener: (request: Request) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'requestfailed', listener: (request: Request) => any): this; + once(event: "requestfailed", listener: (request: Request) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'requestfinished', listener: (request: Request) => any): this; + once(event: "requestfinished", listener: (request: Request) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'response', listener: (response: Response) => any): this; + once(event: "response", listener: (response: Response) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + once(event: "websocket", listener: (webSocket: WebSocket) => any): this; /** * Adds an event listener that will be automatically removed after it is triggered once. See `addListener` for more information about this event. */ - once(event: 'worker', listener: (worker: Worker) => any): this; + once(event: "worker", listener: (worker: Worker) => any): this; /** * Emitted when the page closes. */ - addListener(event: 'close', listener: (page: Page) => any): this; + addListener(event: "close", listener: (page: Page) => any): this; /** * Emitted when JavaScript within the page calls one of console API methods, e.g. `console.log` or `console.dir`. @@ -1340,7 +1431,10 @@ export interface Page { * ``` * */ - addListener(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + addListener( + event: "console", + listener: (consoleMessage: ConsoleMessage) => any + ): this; /** * Emitted when the page crashes. Browser pages might crash if they try to allocate too much memory. When the page @@ -1360,7 +1454,7 @@ export interface Page { * ``` * */ - addListener(event: 'crash', listener: (page: Page) => any): this; + addListener(event: "crash", listener: (page: Page) => any): this; /** * Emitted when a JavaScript dialog appears, such as `alert`, `prompt`, `confirm` or `beforeunload`. Listener **must** @@ -1380,19 +1474,19 @@ export interface Page { * listeners are present, all dialogs are automatically dismissed. * */ - addListener(event: 'dialog', listener: (dialog: Dialog) => any): this; + addListener(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Emitted when the JavaScript * [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded) event is dispatched. */ - addListener(event: 'domcontentloaded', listener: (page: Page) => any): this; + addListener(event: "domcontentloaded", listener: (page: Page) => any): this; /** * Emitted when attachment download started. User can access basic file operations on downloaded content via the * passed [Download](https://playwright.dev/docs/api/class-download) instance. */ - addListener(event: 'download', listener: (download: Download) => any): this; + addListener(event: "download", listener: (download: Download) => any): this; /** * Emitted when a file chooser is supposed to appear, such as after clicking the ``. Playwright can @@ -1407,27 +1501,30 @@ export interface Page { * ``` * */ - addListener(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + addListener( + event: "filechooser", + listener: (fileChooser: FileChooser) => any + ): this; /** * Emitted when a frame is attached. */ - addListener(event: 'frameattached', listener: (frame: Frame) => any): this; + addListener(event: "frameattached", listener: (frame: Frame) => any): this; /** * Emitted when a frame is detached. */ - addListener(event: 'framedetached', listener: (frame: Frame) => any): this; + addListener(event: "framedetached", listener: (frame: Frame) => any): this; /** * Emitted when a frame is navigated to a new url. */ - addListener(event: 'framenavigated', listener: (frame: Frame) => any): this; + addListener(event: "framenavigated", listener: (frame: Frame) => any): this; /** * Emitted when the JavaScript [`load`](https://developer.mozilla.org/en-US/docs/Web/Events/load) event is dispatched. */ - addListener(event: 'load', listener: (page: Page) => any): this; + addListener(event: "load", listener: (page: Page) => any): this; /** * Emitted when an uncaught exception happens within the page. @@ -1443,7 +1540,7 @@ export interface Page { * ``` * */ - addListener(event: 'pageerror', listener: (error: Error) => any): this; + addListener(event: "pageerror", listener: (error: Error) => any): this; /** * Emitted when the page opens a new tab or window. This event is emitted in addition to the @@ -1472,14 +1569,14 @@ export interface Page { * wait until the page gets to a particular state (you should not need it in most cases). * */ - addListener(event: 'popup', listener: (page: Page) => any): this; + addListener(event: "popup", listener: (page: Page) => any): this; /** * Emitted when a page issues a request. The [request] object is read-only. In order to intercept and mutate requests, * see [page.route(url, handler[, options])](https://playwright.dev/docs/api/class-page#page-route) or * [browserContext.route(url, handler[, options])](https://playwright.dev/docs/api/class-browsercontext#browser-context-route). */ - addListener(event: 'request', listener: (request: Request) => any): this; + addListener(event: "request", listener: (request: Request) => any): this; /** * Emitted when a request fails, for example by timing out. @@ -1498,225 +1595,264 @@ export interface Page { * error net::ERR_FAILED. * */ - addListener(event: 'requestfailed', listener: (request: Request) => any): this; + addListener( + event: "requestfailed", + listener: (request: Request) => any + ): this; /** * Emitted when a request finishes successfully after downloading the response body. For a successful response, the * sequence of events is `request`, `response` and `requestfinished`. */ - addListener(event: 'requestfinished', listener: (request: Request) => any): this; + addListener( + event: "requestfinished", + listener: (request: Request) => any + ): this; /** * Emitted when [response] status and headers are received for a request. For a successful response, the sequence of * events is `request`, `response` and `requestfinished`. */ - addListener(event: 'response', listener: (response: Response) => any): this; + addListener(event: "response", listener: (response: Response) => any): this; /** * Emitted when [WebSocket](https://playwright.dev/docs/api/class-websocket) request is sent. */ - addListener(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + addListener( + event: "websocket", + listener: (webSocket: WebSocket) => any + ): this; /** * Emitted when a dedicated [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is spawned * by the page. */ - addListener(event: 'worker', listener: (worker: Worker) => any): this; + addListener(event: "worker", listener: (worker: Worker) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'close', listener: (page: Page) => any): this; + removeListener(event: "close", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + removeListener( + event: "console", + listener: (consoleMessage: ConsoleMessage) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'crash', listener: (page: Page) => any): this; + removeListener(event: "crash", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'dialog', listener: (dialog: Dialog) => any): this; + removeListener(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'domcontentloaded', listener: (page: Page) => any): this; + removeListener( + event: "domcontentloaded", + listener: (page: Page) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'download', listener: (download: Download) => any): this; + removeListener( + event: "download", + listener: (download: Download) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + removeListener( + event: "filechooser", + listener: (fileChooser: FileChooser) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'frameattached', listener: (frame: Frame) => any): this; + removeListener(event: "frameattached", listener: (frame: Frame) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'framedetached', listener: (frame: Frame) => any): this; + removeListener(event: "framedetached", listener: (frame: Frame) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'framenavigated', listener: (frame: Frame) => any): this; + removeListener( + event: "framenavigated", + listener: (frame: Frame) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'load', listener: (page: Page) => any): this; + removeListener(event: "load", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'pageerror', listener: (error: Error) => any): this; + removeListener(event: "pageerror", listener: (error: Error) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'popup', listener: (page: Page) => any): this; + removeListener(event: "popup", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'request', listener: (request: Request) => any): this; + removeListener(event: "request", listener: (request: Request) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'requestfailed', listener: (request: Request) => any): this; + removeListener( + event: "requestfailed", + listener: (request: Request) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'requestfinished', listener: (request: Request) => any): this; + removeListener( + event: "requestfinished", + listener: (request: Request) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'response', listener: (response: Response) => any): this; + removeListener( + event: "response", + listener: (response: Response) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + removeListener( + event: "websocket", + listener: (webSocket: WebSocket) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - removeListener(event: 'worker', listener: (worker: Worker) => any): this; + removeListener(event: "worker", listener: (worker: Worker) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'close', listener: (page: Page) => any): this; + off(event: "close", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + off( + event: "console", + listener: (consoleMessage: ConsoleMessage) => any + ): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'crash', listener: (page: Page) => any): this; + off(event: "crash", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'dialog', listener: (dialog: Dialog) => any): this; + off(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'domcontentloaded', listener: (page: Page) => any): this; + off(event: "domcontentloaded", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'download', listener: (download: Download) => any): this; + off(event: "download", listener: (download: Download) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + off(event: "filechooser", listener: (fileChooser: FileChooser) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'frameattached', listener: (frame: Frame) => any): this; + off(event: "frameattached", listener: (frame: Frame) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'framedetached', listener: (frame: Frame) => any): this; + off(event: "framedetached", listener: (frame: Frame) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'framenavigated', listener: (frame: Frame) => any): this; + off(event: "framenavigated", listener: (frame: Frame) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'load', listener: (page: Page) => any): this; + off(event: "load", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'pageerror', listener: (error: Error) => any): this; + off(event: "pageerror", listener: (error: Error) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'popup', listener: (page: Page) => any): this; + off(event: "popup", listener: (page: Page) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'request', listener: (request: Request) => any): this; + off(event: "request", listener: (request: Request) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'requestfailed', listener: (request: Request) => any): this; + off(event: "requestfailed", listener: (request: Request) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'requestfinished', listener: (request: Request) => any): this; + off(event: "requestfinished", listener: (request: Request) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'response', listener: (response: Response) => any): this; + off(event: "response", listener: (response: Response) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + off(event: "websocket", listener: (webSocket: WebSocket) => any): this; /** * Removes an event listener added by `on` or `addListener`. */ - off(event: 'worker', listener: (worker: Worker) => any): this; + off(event: "worker", listener: (worker: Worker) => any): this; /** * Emitted when the page closes. */ - prependListener(event: 'close', listener: (page: Page) => any): this; + prependListener(event: "close", listener: (page: Page) => any): this; /** * Emitted when JavaScript within the page calls one of console API methods, e.g. `console.log` or `console.dir`. @@ -1737,7 +1873,10 @@ export interface Page { * ``` * */ - prependListener(event: 'console', listener: (consoleMessage: ConsoleMessage) => any): this; + prependListener( + event: "console", + listener: (consoleMessage: ConsoleMessage) => any + ): this; /** * Emitted when the page crashes. Browser pages might crash if they try to allocate too much memory. When the page @@ -1757,7 +1896,7 @@ export interface Page { * ``` * */ - prependListener(event: 'crash', listener: (page: Page) => any): this; + prependListener(event: "crash", listener: (page: Page) => any): this; /** * Emitted when a JavaScript dialog appears, such as `alert`, `prompt`, `confirm` or `beforeunload`. Listener **must** @@ -1777,19 +1916,25 @@ export interface Page { * listeners are present, all dialogs are automatically dismissed. * */ - prependListener(event: 'dialog', listener: (dialog: Dialog) => any): this; + prependListener(event: "dialog", listener: (dialog: Dialog) => any): this; /** * Emitted when the JavaScript * [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded) event is dispatched. */ - prependListener(event: 'domcontentloaded', listener: (page: Page) => any): this; + prependListener( + event: "domcontentloaded", + listener: (page: Page) => any + ): this; /** * Emitted when attachment download started. User can access basic file operations on downloaded content via the * passed [Download](https://playwright.dev/docs/api/class-download) instance. */ - prependListener(event: 'download', listener: (download: Download) => any): this; + prependListener( + event: "download", + listener: (download: Download) => any + ): this; /** * Emitted when a file chooser is supposed to appear, such as after clicking the ``. Playwright can @@ -1804,27 +1949,39 @@ export interface Page { * ``` * */ - prependListener(event: 'filechooser', listener: (fileChooser: FileChooser) => any): this; + prependListener( + event: "filechooser", + listener: (fileChooser: FileChooser) => any + ): this; /** * Emitted when a frame is attached. */ - prependListener(event: 'frameattached', listener: (frame: Frame) => any): this; + prependListener( + event: "frameattached", + listener: (frame: Frame) => any + ): this; /** * Emitted when a frame is detached. */ - prependListener(event: 'framedetached', listener: (frame: Frame) => any): this; + prependListener( + event: "framedetached", + listener: (frame: Frame) => any + ): this; /** * Emitted when a frame is navigated to a new url. */ - prependListener(event: 'framenavigated', listener: (frame: Frame) => any): this; + prependListener( + event: "framenavigated", + listener: (frame: Frame) => any + ): this; /** * Emitted when the JavaScript [`load`](https://developer.mozilla.org/en-US/docs/Web/Events/load) event is dispatched. */ - prependListener(event: 'load', listener: (page: Page) => any): this; + prependListener(event: "load", listener: (page: Page) => any): this; /** * Emitted when an uncaught exception happens within the page. @@ -1840,7 +1997,7 @@ export interface Page { * ``` * */ - prependListener(event: 'pageerror', listener: (error: Error) => any): this; + prependListener(event: "pageerror", listener: (error: Error) => any): this; /** * Emitted when the page opens a new tab or window. This event is emitted in addition to the @@ -1869,14 +2026,14 @@ export interface Page { * wait until the page gets to a particular state (you should not need it in most cases). * */ - prependListener(event: 'popup', listener: (page: Page) => any): this; + prependListener(event: "popup", listener: (page: Page) => any): this; /** * Emitted when a page issues a request. The [request] object is read-only. In order to intercept and mutate requests, * see [page.route(url, handler[, options])](https://playwright.dev/docs/api/class-page#page-route) or * [browserContext.route(url, handler[, options])](https://playwright.dev/docs/api/class-browsercontext#browser-context-route). */ - prependListener(event: 'request', listener: (request: Request) => any): this; + prependListener(event: "request", listener: (request: Request) => any): this; /** * Emitted when a request fails, for example by timing out. @@ -1895,30 +2052,42 @@ export interface Page { * error net::ERR_FAILED. * */ - prependListener(event: 'requestfailed', listener: (request: Request) => any): this; + prependListener( + event: "requestfailed", + listener: (request: Request) => any + ): this; /** * Emitted when a request finishes successfully after downloading the response body. For a successful response, the * sequence of events is `request`, `response` and `requestfinished`. */ - prependListener(event: 'requestfinished', listener: (request: Request) => any): this; + prependListener( + event: "requestfinished", + listener: (request: Request) => any + ): this; /** * Emitted when [response] status and headers are received for a request. For a successful response, the sequence of * events is `request`, `response` and `requestfinished`. */ - prependListener(event: 'response', listener: (response: Response) => any): this; + prependListener( + event: "response", + listener: (response: Response) => any + ): this; /** * Emitted when [WebSocket](https://playwright.dev/docs/api/class-websocket) request is sent. */ - prependListener(event: 'websocket', listener: (webSocket: WebSocket) => any): this; + prependListener( + event: "websocket", + listener: (webSocket: WebSocket) => any + ): this; /** * Emitted when a dedicated [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is spawned * by the page. */ - prependListener(event: 'worker', listener: (worker: Worker) => any): this; + prependListener(event: "worker", listener: (worker: Worker) => any): this; /** * When testing a web page, sometimes unexpected overlays like a "Sign up" dialog appear and block actions you want to @@ -2023,19 +2192,23 @@ export interface Page { * function should get rid of the element that blocks actions like click. * @param options */ - addLocatorHandler(locator: Locator, handler: ((locator: Locator) => Promise), options?: { - /** - * By default, after calling the handler Playwright will wait until the overlay becomes hidden, and only then - * Playwright will continue with the action/assertion that triggered the handler. This option allows to opt-out of - * this behavior, so that overlay can stay visible after the handler has run. - */ - noWaitAfter?: boolean; + addLocatorHandler( + locator: Locator, + handler: (locator: Locator) => Promise, + options?: { + /** + * By default, after calling the handler Playwright will wait until the overlay becomes hidden, and only then + * Playwright will continue with the action/assertion that triggered the handler. This option allows to opt-out of + * this behavior, so that overlay can stay visible after the handler has run. + */ + noWaitAfter?: boolean; - /** - * Specifies the maximum number of times this handler should be called. Unlimited by default. - */ - times?: number; - }): Promise; + /** + * Specifies the maximum number of times this handler should be called. Unlimited by default. + */ + times?: number; + } + ): Promise; /** * Adds a `