diff --git a/.playwright/cli.config.json b/.playwright/cli.config.json new file mode 100644 index 0000000000000..587f73e4f8c75 --- /dev/null +++ b/.playwright/cli.config.json @@ -0,0 +1,8 @@ +{ + "browser": { + "browserName": "chromium", + "launchOptions": { + "channel": "chromium" + } + } +} \ No newline at end of file diff --git a/docs/src/api/class-inspector.md b/docs/src/api/class-inspector.md index a642cc9752e52..67789d029bd33 100644 --- a/docs/src/api/class-inspector.md +++ b/docs/src/api/class-inspector.md @@ -28,8 +28,6 @@ console.log(locator); * since: v1.59 - argument: <[Object]> - `data` <[Buffer]> JPEG-encoded frame data. - - `width` <[int]> Frame width in pixels. - - `height` <[int]> Frame height in pixels. Emitted for each captured JPEG screencast frame while the screencast is running. @@ -41,7 +39,7 @@ inspector.on('screencastframe', ({ data, width, height }) => { console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); require('fs').writeFileSync('frame.jpg', data); }); -await inspector.startScreencast({ size: { width: 1280, height: 720 } }); +await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); // ... perform actions ... await inspector.stopScreencast(); ``` @@ -58,18 +56,18 @@ const inspector = page.inspector(); inspector.on('screencastframe', ({ data, width, height }) => { console.log(`frame ${width}x${height}, size: ${data.length}`); }); -await inspector.startScreencast({ size: { width: 800, height: 600 } }); +await inspector.startScreencast({ maxSize: { width: 800, height: 600 } }); // ... perform actions ... await inspector.stopScreencast(); ``` -### option: Inspector.startScreencast.size +### option: Inspector.startScreencast.maxSize * since: v1.59 -- `size` ?<[Object]> - - `width` <[int]> Frame width in pixels. - - `height` <[int]> Frame height in pixels. +- `maxSize` ?<[Object]> + - `width` <[int]> Max frame width in pixels. + - `height` <[int]> Max frame height in pixels. -Optional dimensions for the screencast frames. If not specified, the current page viewport size is used. +Maximum screencast frame dimensions. The output frame may be smaller to preserve the page aspect ratio. Defaults to 800×800. ## async method: Inspector.stopScreencast * since: v1.59 diff --git a/intro-0.png b/intro-0.png new file mode 100644 index 0000000000000..cd0da8c991543 Binary files /dev/null and b/intro-0.png differ diff --git a/intro-1.png b/intro-1.png new file mode 100644 index 0000000000000..13aa01ec55d95 Binary files /dev/null and b/intro-1.png differ diff --git a/intro.png b/intro.png new file mode 100644 index 0000000000000..5997d7722b06b Binary files /dev/null and b/intro.png differ diff --git a/log.txt b/log.txt new file mode 100644 index 0000000000000..930d5e33eddd1 --- /dev/null +++ b/log.txt @@ -0,0 +1,27 @@ +git bisect start +# status: waiting for both good and bad commits +# bad: [e4498b29eababe5ab0345f7dd8ea0bf62932841e] chore: freeze webkit version on macos 14 (#38996) +git bisect bad e4498b29eababe5ab0345f7dd8ea0bf62932841e +# status: waiting for good commit(s), bad commit known +# bad: [e4498b29eababe5ab0345f7dd8ea0bf62932841e] chore: freeze webkit version on macos 14 (#38996) +git bisect bad e4498b29eababe5ab0345f7dd8ea0bf62932841e +# status: waiting for good commit(s), bad commit known +# good: [e4498b29eababe5ab0345f7dd8ea0bf62932841e] chore: freeze webkit version on macos 14 (#38996) +git bisect good e4498b29eababe5ab0345f7dd8ea0bf62932841e +# bad: [0c45dfc773fef0aa9e13016052bc4f3cd86ba288] fix(windows): hide console window when spawning browser processes (#38776) +git bisect bad 0c45dfc773fef0aa9e13016052bc4f3cd86ba288 +# good: [7b3b57ab4cf11065477fabb169f8f5d403ef2729] chore: follow up to args parsing (#39178) +git bisect good 7b3b57ab4cf11065477fabb169f8f5d403ef2729 +# bad: [65576628e6440c4fe05c88dda4a396ce4576baaa] feat(chromium): roll to r1212 (#39240) +git bisect bad 65576628e6440c4fe05c88dda4a396ce4576baaa +# bad: [19b4dcd33d4a5b64c942c535d840ac491a88f63a] chore(cli): tray icon (#39218) +git bisect bad 19b4dcd33d4a5b64c942c535d840ac491a88f63a +# bad: [0be34e5b32e4da50427f26262e8caa22de0bb2d6] test: make trace-viewer tests e2e (#39174) +git bisect bad 0be34e5b32e4da50427f26262e8caa22de0bb2d6 +# good: [bfd1ec67a923589fd3b6ff30a6bcceba87ceaf96] Update params.md: fix "it's" typos (#39180) +git bisect good bfd1ec67a923589fd3b6ff30a6bcceba87ceaf96 +# good: [8f729bab319adb56d23c224f9aa52b8bbb815734] chore(deps): bump jsonwebtoken from 9.0.2 to 9.0.3 (#39149) +git bisect good 8f729bab319adb56d23c224f9aa52b8bbb815734 +# good: [3d806ab4f1f71249217dfe804c96a9543173481a] chore(aria): replace UUID with regex (#39191) +git bisect good 3d806ab4f1f71249217dfe804c96a9543173481a +# first bad commit: [0be34e5b32e4da50427f26262e8caa22de0bb2d6] test: make trace-viewer tests e2e (#39174) diff --git a/loggg.txt b/loggg.txt new file mode 100644 index 0000000000000..a903bfdfb3929 --- /dev/null +++ b/loggg.txt @@ -0,0 +1,24 @@ +git bisect start +# status: waiting for both good and bad commits +# bad: [0c45dfc773fef0aa9e13016052bc4f3cd86ba288] fix(windows): hide console window when spawning browser processes (#38776) +git bisect bad 0c45dfc773fef0aa9e13016052bc4f3cd86ba288 +# status: waiting for good commit(s), bad commit known +# good: [e4498b29eababe5ab0345f7dd8ea0bf62932841e] chore: freeze webkit version on macos 14 (#38996) +git bisect good e4498b29eababe5ab0345f7dd8ea0bf62932841e +# good: [7b3b57ab4cf11065477fabb169f8f5d403ef2729] chore: follow up to args parsing (#39178) +git bisect good 7b3b57ab4cf11065477fabb169f8f5d403ef2729 +# bad: [65576628e6440c4fe05c88dda4a396ce4576baaa] feat(chromium): roll to r1212 (#39240) +git bisect bad 65576628e6440c4fe05c88dda4a396ce4576baaa +# good: [19b4dcd33d4a5b64c942c535d840ac491a88f63a] chore(cli): tray icon (#39218) +git bisect good 19b4dcd33d4a5b64c942c535d840ac491a88f63a +# good: [529f767c666b092e70525b9bcdc30c0e8335457b] fix(chromium): use actual device scale factor for css-scale screenshots (#39233) +git bisect good 529f767c666b092e70525b9bcdc30c0e8335457b +# bad: [951911cefedb1dd5a2a15f854a51bd7c34504a5f] chore: split daemon and client folders (#39245) +git bisect bad 951911cefedb1dd5a2a15f854a51bd7c34504a5f +# bad: [63f13454dedaa8f12a487df62cf42d9d89192b5b] chore: roll driver/Dockerfile to recent Node.js LTS version (#39238) +git bisect bad 63f13454dedaa8f12a487df62cf42d9d89192b5b +# bad: [8946b03f6f7c53e4bca0e9a2f1ab346133bdd25d] test(bidi): set channel option in showTraceViewer() fixture (#39222) +git bisect bad 8946b03f6f7c53e4bca0e9a2f1ab346133bdd25d +# bad: [6d35c8b168768a1f6dbc19eb414b2373bd6de8a9] chore: prep devtools app (#39231) +git bisect bad 6d35c8b168768a1f6dbc19eb414b2373bd6de8a9 +# first bad commit: [6d35c8b168768a1f6dbc19eb414b2373bd6de8a9] chore: prep devtools app (#39231) diff --git a/packages/playwright-client/types/types.d.ts b/packages/playwright-client/types/types.d.ts index 9227156952db2..3089d164b44a1 100644 --- a/packages/playwright-client/types/types.d.ts +++ b/packages/playwright-client/types/types.d.ts @@ -20445,7 +20445,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20456,16 +20456,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20476,16 +20466,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20499,7 +20479,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20510,16 +20490,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20530,16 +20500,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20550,16 +20510,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20573,7 +20523,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20584,16 +20534,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20630,7 +20570,7 @@ export interface Inspector { * inspector.on('screencastframe', ({ data, width, height }) => { * console.log(`frame ${width}x${height}, size: ${data.length}`); * }); - * await inspector.startScreencast({ size: { width: 800, height: 600 } }); + * await inspector.startScreencast({ maxSize: { width: 800, height: 600 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20639,16 +20579,17 @@ export interface Inspector { */ startScreencast(options?: { /** - * Optional dimensions for the screencast frames. If not specified, the current page viewport size is used. + * Maximum screencast frame dimensions. The output frame may be smaller to preserve the page aspect ratio. Defaults to + * 800×800. */ - size?: { + maxSize?: { /** - * Frame width in pixels. + * Max frame width in pixels. */ width: number; /** - * Frame height in pixels. + * Max frame height in pixels. */ height: number; }; diff --git a/packages/playwright-core/src/client/inspector.ts b/packages/playwright-core/src/client/inspector.ts index c59816888fef6..6c42f1e3363c3 100644 --- a/packages/playwright-core/src/client/inspector.ts +++ b/packages/playwright-core/src/client/inspector.ts @@ -26,7 +26,7 @@ export class Inspector extends EventEmitter implements api.Inspector { constructor(page: Page) { super(page._platform); this._page = page; - this._page._channel.on('screencastFrame', ({ data, width, height }) => this.emit('screencastframe', { data, width, height })); + this._page._channel.on('screencastFrame', ({ data }) => this.emit('screencastframe', { data })); } async pickLocator(): Promise { @@ -38,7 +38,7 @@ export class Inspector extends EventEmitter implements api.Inspector { await this._page._channel.cancelPickLocator({}); } - async startScreencast(options: { size?: { width: number, height: number } } = {}): Promise { + async startScreencast(options: { maxSize?: { width: number, height: number } } = {}): Promise { await this._page._channel.startScreencast(options); } diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index a7b44c1542a19..5a0f5b36bed94 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -1231,8 +1231,6 @@ scheme.PageRouteEvent = tObject({ }); scheme.PageScreencastFrameEvent = tObject({ data: tBinary, - width: tInt, - height: tInt, }); scheme.PageWebSocketRouteEvent = tObject({ webSocketRoute: tChannel(['WebSocketRoute']), @@ -1550,7 +1548,7 @@ scheme.PagePickLocatorResult = tObject({ scheme.PageCancelPickLocatorParams = tOptional(tObject({})); scheme.PageCancelPickLocatorResult = tOptional(tObject({})); scheme.PageStartScreencastParams = tObject({ - size: tOptional(tObject({ + maxSize: tOptional(tObject({ width: tInt, height: tInt, })), diff --git a/packages/playwright-core/src/server/chromium/crPage.ts b/packages/playwright-core/src/server/chromium/crPage.ts index 2f610da3f319c..c6d80f63d5e06 100644 --- a/packages/playwright-core/src/server/chromium/crPage.ts +++ b/packages/playwright-core/src/server/chromium/crPage.ts @@ -889,8 +889,8 @@ class FrameSession { this._page.emit(Page.Events.ScreencastFrame, { buffer, frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1000 : Date.now(), - width: payload.metadata.deviceWidth, - height: payload.metadata.deviceHeight, + viewportWidth: payload.metadata.deviceWidth, + viewportHeight: payload.metadata.deviceHeight, }); } diff --git a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts index 1db5d3b64530f..5cdd38b83eac1 100644 --- a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts @@ -17,7 +17,6 @@ import { Page, Worker } from '../page'; import { Dispatcher } from './dispatcher'; import { parseError, serializeError } from '../errors'; -import { validateVideoSize } from '../browserContext'; import { ArtifactDispatcher } from './artifactDispatcher'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; import { FrameDispatcher } from './frameDispatcher'; @@ -31,6 +30,7 @@ import { SdkObject } from '../instrumentation'; import { deserializeURLMatch, urlMatches } from '../../utils/isomorphic/urlMatch'; import { PageAgentDispatcher } from './pageAgentDispatcher'; import { Recorder } from '../recorder'; +import { eventsHelper } from '../utils/eventsHelper'; import { disposeAll } from '../disposable'; import type { Artifact } from '../artifact'; @@ -48,6 +48,7 @@ import type * as channels from '@protocol/channels'; import type { Progress } from '@protocol/progress'; import type { URLMatch } from '../../utils/isomorphic/urlMatch'; import type { ScreencastFrame } from '../types'; +import type { RegisteredListener } from '../utils/eventsHelper'; export class PageDispatcher extends Dispatcher implements channels.PageChannel { _type_EventTarget = true; @@ -62,6 +63,7 @@ export class PageDispatcher extends Dispatcher(); private _jsCoverageActive = false; private _cssCoverageActive = false; + private _screencastFrameListener: RegisteredListener | null = null; static from(parentScope: BrowserContextDispatcher, page: Page): PageDispatcher { return PageDispatcher.fromNullable(parentScope, page)!; @@ -110,7 +112,6 @@ export class PageDispatcher extends Dispatcher this._dispatchEvent('screencastFrame', { data: frame.buffer, width: frame.width, height: frame.height })); this.addObjectListener(Page.Events.EmulatedSizeChanged, () => this._dispatchEvent('viewportSizeChanged', { viewportSize: page.emulatedSize()?.viewport })); this.addObjectListener(Page.Events.FileChooser, (fileChooser: FileChooser) => this._dispatchEvent('fileChooser', { element: ElementHandleDispatcher.from(mainFrame, fileChooser.element()), @@ -365,11 +366,20 @@ export class PageDispatcher extends Dispatcher { - const size = validateVideoSize(params.size, this._page.emulatedSize()?.viewport); + if (this._screencastFrameListener) + throw new Error('Screencast is already running'); + const size = params.maxSize || { width: 800, height: 800 }; + // TODO: move to screencast and make startScrencast accept a listener. + this._screencastFrameListener = eventsHelper.addEventListener(this._page, Page.Events.ScreencastFrame, (frame: ScreencastFrame) => { + this._dispatchEvent('screencastFrame', { data: frame.buffer }); + }); await this._page.screencast.startScreencast(this, { quality: 90, width: size.width, height: size.height }); } async stopScreencast(params: channels.PageStopScreencastParams, progress?: Progress): Promise { + if (this._screencastFrameListener) + eventsHelper.removeEventListeners([this._screencastFrameListener]); + this._screencastFrameListener = null; return this._page.screencast.stopScreencast(this); } @@ -440,6 +450,9 @@ export class PageDispatcher extends Dispatcher {}); this._cssCoverageActive = false; + if (this._screencastFrameListener) + eventsHelper.removeEventListeners([this._screencastFrameListener]); + this._screencastFrameListener = null; } async setDockTile(params: channels.PageSetDockTileParams): Promise { diff --git a/packages/playwright-core/src/server/firefox/ffPage.ts b/packages/playwright-core/src/server/firefox/ffPage.ts index f896a6196d7b9..ac82272e8de18 100644 --- a/packages/playwright-core/src/server/firefox/ffPage.ts +++ b/packages/playwright-core/src/server/firefox/ffPage.ts @@ -493,8 +493,8 @@ export class FFPage implements PageDelegate { this._page.emit(Page.Events.ScreencastFrame, { buffer, frameSwapWallTime: event.timestamp * 1000, // timestamp is in seconds, we need to convert to milliseconds. - width: event.deviceWidth, - height: event.deviceHeight, + viewportWidth: event.deviceWidth, + viewportHeight: event.deviceHeight, }); } diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index 6888b688665cd..a79a85efb1560 100644 --- a/packages/playwright-core/src/server/trace/recorder/tracing.ts +++ b/packages/playwright-core/src/server/trace/recorder/tracing.ts @@ -49,6 +49,7 @@ import type * as har from '@trace/har'; import type { FrameSnapshot } from '@trace/snapshot'; import type * as trace from '@trace/trace'; import type { Progress } from '@protocol/progress'; +import type * as types from '../../types'; const version: trace.VERSION = 8; @@ -595,15 +596,15 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps page.screencast.setOptions(kScreencastOptions); const prefix = page.guid; this._screencastListeners.push( - eventsHelper.addEventListener(page, Page.Events.ScreencastFrame, params => { - const suffix = params.timestamp || Date.now(); + eventsHelper.addEventListener(page, Page.Events.ScreencastFrame, (params: types.ScreencastFrame) => { + const suffix = Date.now(); const sha1 = `${prefix}-${suffix}.jpeg`; const event: trace.ScreencastFrameTraceEvent = { type: 'screencast-frame', pageId: page.guid, sha1, - width: params.width, - height: params.height, + width: params.viewportWidth, + height: params.viewportHeight, timestamp: monotonicTime(), frameSwapWallTime: params.frameSwapWallTime, }; diff --git a/packages/playwright-core/src/server/types.ts b/packages/playwright-core/src/server/types.ts index a400152d7f8fb..1b28efb468602 100644 --- a/packages/playwright-core/src/server/types.ts +++ b/packages/playwright-core/src/server/types.ts @@ -52,8 +52,8 @@ export type VideoOptions = { export type ScreencastFrame = { buffer: Buffer, frameSwapWallTime: number, - width: number, - height: number, + viewportWidth: number, + viewportHeight: number, }; export type Credentials = { diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 9eb7695498180..1dc976039a329 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -956,8 +956,8 @@ export class WKPage implements PageDelegate { // version that did not send timestamp. // TODO: remove this fallback when Debian 11 and Ubuntu 20.04 are EOL. : Date.now(), - width: event.deviceWidth, - height: event.deviceHeight, + viewportWidth: event.deviceWidth, + viewportHeight: event.deviceHeight, }); } diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index 9227156952db2..3089d164b44a1 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -20445,7 +20445,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20456,16 +20456,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20476,16 +20466,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20499,7 +20479,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20510,16 +20490,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20530,16 +20500,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20550,16 +20510,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20573,7 +20523,7 @@ export interface Inspector { * console.log(`frame ${width}x${height}, jpeg size: ${data.length}`); * require('fs').writeFileSync('frame.jpg', data); * }); - * await inspector.startScreencast({ size: { width: 1280, height: 720 } }); + * await inspector.startScreencast({ maxSize: { width: 1200, height: 800 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20584,16 +20534,6 @@ export interface Inspector { * JPEG-encoded frame data. */ data: Buffer; - - /** - * Frame width in pixels. - */ - width: number; - - /** - * Frame height in pixels. - */ - height: number; }) => any): this; /** @@ -20630,7 +20570,7 @@ export interface Inspector { * inspector.on('screencastframe', ({ data, width, height }) => { * console.log(`frame ${width}x${height}, size: ${data.length}`); * }); - * await inspector.startScreencast({ size: { width: 800, height: 600 } }); + * await inspector.startScreencast({ maxSize: { width: 800, height: 600 } }); * // ... perform actions ... * await inspector.stopScreencast(); * ``` @@ -20639,16 +20579,17 @@ export interface Inspector { */ startScreencast(options?: { /** - * Optional dimensions for the screencast frames. If not specified, the current page viewport size is used. + * Maximum screencast frame dimensions. The output frame may be smaller to preserve the page aspect ratio. Defaults to + * 800×800. */ - size?: { + maxSize?: { /** - * Frame width in pixels. + * Max frame width in pixels. */ width: number; /** - * Frame height in pixels. + * Max frame height in pixels. */ height: number; }; diff --git a/packages/protocol/src/channels.d.ts b/packages/protocol/src/channels.d.ts index b941c06c8705d..5e8c20cf200d8 100644 --- a/packages/protocol/src/channels.d.ts +++ b/packages/protocol/src/channels.d.ts @@ -2198,8 +2198,6 @@ export type PageRouteEvent = { }; export type PageScreencastFrameEvent = { data: Binary, - width: number, - height: number, }; export type PageWebSocketRouteEvent = { webSocketRoute: WebSocketRouteChannel, @@ -2682,13 +2680,13 @@ export type PageCancelPickLocatorParams = {}; export type PageCancelPickLocatorOptions = {}; export type PageCancelPickLocatorResult = void; export type PageStartScreencastParams = { - size?: { + maxSize?: { width: number, height: number, }, }; export type PageStartScreencastOptions = { - size?: { + maxSize?: { width: number, height: number, }, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 0f6c9a4d3244e..344101d69e5e6 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -2086,7 +2086,7 @@ Page: title: Start screencast group: configuration parameters: - size: + maxSize: type: object? properties: width: int @@ -2202,8 +2202,6 @@ Page: screencastFrame: parameters: data: binary - width: int - height: int webSocketRoute: parameters: diff --git a/playwright-cli.json.bcp b/playwright-cli.json.bcp new file mode 100644 index 0000000000000..b5531d48b622e --- /dev/null +++ b/playwright-cli.json.bcp @@ -0,0 +1,10 @@ +{ + "browser": { + "userDataDir": "/tmp/extension-user-data-dir", + "browserName": "chromium", + "launchOptions": { + "channel": "chrome-beta", + "headless": false + } + } +} diff --git a/pw.js b/pw.js new file mode 100644 index 0000000000000..8767e30e7ef96 --- /dev/null +++ b/pw.js @@ -0,0 +1,37 @@ +const { _electron: electron } = require('playwright'); + +(async () => { + // Launch Electron app. + const electronApp = await electron.launch({ args: ['/home/yurys/electron-multi-webcontents/dist/main.js'] }); + + console.log('electronApp launched\n\n\n'); + + electronApp.on('window', (window) => { + console.log('window opened:', window.url()); + }); + + const pages = electronApp.windows(); + for (const page of pages) + console.log('page:', page.url()); + + // Evaluation expression in the Electron context. + const appPath = await electronApp.evaluate(async ({ app }) => { + // This runs in the main Electron process, parameter here is always + // the result of the require('electron') in the main app script. + return app.getAppPath(); + }); + console.log(appPath); + + // Get the first window that the app opens, wait if necessary. + const window = await electronApp.firstWindow(); + // Print the title. + console.log(await window.title()); + + let i = 0; + for (const page of electronApp.windows()) { + console.log('page:', page.url()); + await page.screenshot({ path: `intro-${i}.png` }); + console.log(`screenshot saved to intro-${i}.png`); + i++; + } +})(); diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000..c26cac27e5787 Binary files /dev/null and b/screenshot.png differ diff --git a/test.js b/test.js new file mode 100644 index 0000000000000..c99fec3f3bc21 --- /dev/null +++ b/test.js @@ -0,0 +1,62 @@ +const { chromium } = require('playwright'); + +(async () => { + const wsEndpoint = process.argv[2]; + if (!wsEndpoint) { + console.error('Usage: node test.js '); + process.exit(1); + } + + console.log(`Connecting to ${wsEndpoint}...`); + const browser = await chromium.connectOverCDP(wsEndpoint); + + const contexts = browser.contexts(); + console.log(`Browser contexts: ${contexts.length}`); + + for (const context of contexts) { + const pages = context.pages(); + console.log(` Context has ${pages.length} page(s)`); + for (const page of pages) { + console.log(` Page: "${page.url()}" — title: "${await page.title()}"`); + } + } + + // Exercise the first page + const page = contexts[0]?.pages()[0]; + console.log('page', !!page); + if (page) { + console.log('\nNavigating first page to example.org...'); + await page.goto('https://example.org'); + console.log(` URL: ${page.url()}`); + console.log(` Title: "${await page.title()}"`); + + const text = await page.evaluate(() => document.body.innerText.substring(0, 100)); + console.log(` Body text (first 100 chars): "${text}"`); + + await page.screenshot({ path: 'screenshot.png' }); + console.log(' Screenshot saved to screenshot.png'); + } + + // Listen for new pages + console.log('\nListening for new pages (open a new tab in Electron to see it)...'); + const newPagePromise = new Promise((resolve) => { + for (const context of browser.contexts()) { + context.on('page', (p) => { + console.log(` New page appeared: "${p.url()}"`); + resolve(p); + }); + } + // Timeout after 5 seconds + setTimeout(() => resolve(null), 5000); + }); + const newPage = await newPagePromise; + if (!newPage) { + console.log(' (no new page within 5s, continuing)'); + } + + console.log('\nDone. Disconnecting...'); + await browser.close(); +})().catch((err) => { + console.error('Error:', err); + process.exit(1); +}); diff --git a/tests/library/video.spec.ts b/tests/library/video.spec.ts index 1a153ab89eda7..59d45bf2e96d5 100644 --- a/tests/library/video.spec.ts +++ b/tests/library/video.spec.ts @@ -811,8 +811,8 @@ it.describe('screencast', () => { expect(isAlmostRed(pixel)).toBe(true); }); - it('video.start/stop twice', async ({ browser, browserName }, testInfo) => { - const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + it('video.start/stop twice', async ({ browser }, testInfo) => { + const size = { width: 800, height: 600 }; const context = await browser.newContext({ viewport: size }); const page = await context.newPage(); @@ -853,13 +853,11 @@ it.describe('screencast', () => { await context.close(); }); - it('video.start should fail when another recording is in progress', async ({ browser }, testInfo) => { - const context = await browser.newContext(); - const page = await context.newPage(); + it('video.start should fail when another recording is in progress', async ({ page, trace }) => { + it.skip(trace === 'on', 'trace=on has different screencast image configuration'); await page.video().start(); const error = await page.video().start().catch(e => e); expect(error.message).toContain('Video is already being recorded'); - await context.close(); }); it('video.stop should fail when no recording is in progress', async ({ browser }, testInfo) => { @@ -873,7 +871,7 @@ it.describe('screencast', () => { it('video.start should finish when page is closed', async ({ browser, browserName }, testInfo) => { const context = await browser.newContext(); const page = await context.newPage(); - await page.video().start(); + await page.video().start({ size: { width: 800, height: 600 } }); await page.evaluate(() => document.body.style.backgroundColor = 'red'); await rafraf(page, 100); const videoPath = await page.video().path(); @@ -887,8 +885,8 @@ it.describe('screencast', () => { await context.close(); }); - it('empty video', async ({ browser, browserName }, testInfo) => { - const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + it('empty video', async ({ browser }, testInfo) => { + const size = { width: 800, height: 600 }; const context = await browser.newContext({ viewport: size }); const page = await context.newPage(); await page.video().start({ size }); @@ -898,15 +896,16 @@ it.describe('screencast', () => { expectFrames(videoPath, size, isAlmostWhite); }); - it('inspector.startScreencast emits screencastframe events', async ({ browser, server }) => { - const size = { width: 500, height: 400 }; - const context = await browser.newContext({ viewport: size }); + it('inspector.startScreencast emits screencastframe events', async ({ browser, server, trace }) => { + it.skip(trace === 'on', 'trace=on has different screencast image configuration'); + const context = await browser.newContext({ viewport: { width: 1000, height: 400 } }); const page = await context.newPage(); - const frames: { data: Buffer, width: number, height: number }[] = []; + const frames: { data: Buffer }[] = []; page.inspector().on('screencastframe', frame => frames.push(frame)); - await page.inspector().startScreencast({ size }); + const maxSize = { width: 500, height: 400 }; + await page.inspector().startScreencast({ maxSize }); await page.goto(server.EMPTY_PAGE); await page.evaluate(() => document.body.style.backgroundColor = 'red'); await rafraf(page, 100); @@ -917,49 +916,71 @@ it.describe('screencast', () => { // Each frame must be a valid JPEG (starts with FF D8) expect(frame.data[0]).toBe(0xff); expect(frame.data[1]).toBe(0xd8); - expect(frame.width).toBe(size.width); - expect(frame.height).toBe(size.height); + const { width, height } = jpegDimensions(frame.data); + // Frame should be scaled down to fit the maximum size. + expect(width).toBe(500); + expect(height).toBe(200); } await context.close(); }); - it('startScreencast throws when called with different options while running', async ({ browser }) => { + it('startScreencast throws if already running', async ({ browser, trace }) => { + it.skip(trace === 'on', 'trace=on enables screencast with different options'); + const size = { width: 500, height: 400 }; const context = await browser.newContext({ viewport: size }); const page = await context.newPage(); - await page.inspector().startScreencast({ size }); - await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running with different options'); + await page.inspector().startScreencast({ maxSize: size }); + await expect(page.inspector().startScreencast({ maxSize: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running'); await page.inspector().stopScreencast(); await context.close(); }); - it('startScreencast allows restart with different options after stop', async ({ browser }) => { + it('startScreencast allows restart with different options after stop', async ({ browser, trace }) => { + it.skip(trace === 'on', 'trace=on enables screencast with different options'); + const context = await browser.newContext({ viewport: { width: 500, height: 400 } }); const page = await context.newPage(); - await page.inspector().startScreencast({ size: { width: 500, height: 400 } }); + await page.inspector().startScreencast({ maxSize: { width: 500, height: 400 } }); await page.inspector().stopScreencast(); // Different options should succeed once the previous screencast is stopped. - await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).resolves.toBeUndefined(); - + await page.inspector().startScreencast({ maxSize: { width: 320, height: 240 } }); await page.inspector().stopScreencast(); await context.close(); }); - it('startScreencast throws when video recording is running with different params', async ({ browser }) => { + it('startScreencast throws when video recording is running with different params', async ({ browser, trace }) => { + it.skip(trace === 'on', 'trace=on enables screencast with different options'); + const videoSize = { width: 500, height: 400 }; const context = await browser.newContext({ viewport: videoSize }); const page = await context.newPage(); await page.video().start({ size: videoSize }); - await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running with different options'); + await expect(page.inspector().startScreencast({ maxSize: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running with different options'); await page.video().stop(); await context.close(); }); + + it('video.start does not emit screencastframe events', async ({ page, server, trace }) => { + it.skip(trace === 'on', 'trace=on enables screencast frame events'); + + const frames = []; + page.inspector().on('screencastframe', frame => frames.push(frame)); + + await page.video().start({ size: { width: 320, height: 240 } }); + await page.goto(server.EMPTY_PAGE); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await page.video().stop(); + + expect(frames).toHaveLength(0); + }); }); it('should saveAs video', async ({ browser }, testInfo) => { @@ -983,3 +1004,22 @@ it('should saveAs video', async ({ browser }, testInfo) => { await page.video().saveAs(saveAsPath); expect(fs.existsSync(saveAsPath)).toBeTruthy(); }); + +function jpegDimensions(buffer: Buffer): { width: number, height: number } { + let i = 2; // skip SOI marker (FF D8) + while (i < buffer.length - 8) { + if (buffer[i] !== 0xFF) + break; + const marker = buffer[i + 1]; + const segmentLength = buffer.readUInt16BE(i + 2); + // SOF markers: C0 (baseline), C2 (progressive), C1, C3, C5-C7, C9-CB, CD-CF + if ((marker >= 0xC0 && marker <= 0xC3) || (marker >= 0xC5 && marker <= 0xC7) || + (marker >= 0xC9 && marker <= 0xCB) || (marker >= 0xCD && marker <= 0xCF)) { + const height = buffer.readUInt16BE(i + 5); + const width = buffer.readUInt16BE(i + 7); + return { width, height }; + } + i += 2 + segmentLength; + } + throw new Error('Could not parse JPEG dimensions'); +} diff --git a/version.js b/version.js new file mode 100644 index 0000000000000..3c631168604d6 --- /dev/null +++ b/version.js @@ -0,0 +1,10 @@ +const { chromium } = require('playwright'); + +(async () => { + const browser = await chromium.launch(); + console.log(chromium.executablePath()); + await browser.close(); +})().catch((err) => { + console.error('Error:', err); + process.exit(1); +}); diff --git a/www/0-trace.network b/www/0-trace.network new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/www/0-trace.stacks b/www/0-trace.stacks new file mode 100644 index 0000000000000..9dc4624aa2a8e --- /dev/null +++ b/www/0-trace.stacks @@ -0,0 +1 @@ +{"files":["/home/yurys/playwright/tests/library/video.spec.ts","/home/yurys/playwright/tests/config/utils.ts"],"stacks":[[6,[[0,858,32,""]]],[8,[[0,859,16,""]]],[10,[[1,198,18,"rafraf"],[0,860,17,""]]],[12,[[1,198,18,"rafraf"],[0,860,5,""]]],[14,[[1,198,18,"rafraf"],[0,860,5,""]]],[16,[[1,198,18,"rafraf"],[0,860,5,""]]],[18,[[1,198,18,"rafraf"],[0,860,5,""]]],[20,[[1,198,18,"rafraf"],[0,860,5,""]]],[22,[[1,198,18,"rafraf"],[0,860,5,""]]],[24,[[1,198,18,"rafraf"],[0,860,5,""]]],[26,[[1,198,18,"rafraf"],[0,860,5,""]]],[28,[[1,198,18,"rafraf"],[0,860,5,""]]],[30,[[1,198,18,"rafraf"],[0,860,5,""]]],[32,[[1,198,18,"rafraf"],[0,860,5,""]]],[34,[[1,198,18,"rafraf"],[0,860,5,""]]],[36,[[1,198,18,"rafraf"],[0,860,5,""]]],[38,[[1,198,18,"rafraf"],[0,860,5,""]]],[40,[[1,198,18,"rafraf"],[0,860,5,""]]],[42,[[1,198,18,"rafraf"],[0,860,5,""]]],[44,[[1,198,18,"rafraf"],[0,860,5,""]]],[46,[[1,198,18,"rafraf"],[0,860,5,""]]],[48,[[1,198,18,"rafraf"],[0,860,5,""]]],[50,[[1,198,18,"rafraf"],[0,860,5,""]]],[52,[[1,198,18,"rafraf"],[0,860,5,""]]],[54,[[1,198,18,"rafraf"],[0,860,5,""]]],[56,[[1,198,18,"rafraf"],[0,860,5,""]]],[58,[[1,198,18,"rafraf"],[0,860,5,""]]],[60,[[1,198,18,"rafraf"],[0,860,5,""]]],[62,[[1,198,18,"rafraf"],[0,860,5,""]]],[64,[[1,198,18,"rafraf"],[0,860,5,""]]],[66,[[1,198,18,"rafraf"],[0,860,5,""]]],[68,[[1,198,18,"rafraf"],[0,860,5,""]]],[70,[[1,198,18,"rafraf"],[0,860,5,""]]],[72,[[1,198,18,"rafraf"],[0,860,5,""]]],[74,[[1,198,18,"rafraf"],[0,860,5,""]]],[76,[[1,198,18,"rafraf"],[0,860,5,""]]],[78,[[1,198,18,"rafraf"],[0,860,5,""]]],[80,[[1,198,18,"rafraf"],[0,860,5,""]]],[82,[[1,198,18,"rafraf"],[0,860,5,""]]],[84,[[1,198,18,"rafraf"],[0,860,5,""]]],[86,[[1,198,18,"rafraf"],[0,860,5,""]]],[88,[[1,198,18,"rafraf"],[0,860,5,""]]],[90,[[1,198,18,"rafraf"],[0,860,5,""]]],[92,[[1,198,18,"rafraf"],[0,860,5,""]]],[94,[[1,198,18,"rafraf"],[0,860,5,""]]],[96,[[1,198,18,"rafraf"],[0,860,5,""]]],[98,[[1,198,18,"rafraf"],[0,860,5,""]]],[100,[[1,198,18,"rafraf"],[0,860,5,""]]],[102,[[1,198,18,"rafraf"],[0,860,5,""]]],[104,[[1,198,18,"rafraf"],[0,860,5,""]]],[106,[[1,198,18,"rafraf"],[0,860,5,""]]],[108,[[1,198,18,"rafraf"],[0,860,5,""]]],[110,[[1,198,18,"rafraf"],[0,860,5,""]]],[112,[[1,198,18,"rafraf"],[0,860,5,""]]],[114,[[1,198,18,"rafraf"],[0,860,5,""]]],[116,[[1,198,18,"rafraf"],[0,860,5,""]]],[118,[[1,198,18,"rafraf"],[0,860,5,""]]],[120,[[1,198,18,"rafraf"],[0,860,5,""]]],[122,[[1,198,18,"rafraf"],[0,860,5,""]]],[124,[[1,198,18,"rafraf"],[0,860,5,""]]],[126,[[1,198,18,"rafraf"],[0,860,5,""]]],[128,[[1,198,18,"rafraf"],[0,860,5,""]]],[130,[[1,198,18,"rafraf"],[0,860,5,""]]],[132,[[1,198,18,"rafraf"],[0,860,5,""]]],[134,[[1,198,18,"rafraf"],[0,860,5,""]]],[136,[[1,198,18,"rafraf"],[0,860,5,""]]],[138,[[1,198,18,"rafraf"],[0,860,5,""]]],[140,[[1,198,18,"rafraf"],[0,860,5,""]]],[142,[[1,198,18,"rafraf"],[0,860,5,""]]],[144,[[1,198,18,"rafraf"],[0,860,5,""]]],[146,[[1,198,18,"rafraf"],[0,860,5,""]]],[148,[[1,198,18,"rafraf"],[0,860,5,""]]],[150,[[1,198,18,"rafraf"],[0,860,5,""]]],[152,[[1,198,18,"rafraf"],[0,860,5,""]]],[154,[[1,198,18,"rafraf"],[0,860,5,""]]],[156,[[1,198,18,"rafraf"],[0,860,5,""]]],[158,[[1,198,18,"rafraf"],[0,860,5,""]]],[160,[[1,198,18,"rafraf"],[0,860,5,""]]],[162,[[1,198,18,"rafraf"],[0,860,5,""]]],[164,[[1,198,18,"rafraf"],[0,860,5,""]]],[166,[[1,198,18,"rafraf"],[0,860,5,""]]],[168,[[1,198,18,"rafraf"],[0,860,5,""]]],[170,[[1,198,18,"rafraf"],[0,860,5,""]]],[172,[[1,198,18,"rafraf"],[0,860,5,""]]],[174,[[1,198,18,"rafraf"],[0,860,5,""]]],[176,[[1,198,18,"rafraf"],[0,860,5,""]]],[178,[[1,198,18,"rafraf"],[0,860,5,""]]],[180,[[1,198,18,"rafraf"],[0,860,5,""]]],[182,[[1,198,18,"rafraf"],[0,860,5,""]]],[184,[[1,198,18,"rafraf"],[0,860,5,""]]],[186,[[1,198,18,"rafraf"],[0,860,5,""]]],[188,[[1,198,18,"rafraf"],[0,860,5,""]]],[190,[[1,198,18,"rafraf"],[0,860,5,""]]],[192,[[1,198,18,"rafraf"],[0,860,5,""]]],[194,[[1,198,18,"rafraf"],[0,860,5,""]]],[196,[[1,198,18,"rafraf"],[0,860,5,""]]],[198,[[1,198,18,"rafraf"],[0,860,5,""]]],[200,[[1,198,18,"rafraf"],[0,860,5,""]]],[202,[[1,198,18,"rafraf"],[0,860,5,""]]],[204,[[1,198,18,"rafraf"],[0,860,5,""]]],[206,[[1,198,18,"rafraf"],[0,860,5,""]]],[208,[[1,198,18,"rafraf"],[0,860,5,""]]]]} \ No newline at end of file diff --git a/www/0-trace.trace b/www/0-trace.trace new file mode 100644 index 0000000000000..73eac38efda75 --- /dev/null +++ b/www/0-trace.trace @@ -0,0 +1,410 @@ +{"version":8,"type":"context-options","origin":"library","browserName":"webkit","playwrightVersion":"1.59.0-next","options":{"noDefaultViewport":false,"viewport":{"width":1280,"height":720},"ignoreHTTPSErrors":false,"javaScriptEnabled":true,"bypassCSP":false,"locale":"en-US","offline":false,"isMobile":false,"hasTouch":false,"colorScheme":"light","acceptDownloads":"accept","serviceWorkers":"allow","selectorEngines":[],"testIdAttributeName":"data-testid","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15"},"platform":"linux","wallTime":1772649748282,"monotonicTime":2723.677,"sdkLanguage":"javascript","testIdAttributeName":"data-testid","contextId":"browser-context@860152cd0d68eee18ae612f6f64e1589","title":"video.spec.ts:856 › screencast › video.start should fail when another recording is in progress"} +{"type":"before","callId":"call@6","startTime":2732.411,"class":"BrowserContext","method":"newPage","params":{},"stepId":"pw:api@91"} +{"type":"event","time":3235.742,"class":"BrowserContext","method":"page","params":{"pageId":"page@504e8ddc2fe731e3535d4800f737b62a"}} +{"type":"after","callId":"call@6","endTime":3235.891,"result":{"page":""}} +{"type":"before","callId":"call@8","startTime":3256.801,"class":"Frame","method":"evaluateExpression","params":{"expression":"() => document.body.style.backgroundColor = 'red'","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@92","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@8"} +{"type":"frame-snapshot","snapshot":{"callId":"call@8","snapshotName":"before@call@8","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":["HTML",{},["HEAD",{},["BASE",{"href":"about:blank"}]],["BODY"]],"viewport":{"width":1280,"height":720},"timestamp":3262.432,"wallTime":1772649748819,"collectionTime":2.000000000000007,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@8","endTime":3267.521,"result":{"value":{"s":"red"}},"afterSnapshot":"after@call@8"} +{"type":"frame-snapshot","snapshot":{"callId":"call@8","snapshotName":"after@call@8","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":["HTML",{},[[1,1]],["BODY",{"style":"background-color: red;"}]],"viewport":{"width":1280,"height":720},"timestamp":3268.728,"wallTime":1772649748827,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@10","startTime":3272.263,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@93","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@10"} +{"type":"frame-snapshot","snapshot":{"callId":"call@10","snapshotName":"before@call@10","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[1,1]],"viewport":{"width":1280,"height":720},"timestamp":3273.642,"wallTime":1772649748832,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"screencast-frame","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","sha1":"page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg","width":1280,"height":720,"timestamp":3376.604,"frameSwapWallTime":254368891.687} +{"type":"after","callId":"call@10","endTime":3378.209,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@10"} +{"type":"screencast-frame","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","sha1":"page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg","width":1280,"height":720,"timestamp":3387.967,"frameSwapWallTime":254368915.161} +{"type":"frame-snapshot","snapshot":{"callId":"call@10","snapshotName":"after@call@10","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[2,1]],"viewport":{"width":1280,"height":720},"timestamp":3389.546,"wallTime":1772649748948,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@12","startTime":3394.496,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@94","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@12"} +{"type":"frame-snapshot","snapshot":{"callId":"call@12","snapshotName":"before@call@12","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[3,1]],"viewport":{"width":1280,"height":720},"timestamp":3398.571,"wallTime":1772649748957,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@12","endTime":3428.898,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@12"} +{"type":"frame-snapshot","snapshot":{"callId":"call@12","snapshotName":"after@call@12","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[4,1]],"viewport":{"width":1280,"height":720},"timestamp":3431.419,"wallTime":1772649748989,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@14","startTime":3435.908,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@95","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@14"} +{"type":"frame-snapshot","snapshot":{"callId":"call@14","snapshotName":"before@call@14","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[5,1]],"viewport":{"width":1280,"height":720},"timestamp":3438.286,"wallTime":1772649748996,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@14","endTime":3461.204,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@14"} +{"type":"frame-snapshot","snapshot":{"callId":"call@14","snapshotName":"after@call@14","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[6,1]],"viewport":{"width":1280,"height":720},"timestamp":3463.629,"wallTime":1772649749021,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@16","startTime":3468.153,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@96","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@16"} +{"type":"frame-snapshot","snapshot":{"callId":"call@16","snapshotName":"before@call@16","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[7,1]],"viewport":{"width":1280,"height":720},"timestamp":3471.051,"wallTime":1772649749029,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@16","endTime":3493.333,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@16"} +{"type":"frame-snapshot","snapshot":{"callId":"call@16","snapshotName":"after@call@16","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[8,1]],"viewport":{"width":1280,"height":720},"timestamp":3495.897,"wallTime":1772649749054,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@18","startTime":3500.461,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@97","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@18"} +{"type":"frame-snapshot","snapshot":{"callId":"call@18","snapshotName":"before@call@18","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[9,1]],"viewport":{"width":1280,"height":720},"timestamp":3502.715,"wallTime":1772649749060,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@18","endTime":3525.744,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@18"} +{"type":"frame-snapshot","snapshot":{"callId":"call@18","snapshotName":"after@call@18","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[10,1]],"viewport":{"width":1280,"height":720},"timestamp":3527.891,"wallTime":1772649749086,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@20","startTime":3532.154,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@98","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@20"} +{"type":"frame-snapshot","snapshot":{"callId":"call@20","snapshotName":"before@call@20","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[11,1]],"viewport":{"width":1280,"height":720},"timestamp":3534.252,"wallTime":1772649749092,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@20","endTime":3558.194,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@20"} +{"type":"frame-snapshot","snapshot":{"callId":"call@20","snapshotName":"after@call@20","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[12,1]],"viewport":{"width":1280,"height":720},"timestamp":3560.518,"wallTime":1772649749118,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@22","startTime":3565.082,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@99","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@22"} +{"type":"frame-snapshot","snapshot":{"callId":"call@22","snapshotName":"before@call@22","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[13,1]],"viewport":{"width":1280,"height":720},"timestamp":3567.23,"wallTime":1772649749125,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@22","endTime":3590.468,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@22"} +{"type":"frame-snapshot","snapshot":{"callId":"call@22","snapshotName":"after@call@22","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[14,1]],"viewport":{"width":1280,"height":720},"timestamp":3592.792,"wallTime":1772649749150,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@24","startTime":3612.175,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@100","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@24"} +{"type":"frame-snapshot","snapshot":{"callId":"call@24","snapshotName":"before@call@24","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[15,1]],"viewport":{"width":1280,"height":720},"timestamp":3615.119,"wallTime":1772649749172,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@24","endTime":3638.869,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@24"} +{"type":"frame-snapshot","snapshot":{"callId":"call@24","snapshotName":"after@call@24","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[16,1]],"viewport":{"width":1280,"height":720},"timestamp":3640.79,"wallTime":1772649749199,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@26","startTime":3646.038,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@101","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@26"} +{"type":"frame-snapshot","snapshot":{"callId":"call@26","snapshotName":"before@call@26","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[17,1]],"viewport":{"width":1280,"height":720},"timestamp":3647.97,"wallTime":1772649749206,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@26","endTime":3671.195,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@26"} +{"type":"frame-snapshot","snapshot":{"callId":"call@26","snapshotName":"after@call@26","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[18,1]],"viewport":{"width":1280,"height":720},"timestamp":3673.609,"wallTime":1772649749231,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@28","startTime":3678.099,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@102","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@28"} +{"type":"frame-snapshot","snapshot":{"callId":"call@28","snapshotName":"before@call@28","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[19,1]],"viewport":{"width":1280,"height":720},"timestamp":3680.159,"wallTime":1772649749238,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@28","endTime":3703.787,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@28"} +{"type":"frame-snapshot","snapshot":{"callId":"call@28","snapshotName":"after@call@28","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[20,1]],"viewport":{"width":1280,"height":720},"timestamp":3706.157,"wallTime":1772649749264,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@30","startTime":3710.503,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@103","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@30"} +{"type":"frame-snapshot","snapshot":{"callId":"call@30","snapshotName":"before@call@30","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[21,1]],"viewport":{"width":1280,"height":720},"timestamp":3712.657,"wallTime":1772649749270,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@30","endTime":3735.755,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@30"} +{"type":"frame-snapshot","snapshot":{"callId":"call@30","snapshotName":"after@call@30","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[22,1]],"viewport":{"width":1280,"height":720},"timestamp":3737.974,"wallTime":1772649749296,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@32","startTime":3742.303,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@104","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@32"} +{"type":"frame-snapshot","snapshot":{"callId":"call@32","snapshotName":"before@call@32","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[23,1]],"viewport":{"width":1280,"height":720},"timestamp":3776.446,"wallTime":1772649749302,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@32","endTime":3800.423,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@32"} +{"type":"frame-snapshot","snapshot":{"callId":"call@32","snapshotName":"after@call@32","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[24,1]],"viewport":{"width":1280,"height":720},"timestamp":3802.618,"wallTime":1772649749360,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@34","startTime":3806.515,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@105","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@34"} +{"type":"frame-snapshot","snapshot":{"callId":"call@34","snapshotName":"before@call@34","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[25,1]],"viewport":{"width":1280,"height":720},"timestamp":3808.19,"wallTime":1772649749366,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@34","endTime":3832.612,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@34"} +{"type":"frame-snapshot","snapshot":{"callId":"call@34","snapshotName":"after@call@34","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[26,1]],"viewport":{"width":1280,"height":720},"timestamp":3834.5,"wallTime":1772649749392,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@36","startTime":3838.136,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@106","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@36"} +{"type":"frame-snapshot","snapshot":{"callId":"call@36","snapshotName":"before@call@36","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[27,1]],"viewport":{"width":1280,"height":720},"timestamp":3840.03,"wallTime":1772649749398,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@36","endTime":3864.829,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@36"} +{"type":"frame-snapshot","snapshot":{"callId":"call@36","snapshotName":"after@call@36","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[28,1]],"viewport":{"width":1280,"height":720},"timestamp":3866.931,"wallTime":1772649749425,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@38","startTime":3871.206,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@107","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@38"} +{"type":"frame-snapshot","snapshot":{"callId":"call@38","snapshotName":"before@call@38","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[29,1]],"viewport":{"width":1280,"height":720},"timestamp":3873.133,"wallTime":1772649749431,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@38","endTime":3897.061,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@38"} +{"type":"frame-snapshot","snapshot":{"callId":"call@38","snapshotName":"after@call@38","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[30,1]],"viewport":{"width":1280,"height":720},"timestamp":3899.176,"wallTime":1772649749457,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@40","startTime":3902.93,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@108","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@40"} +{"type":"frame-snapshot","snapshot":{"callId":"call@40","snapshotName":"before@call@40","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[31,1]],"viewport":{"width":1280,"height":720},"timestamp":3905.434,"wallTime":1772649749463,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@40","endTime":3929.331,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@40"} +{"type":"frame-snapshot","snapshot":{"callId":"call@40","snapshotName":"after@call@40","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[32,1]],"viewport":{"width":1280,"height":720},"timestamp":3931.54,"wallTime":1772649749489,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@42","startTime":3935.593,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@109","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@42"} +{"type":"frame-snapshot","snapshot":{"callId":"call@42","snapshotName":"before@call@42","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[33,1]],"viewport":{"width":1280,"height":720},"timestamp":3937.809,"wallTime":1772649749496,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@42","endTime":3961.84,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@42"} +{"type":"frame-snapshot","snapshot":{"callId":"call@42","snapshotName":"after@call@42","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[34,1]],"viewport":{"width":1280,"height":720},"timestamp":3963.967,"wallTime":1772649749522,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@44","startTime":3967.836,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@110","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@44"} +{"type":"frame-snapshot","snapshot":{"callId":"call@44","snapshotName":"before@call@44","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[35,1]],"viewport":{"width":1280,"height":720},"timestamp":3969.769,"wallTime":1772649749527,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@44","endTime":3994.038,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@44"} +{"type":"frame-snapshot","snapshot":{"callId":"call@44","snapshotName":"after@call@44","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[36,1]],"viewport":{"width":1280,"height":720},"timestamp":3996.041,"wallTime":1772649749554,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@46","startTime":3999.872,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@111","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@46"} +{"type":"frame-snapshot","snapshot":{"callId":"call@46","snapshotName":"before@call@46","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[37,1]],"viewport":{"width":1280,"height":720},"timestamp":4001.792,"wallTime":1772649749560,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@46","endTime":4026.326,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@46"} +{"type":"frame-snapshot","snapshot":{"callId":"call@46","snapshotName":"after@call@46","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[38,1]],"viewport":{"width":1280,"height":720},"timestamp":4028.385,"wallTime":1772649749586,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@48","startTime":4032.139,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@112","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@48"} +{"type":"frame-snapshot","snapshot":{"callId":"call@48","snapshotName":"before@call@48","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[39,1]],"viewport":{"width":1280,"height":720},"timestamp":4034.195,"wallTime":1772649749592,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@48","endTime":4058.663,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@48"} +{"type":"frame-snapshot","snapshot":{"callId":"call@48","snapshotName":"after@call@48","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[40,1]],"viewport":{"width":1280,"height":720},"timestamp":4060.576,"wallTime":1772649749618,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@50","startTime":4064.279,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@113","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@50"} +{"type":"frame-snapshot","snapshot":{"callId":"call@50","snapshotName":"before@call@50","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[41,1]],"viewport":{"width":1280,"height":720},"timestamp":4066.28,"wallTime":1772649749624,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@50","endTime":4090.947,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@50"} +{"type":"frame-snapshot","snapshot":{"callId":"call@50","snapshotName":"after@call@50","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[42,1]],"viewport":{"width":1280,"height":720},"timestamp":4093.024,"wallTime":1772649749651,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@52","startTime":4096.764,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@114","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@52"} +{"type":"frame-snapshot","snapshot":{"callId":"call@52","snapshotName":"before@call@52","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[43,1]],"viewport":{"width":1280,"height":720},"timestamp":4098.661,"wallTime":1772649749656,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@52","endTime":4123.265,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@52"} +{"type":"frame-snapshot","snapshot":{"callId":"call@52","snapshotName":"after@call@52","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[44,1]],"viewport":{"width":1280,"height":720},"timestamp":4125.352,"wallTime":1772649749683,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@54","startTime":4129.131,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@115","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@54"} +{"type":"frame-snapshot","snapshot":{"callId":"call@54","snapshotName":"before@call@54","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[45,1]],"viewport":{"width":1280,"height":720},"timestamp":4131.094,"wallTime":1772649749689,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@54","endTime":4155.567,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@54"} +{"type":"frame-snapshot","snapshot":{"callId":"call@54","snapshotName":"after@call@54","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[46,1]],"viewport":{"width":1280,"height":720},"timestamp":4157.626,"wallTime":1772649749715,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@56","startTime":4161.14,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@116","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@56"} +{"type":"frame-snapshot","snapshot":{"callId":"call@56","snapshotName":"before@call@56","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[47,1]],"viewport":{"width":1280,"height":720},"timestamp":4163.013,"wallTime":1772649749721,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@56","endTime":4187.852,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@56"} +{"type":"frame-snapshot","snapshot":{"callId":"call@56","snapshotName":"after@call@56","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[48,1]],"viewport":{"width":1280,"height":720},"timestamp":4190.04,"wallTime":1772649749748,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@58","startTime":4194.511,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@117","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@58"} +{"type":"frame-snapshot","snapshot":{"callId":"call@58","snapshotName":"before@call@58","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[49,1]],"viewport":{"width":1280,"height":720},"timestamp":4196.606,"wallTime":1772649749754,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@58","endTime":4220.243,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@58"} +{"type":"frame-snapshot","snapshot":{"callId":"call@58","snapshotName":"after@call@58","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[50,1]],"viewport":{"width":1280,"height":720},"timestamp":4222.374,"wallTime":1772649749780,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@60","startTime":4226.604,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@118","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@60"} +{"type":"frame-snapshot","snapshot":{"callId":"call@60","snapshotName":"before@call@60","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[51,1]],"viewport":{"width":1280,"height":720},"timestamp":4228.715,"wallTime":1772649749786,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@60","endTime":4252.394,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@60"} +{"type":"frame-snapshot","snapshot":{"callId":"call@60","snapshotName":"after@call@60","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[52,1]],"viewport":{"width":1280,"height":720},"timestamp":4254.347,"wallTime":1772649749812,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@62","startTime":4258.024,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@119","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@62"} +{"type":"frame-snapshot","snapshot":{"callId":"call@62","snapshotName":"before@call@62","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[53,1]],"viewport":{"width":1280,"height":720},"timestamp":4259.925,"wallTime":1772649749818,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@62","endTime":4284.573,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@62"} +{"type":"frame-snapshot","snapshot":{"callId":"call@62","snapshotName":"after@call@62","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[54,1]],"viewport":{"width":1280,"height":720},"timestamp":4286.671,"wallTime":1772649749844,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@64","startTime":4290.668,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@120","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@64"} +{"type":"frame-snapshot","snapshot":{"callId":"call@64","snapshotName":"before@call@64","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[55,1]],"viewport":{"width":1280,"height":720},"timestamp":4292.738,"wallTime":1772649749850,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@64","endTime":4316.936,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@64"} +{"type":"frame-snapshot","snapshot":{"callId":"call@64","snapshotName":"after@call@64","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[56,1]],"viewport":{"width":1280,"height":720},"timestamp":4319.113,"wallTime":1772649749877,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@66","startTime":4323.256,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@121","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@66"} +{"type":"frame-snapshot","snapshot":{"callId":"call@66","snapshotName":"before@call@66","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[57,1]],"viewport":{"width":1280,"height":720},"timestamp":4325.35,"wallTime":1772649749883,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@66","endTime":4349.221,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@66"} +{"type":"frame-snapshot","snapshot":{"callId":"call@66","snapshotName":"after@call@66","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[58,1]],"viewport":{"width":1280,"height":720},"timestamp":4351.432,"wallTime":1772649749909,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@68","startTime":4355.559,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@122","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@68"} +{"type":"frame-snapshot","snapshot":{"callId":"call@68","snapshotName":"before@call@68","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[59,1]],"viewport":{"width":1280,"height":720},"timestamp":4357.69,"wallTime":1772649749915,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@68","endTime":4381.546,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@68"} +{"type":"frame-snapshot","snapshot":{"callId":"call@68","snapshotName":"after@call@68","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[60,1]],"viewport":{"width":1280,"height":720},"timestamp":4383.664,"wallTime":1772649749941,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@70","startTime":4388.044,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@123","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@70"} +{"type":"frame-snapshot","snapshot":{"callId":"call@70","snapshotName":"before@call@70","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[61,1]],"viewport":{"width":1280,"height":720},"timestamp":4390.086,"wallTime":1772649749948,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@70","endTime":4413.883,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@70"} +{"type":"frame-snapshot","snapshot":{"callId":"call@70","snapshotName":"after@call@70","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[62,1]],"viewport":{"width":1280,"height":720},"timestamp":4415.843,"wallTime":1772649749974,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@72","startTime":4419.901,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@124","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@72"} +{"type":"frame-snapshot","snapshot":{"callId":"call@72","snapshotName":"before@call@72","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[63,1]],"viewport":{"width":1280,"height":720},"timestamp":4421.646,"wallTime":1772649749980,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@72","endTime":4446.16,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@72"} +{"type":"frame-snapshot","snapshot":{"callId":"call@72","snapshotName":"after@call@72","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[64,1]],"viewport":{"width":1280,"height":720},"timestamp":4448.048,"wallTime":1772649750006,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@74","startTime":4452.186,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@125","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@74"} +{"type":"frame-snapshot","snapshot":{"callId":"call@74","snapshotName":"before@call@74","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[65,1]],"viewport":{"width":1280,"height":720},"timestamp":4453.973,"wallTime":1772649750012,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@74","endTime":4478.373,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@74"} +{"type":"frame-snapshot","snapshot":{"callId":"call@74","snapshotName":"after@call@74","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[66,1]],"viewport":{"width":1280,"height":720},"timestamp":4480.259,"wallTime":1772649750038,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@76","startTime":4484.389,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@126","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@76"} +{"type":"frame-snapshot","snapshot":{"callId":"call@76","snapshotName":"before@call@76","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[67,1]],"viewport":{"width":1280,"height":720},"timestamp":4486.155,"wallTime":1772649750044,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@76","endTime":4510.834,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@76"} +{"type":"frame-snapshot","snapshot":{"callId":"call@76","snapshotName":"after@call@76","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[68,1]],"viewport":{"width":1280,"height":720},"timestamp":4512.681,"wallTime":1772649750071,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@78","startTime":4516.817,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@127","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@78"} +{"type":"frame-snapshot","snapshot":{"callId":"call@78","snapshotName":"before@call@78","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[69,1]],"viewport":{"width":1280,"height":720},"timestamp":4518.603,"wallTime":1772649750077,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@78","endTime":4543.051,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@78"} +{"type":"frame-snapshot","snapshot":{"callId":"call@78","snapshotName":"after@call@78","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[70,1]],"viewport":{"width":1280,"height":720},"timestamp":4544.919,"wallTime":1772649750103,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@80","startTime":4549.127,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@128","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@80"} +{"type":"frame-snapshot","snapshot":{"callId":"call@80","snapshotName":"before@call@80","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[71,1]],"viewport":{"width":1280,"height":720},"timestamp":4550.907,"wallTime":1772649750109,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@80","endTime":4575.49,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@80"} +{"type":"frame-snapshot","snapshot":{"callId":"call@80","snapshotName":"after@call@80","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[72,1]],"viewport":{"width":1280,"height":720},"timestamp":4577.435,"wallTime":1772649750135,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@82","startTime":4581.588,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@129","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@82"} +{"type":"frame-snapshot","snapshot":{"callId":"call@82","snapshotName":"before@call@82","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[73,1]],"viewport":{"width":1280,"height":720},"timestamp":4583.329,"wallTime":1772649750141,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@82","endTime":4607.625,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@82"} +{"type":"frame-snapshot","snapshot":{"callId":"call@82","snapshotName":"after@call@82","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[74,1]],"viewport":{"width":1280,"height":720},"timestamp":4609.497,"wallTime":1772649750167,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@84","startTime":4613.574,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@130","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@84"} +{"type":"frame-snapshot","snapshot":{"callId":"call@84","snapshotName":"before@call@84","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[75,1]],"viewport":{"width":1280,"height":720},"timestamp":4615.419,"wallTime":1772649750173,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@84","endTime":4639.918,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@84"} +{"type":"frame-snapshot","snapshot":{"callId":"call@84","snapshotName":"after@call@84","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[76,1]],"viewport":{"width":1280,"height":720},"timestamp":4641.849,"wallTime":1772649750200,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@86","startTime":4645.974,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@131","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@86"} +{"type":"frame-snapshot","snapshot":{"callId":"call@86","snapshotName":"before@call@86","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[77,1]],"viewport":{"width":1280,"height":720},"timestamp":4647.804,"wallTime":1772649750206,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@86","endTime":4672.198,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@86"} +{"type":"frame-snapshot","snapshot":{"callId":"call@86","snapshotName":"after@call@86","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[78,1]],"viewport":{"width":1280,"height":720},"timestamp":4674.083,"wallTime":1772649750232,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@88","startTime":4678.131,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@132","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@88"} +{"type":"frame-snapshot","snapshot":{"callId":"call@88","snapshotName":"before@call@88","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[79,1]],"viewport":{"width":1280,"height":720},"timestamp":4679.968,"wallTime":1772649750238,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@88","endTime":4704.609,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@88"} +{"type":"frame-snapshot","snapshot":{"callId":"call@88","snapshotName":"after@call@88","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[80,1]],"viewport":{"width":1280,"height":720},"timestamp":4706.617,"wallTime":1772649750264,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@90","startTime":4710.683,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@133","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@90"} +{"type":"frame-snapshot","snapshot":{"callId":"call@90","snapshotName":"before@call@90","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[81,1]],"viewport":{"width":1280,"height":720},"timestamp":4712.484,"wallTime":1772649750270,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@90","endTime":4736.957,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@90"} +{"type":"frame-snapshot","snapshot":{"callId":"call@90","snapshotName":"after@call@90","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[82,1]],"viewport":{"width":1280,"height":720},"timestamp":4739.036,"wallTime":1772649750297,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@92","startTime":4743.094,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@134","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@92"} +{"type":"frame-snapshot","snapshot":{"callId":"call@92","snapshotName":"before@call@92","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[83,1]],"viewport":{"width":1280,"height":720},"timestamp":4744.924,"wallTime":1772649750303,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@92","endTime":4769.157,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@92"} +{"type":"frame-snapshot","snapshot":{"callId":"call@92","snapshotName":"after@call@92","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[84,1]],"viewport":{"width":1280,"height":720},"timestamp":4771.151,"wallTime":1772649750329,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@94","startTime":4775.199,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@135","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@94"} +{"type":"frame-snapshot","snapshot":{"callId":"call@94","snapshotName":"before@call@94","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[85,1]],"viewport":{"width":1280,"height":720},"timestamp":4776.989,"wallTime":1772649750335,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@94","endTime":4801.443,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@94"} +{"type":"frame-snapshot","snapshot":{"callId":"call@94","snapshotName":"after@call@94","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[86,1]],"viewport":{"width":1280,"height":720},"timestamp":4803.394,"wallTime":1772649750361,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@96","startTime":4807.469,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@136","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@96"} +{"type":"frame-snapshot","snapshot":{"callId":"call@96","snapshotName":"before@call@96","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[87,1]],"viewport":{"width":1280,"height":720},"timestamp":4809.255,"wallTime":1772649750367,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@96","endTime":4833.806,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@96"} +{"type":"frame-snapshot","snapshot":{"callId":"call@96","snapshotName":"after@call@96","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[88,1]],"viewport":{"width":1280,"height":720},"timestamp":4835.859,"wallTime":1772649750393,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@98","startTime":4839.827,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@137","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@98"} +{"type":"frame-snapshot","snapshot":{"callId":"call@98","snapshotName":"before@call@98","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[89,1]],"viewport":{"width":1280,"height":720},"timestamp":4841.578,"wallTime":1772649750399,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@98","endTime":4866.089,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@98"} +{"type":"frame-snapshot","snapshot":{"callId":"call@98","snapshotName":"after@call@98","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[90,1]],"viewport":{"width":1280,"height":720},"timestamp":4868.334,"wallTime":1772649750426,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@100","startTime":4894.634,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@138","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@100"} +{"type":"frame-snapshot","snapshot":{"callId":"call@100","snapshotName":"before@call@100","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[91,1]],"viewport":{"width":1280,"height":720},"timestamp":4898.561,"wallTime":1772649750454,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@100","endTime":4933.314,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@100"} +{"type":"frame-snapshot","snapshot":{"callId":"call@100","snapshotName":"after@call@100","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[92,1]],"viewport":{"width":1280,"height":720},"timestamp":4934.431,"wallTime":1772649750493,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@102","startTime":4935.641,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@139","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@102"} +{"type":"frame-snapshot","snapshot":{"callId":"call@102","snapshotName":"before@call@102","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[93,1]],"viewport":{"width":1280,"height":720},"timestamp":4936.54,"wallTime":1772649750495,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@102","endTime":4962.952,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@102"} +{"type":"frame-snapshot","snapshot":{"callId":"call@102","snapshotName":"after@call@102","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[94,1]],"viewport":{"width":1280,"height":720},"timestamp":4964.486,"wallTime":1772649750523,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@104","startTime":4967.436,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@140","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@104"} +{"type":"frame-snapshot","snapshot":{"callId":"call@104","snapshotName":"before@call@104","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[95,1]],"viewport":{"width":1280,"height":720},"timestamp":4968.922,"wallTime":1772649750527,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@104","endTime":4995.21,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@104"} +{"type":"frame-snapshot","snapshot":{"callId":"call@104","snapshotName":"after@call@104","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[96,1]],"viewport":{"width":1280,"height":720},"timestamp":4996.739,"wallTime":1772649750555,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@106","startTime":4999.6,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@141","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@106"} +{"type":"frame-snapshot","snapshot":{"callId":"call@106","snapshotName":"before@call@106","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[97,1]],"viewport":{"width":1280,"height":720},"timestamp":5001.141,"wallTime":1772649750559,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@106","endTime":5027.561,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@106"} +{"type":"frame-snapshot","snapshot":{"callId":"call@106","snapshotName":"after@call@106","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[98,1]],"viewport":{"width":1280,"height":720},"timestamp":5029.593,"wallTime":1772649750587,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@108","startTime":5033.096,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@142","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@108"} +{"type":"frame-snapshot","snapshot":{"callId":"call@108","snapshotName":"before@call@108","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[99,1]],"viewport":{"width":1280,"height":720},"timestamp":5034.586,"wallTime":1772649750593,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@108","endTime":5059.938,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@108"} +{"type":"frame-snapshot","snapshot":{"callId":"call@108","snapshotName":"after@call@108","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[100,1]],"viewport":{"width":1280,"height":720},"timestamp":5061.444,"wallTime":1772649750620,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@110","startTime":5064.311,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@143","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@110"} +{"type":"frame-snapshot","snapshot":{"callId":"call@110","snapshotName":"before@call@110","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[101,1]],"viewport":{"width":1280,"height":720},"timestamp":5065.859,"wallTime":1772649750624,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@110","endTime":5092.275,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@110"} +{"type":"frame-snapshot","snapshot":{"callId":"call@110","snapshotName":"after@call@110","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[102,1]],"viewport":{"width":1280,"height":720},"timestamp":5093.975,"wallTime":1772649750652,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@112","startTime":5096.929,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@144","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@112"} +{"type":"frame-snapshot","snapshot":{"callId":"call@112","snapshotName":"before@call@112","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[103,1]],"viewport":{"width":1280,"height":720},"timestamp":5098.58,"wallTime":1772649750657,"collectionTime":1.0000000000002274,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@112","endTime":5124.487,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@112"} +{"type":"frame-snapshot","snapshot":{"callId":"call@112","snapshotName":"after@call@112","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[104,1]],"viewport":{"width":1280,"height":720},"timestamp":5126.157,"wallTime":1772649750684,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@114","startTime":5129.221,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@145","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@114"} +{"type":"frame-snapshot","snapshot":{"callId":"call@114","snapshotName":"before@call@114","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[105,1]],"viewport":{"width":1280,"height":720},"timestamp":5130.809,"wallTime":1772649750689,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@114","endTime":5156.687,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@114"} +{"type":"frame-snapshot","snapshot":{"callId":"call@114","snapshotName":"after@call@114","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[106,1]],"viewport":{"width":1280,"height":720},"timestamp":5158.279,"wallTime":1772649750716,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@116","startTime":5161.21,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@146","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@116"} +{"type":"frame-snapshot","snapshot":{"callId":"call@116","snapshotName":"before@call@116","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[107,1]],"viewport":{"width":1280,"height":720},"timestamp":5162.648,"wallTime":1772649750721,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@116","endTime":5188.987,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@116"} +{"type":"frame-snapshot","snapshot":{"callId":"call@116","snapshotName":"after@call@116","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[108,1]],"viewport":{"width":1280,"height":720},"timestamp":5190.546,"wallTime":1772649750749,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@118","startTime":5193.638,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@147","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@118"} +{"type":"frame-snapshot","snapshot":{"callId":"call@118","snapshotName":"before@call@118","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[109,1]],"viewport":{"width":1280,"height":720},"timestamp":5195.096,"wallTime":1772649750753,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@118","endTime":5221.375,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@118"} +{"type":"frame-snapshot","snapshot":{"callId":"call@118","snapshotName":"after@call@118","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[110,1]],"viewport":{"width":1280,"height":720},"timestamp":5222.965,"wallTime":1772649750781,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@120","startTime":5225.864,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@148","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@120"} +{"type":"frame-snapshot","snapshot":{"callId":"call@120","snapshotName":"before@call@120","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[111,1]],"viewport":{"width":1280,"height":720},"timestamp":5227.337,"wallTime":1772649750786,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@120","endTime":5253.495,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@120"} +{"type":"frame-snapshot","snapshot":{"callId":"call@120","snapshotName":"after@call@120","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[112,1]],"viewport":{"width":1280,"height":720},"timestamp":5255.127,"wallTime":1772649750813,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@122","startTime":5258.072,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@149","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@122"} +{"type":"frame-snapshot","snapshot":{"callId":"call@122","snapshotName":"before@call@122","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[113,1]],"viewport":{"width":1280,"height":720},"timestamp":5259.524,"wallTime":1772649750818,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@122","endTime":5285.91,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@122"} +{"type":"frame-snapshot","snapshot":{"callId":"call@122","snapshotName":"after@call@122","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[114,1]],"viewport":{"width":1280,"height":720},"timestamp":5287.512,"wallTime":1772649750846,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@124","startTime":5290.465,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@150","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@124"} +{"type":"frame-snapshot","snapshot":{"callId":"call@124","snapshotName":"before@call@124","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[115,1]],"viewport":{"width":1280,"height":720},"timestamp":5291.941,"wallTime":1772649750850,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@124","endTime":5318.124,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@124"} +{"type":"frame-snapshot","snapshot":{"callId":"call@124","snapshotName":"after@call@124","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[116,1]],"viewport":{"width":1280,"height":720},"timestamp":5319.649,"wallTime":1772649750878,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@126","startTime":5322.657,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@151","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@126"} +{"type":"frame-snapshot","snapshot":{"callId":"call@126","snapshotName":"before@call@126","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[117,1]],"viewport":{"width":1280,"height":720},"timestamp":5324.114,"wallTime":1772649750882,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@126","endTime":5350.429,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@126"} +{"type":"frame-snapshot","snapshot":{"callId":"call@126","snapshotName":"after@call@126","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[118,1]],"viewport":{"width":1280,"height":720},"timestamp":5351.938,"wallTime":1772649750910,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@128","startTime":5354.804,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@152","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@128"} +{"type":"frame-snapshot","snapshot":{"callId":"call@128","snapshotName":"before@call@128","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[119,1]],"viewport":{"width":1280,"height":720},"timestamp":5356.238,"wallTime":1772649750914,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@128","endTime":5382.674,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@128"} +{"type":"frame-snapshot","snapshot":{"callId":"call@128","snapshotName":"after@call@128","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[120,1]],"viewport":{"width":1280,"height":720},"timestamp":5384.227,"wallTime":1772649750942,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@130","startTime":5387.138,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@153","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@130"} +{"type":"frame-snapshot","snapshot":{"callId":"call@130","snapshotName":"before@call@130","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[121,1]],"viewport":{"width":1280,"height":720},"timestamp":5388.669,"wallTime":1772649750947,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@130","endTime":5414.981,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@130"} +{"type":"frame-snapshot","snapshot":{"callId":"call@130","snapshotName":"after@call@130","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[122,1]],"viewport":{"width":1280,"height":720},"timestamp":5416.457,"wallTime":1772649750975,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@132","startTime":5419.314,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@154","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@132"} +{"type":"frame-snapshot","snapshot":{"callId":"call@132","snapshotName":"before@call@132","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[123,1]],"viewport":{"width":1280,"height":720},"timestamp":5420.787,"wallTime":1772649750979,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@132","endTime":5447.2,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@132"} +{"type":"frame-snapshot","snapshot":{"callId":"call@132","snapshotName":"after@call@132","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[124,1]],"viewport":{"width":1280,"height":720},"timestamp":5448.76,"wallTime":1772649751007,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@134","startTime":5451.714,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@155","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@134"} +{"type":"frame-snapshot","snapshot":{"callId":"call@134","snapshotName":"before@call@134","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[125,1]],"viewport":{"width":1280,"height":720},"timestamp":5453.183,"wallTime":1772649751011,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@134","endTime":5479.512,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@134"} +{"type":"frame-snapshot","snapshot":{"callId":"call@134","snapshotName":"after@call@134","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[126,1]],"viewport":{"width":1280,"height":720},"timestamp":5481.065,"wallTime":1772649751039,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@136","startTime":5483.955,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@156","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@136"} +{"type":"frame-snapshot","snapshot":{"callId":"call@136","snapshotName":"before@call@136","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[127,1]],"viewport":{"width":1280,"height":720},"timestamp":5485.439,"wallTime":1772649751044,"collectionTime":0.9999999999995453,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@136","endTime":5511.886,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@136"} +{"type":"frame-snapshot","snapshot":{"callId":"call@136","snapshotName":"after@call@136","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[128,1]],"viewport":{"width":1280,"height":720},"timestamp":5513.374,"wallTime":1772649751072,"collectionTime":0.9999999999995453,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@138","startTime":5516.264,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@157","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@138"} +{"type":"frame-snapshot","snapshot":{"callId":"call@138","snapshotName":"before@call@138","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[129,1]],"viewport":{"width":1280,"height":720},"timestamp":5517.69,"wallTime":1772649751076,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@138","endTime":5544.181,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@138"} +{"type":"frame-snapshot","snapshot":{"callId":"call@138","snapshotName":"after@call@138","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[130,1]],"viewport":{"width":1280,"height":720},"timestamp":5545.679,"wallTime":1772649751104,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@140","startTime":5548.539,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@158","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@140"} +{"type":"frame-snapshot","snapshot":{"callId":"call@140","snapshotName":"before@call@140","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[131,1]],"viewport":{"width":1280,"height":720},"timestamp":5550.113,"wallTime":1772649751108,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@140","endTime":5576.532,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@140"} +{"type":"frame-snapshot","snapshot":{"callId":"call@140","snapshotName":"after@call@140","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[132,1]],"viewport":{"width":1280,"height":720},"timestamp":5578.126,"wallTime":1772649751136,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@142","startTime":5580.999,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@159","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@142"} +{"type":"frame-snapshot","snapshot":{"callId":"call@142","snapshotName":"before@call@142","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[133,1]],"viewport":{"width":1280,"height":720},"timestamp":5582.44,"wallTime":1772649751141,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@142","endTime":5608.753,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@142"} +{"type":"frame-snapshot","snapshot":{"callId":"call@142","snapshotName":"after@call@142","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[134,1]],"viewport":{"width":1280,"height":720},"timestamp":5610.367,"wallTime":1772649751168,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@144","startTime":5613.308,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@160","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@144"} +{"type":"frame-snapshot","snapshot":{"callId":"call@144","snapshotName":"before@call@144","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[135,1]],"viewport":{"width":1280,"height":720},"timestamp":5614.822,"wallTime":1772649751173,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@144","endTime":5641.101,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@144"} +{"type":"frame-snapshot","snapshot":{"callId":"call@144","snapshotName":"after@call@144","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[136,1]],"viewport":{"width":1280,"height":720},"timestamp":5642.729,"wallTime":1772649751201,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@146","startTime":5645.708,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@161","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@146"} +{"type":"frame-snapshot","snapshot":{"callId":"call@146","snapshotName":"before@call@146","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[137,1]],"viewport":{"width":1280,"height":720},"timestamp":5652.097,"wallTime":1772649751210,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@146","endTime":5673.352,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@146"} +{"type":"frame-snapshot","snapshot":{"callId":"call@146","snapshotName":"after@call@146","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[138,1]],"viewport":{"width":1280,"height":720},"timestamp":5675.077,"wallTime":1772649751233,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@148","startTime":5678.057,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@162","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@148"} +{"type":"frame-snapshot","snapshot":{"callId":"call@148","snapshotName":"before@call@148","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[139,1]],"viewport":{"width":1280,"height":720},"timestamp":5680.357,"wallTime":1772649751238,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@148","endTime":5705.67,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@148"} +{"type":"frame-snapshot","snapshot":{"callId":"call@148","snapshotName":"after@call@148","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[140,1]],"viewport":{"width":1280,"height":720},"timestamp":5707.454,"wallTime":1772649751266,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@150","startTime":5710.455,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@163","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@150"} +{"type":"frame-snapshot","snapshot":{"callId":"call@150","snapshotName":"before@call@150","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[141,1]],"viewport":{"width":1280,"height":720},"timestamp":5711.952,"wallTime":1772649751270,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@150","endTime":5738.07,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@150"} +{"type":"frame-snapshot","snapshot":{"callId":"call@150","snapshotName":"after@call@150","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[142,1]],"viewport":{"width":1280,"height":720},"timestamp":5739.662,"wallTime":1772649751298,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@152","startTime":5742.785,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@164","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@152"} +{"type":"frame-snapshot","snapshot":{"callId":"call@152","snapshotName":"before@call@152","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[143,1]],"viewport":{"width":1280,"height":720},"timestamp":5744.276,"wallTime":1772649751302,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@152","endTime":5770.149,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@152"} +{"type":"frame-snapshot","snapshot":{"callId":"call@152","snapshotName":"after@call@152","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[144,1]],"viewport":{"width":1280,"height":720},"timestamp":5771.959,"wallTime":1772649751330,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@154","startTime":5775.093,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@165","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@154"} +{"type":"frame-snapshot","snapshot":{"callId":"call@154","snapshotName":"before@call@154","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[145,1]],"viewport":{"width":1280,"height":720},"timestamp":5776.661,"wallTime":1772649751335,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@154","endTime":5802.457,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@154"} +{"type":"frame-snapshot","snapshot":{"callId":"call@154","snapshotName":"after@call@154","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[146,1]],"viewport":{"width":1280,"height":720},"timestamp":5803.963,"wallTime":1772649751362,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@156","startTime":5807.016,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@166","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@156"} +{"type":"frame-snapshot","snapshot":{"callId":"call@156","snapshotName":"before@call@156","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[147,1]],"viewport":{"width":1280,"height":720},"timestamp":5808.508,"wallTime":1772649751367,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@156","endTime":5834.865,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@156"} +{"type":"frame-snapshot","snapshot":{"callId":"call@156","snapshotName":"after@call@156","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[148,1]],"viewport":{"width":1280,"height":720},"timestamp":5836.398,"wallTime":1772649751394,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@158","startTime":5839.446,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@167","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@158"} +{"type":"frame-snapshot","snapshot":{"callId":"call@158","snapshotName":"before@call@158","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[149,1]],"viewport":{"width":1280,"height":720},"timestamp":5840.985,"wallTime":1772649751399,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@158","endTime":5867.14,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@158"} +{"type":"frame-snapshot","snapshot":{"callId":"call@158","snapshotName":"after@call@158","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[150,1]],"viewport":{"width":1280,"height":720},"timestamp":5868.675,"wallTime":1772649751427,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@160","startTime":5871.746,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@168","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@160"} +{"type":"frame-snapshot","snapshot":{"callId":"call@160","snapshotName":"before@call@160","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[151,1]],"viewport":{"width":1280,"height":720},"timestamp":5873.185,"wallTime":1772649751431,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@160","endTime":5899.393,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@160"} +{"type":"frame-snapshot","snapshot":{"callId":"call@160","snapshotName":"after@call@160","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[152,1]],"viewport":{"width":1280,"height":720},"timestamp":5900.897,"wallTime":1772649751459,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@162","startTime":5903.931,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@169","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@162"} +{"type":"frame-snapshot","snapshot":{"callId":"call@162","snapshotName":"before@call@162","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[153,1]],"viewport":{"width":1280,"height":720},"timestamp":5905.476,"wallTime":1772649751464,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@162","endTime":5931.772,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@162"} +{"type":"frame-snapshot","snapshot":{"callId":"call@162","snapshotName":"after@call@162","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[154,1]],"viewport":{"width":1280,"height":720},"timestamp":5933.309,"wallTime":1772649751491,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@164","startTime":5936.462,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@170","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@164"} +{"type":"frame-snapshot","snapshot":{"callId":"call@164","snapshotName":"before@call@164","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[155,1]],"viewport":{"width":1280,"height":720},"timestamp":5937.939,"wallTime":1772649751496,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@164","endTime":5964.03,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@164"} +{"type":"frame-snapshot","snapshot":{"callId":"call@164","snapshotName":"after@call@164","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[156,1]],"viewport":{"width":1280,"height":720},"timestamp":5965.551,"wallTime":1772649751524,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@166","startTime":5968.622,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@171","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@166"} +{"type":"frame-snapshot","snapshot":{"callId":"call@166","snapshotName":"before@call@166","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[157,1]],"viewport":{"width":1280,"height":720},"timestamp":5970.096,"wallTime":1772649751528,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@166","endTime":5996.323,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@166"} +{"type":"frame-snapshot","snapshot":{"callId":"call@166","snapshotName":"after@call@166","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[158,1]],"viewport":{"width":1280,"height":720},"timestamp":5997.845,"wallTime":1772649751556,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@168","startTime":6000.9,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@172","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@168"} +{"type":"frame-snapshot","snapshot":{"callId":"call@168","snapshotName":"before@call@168","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[159,1]],"viewport":{"width":1280,"height":720},"timestamp":6002.369,"wallTime":1772649751561,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@168","endTime":6028.732,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@168"} +{"type":"frame-snapshot","snapshot":{"callId":"call@168","snapshotName":"after@call@168","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[160,1]],"viewport":{"width":1280,"height":720},"timestamp":6030.227,"wallTime":1772649751588,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@170","startTime":6033.468,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@173","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@170"} +{"type":"frame-snapshot","snapshot":{"callId":"call@170","snapshotName":"before@call@170","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[161,1]],"viewport":{"width":1280,"height":720},"timestamp":6034.872,"wallTime":1772649751593,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@170","endTime":6060.991,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@170"} +{"type":"frame-snapshot","snapshot":{"callId":"call@170","snapshotName":"after@call@170","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[162,1]],"viewport":{"width":1280,"height":720},"timestamp":6062.541,"wallTime":1772649751621,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@172","startTime":6065.655,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@174","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@172"} +{"type":"frame-snapshot","snapshot":{"callId":"call@172","snapshotName":"before@call@172","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[163,1]],"viewport":{"width":1280,"height":720},"timestamp":6067.165,"wallTime":1772649751625,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@172","endTime":6093.236,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@172"} +{"type":"frame-snapshot","snapshot":{"callId":"call@172","snapshotName":"after@call@172","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[164,1]],"viewport":{"width":1280,"height":720},"timestamp":6094.83,"wallTime":1772649751653,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@174","startTime":6097.936,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@175","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@174"} +{"type":"frame-snapshot","snapshot":{"callId":"call@174","snapshotName":"before@call@174","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[165,1]],"viewport":{"width":1280,"height":720},"timestamp":6099.439,"wallTime":1772649751658,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@174","endTime":6125.553,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@174"} +{"type":"frame-snapshot","snapshot":{"callId":"call@174","snapshotName":"after@call@174","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[166,1]],"viewport":{"width":1280,"height":720},"timestamp":6127.005,"wallTime":1772649751685,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@176","startTime":6130.082,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@176","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@176"} +{"type":"frame-snapshot","snapshot":{"callId":"call@176","snapshotName":"before@call@176","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[167,1]],"viewport":{"width":1280,"height":720},"timestamp":6131.54,"wallTime":1772649751690,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@176","endTime":6157.872,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@176"} +{"type":"frame-snapshot","snapshot":{"callId":"call@176","snapshotName":"after@call@176","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[168,1]],"viewport":{"width":1280,"height":720},"timestamp":6159.375,"wallTime":1772649751718,"collectionTime":1,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@178","startTime":6162.566,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@177","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@178"} +{"type":"frame-snapshot","snapshot":{"callId":"call@178","snapshotName":"before@call@178","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[169,1]],"viewport":{"width":1280,"height":720},"timestamp":6164.045,"wallTime":1772649751722,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@178","endTime":6190.203,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@178"} +{"type":"frame-snapshot","snapshot":{"callId":"call@178","snapshotName":"after@call@178","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[170,1]],"viewport":{"width":1280,"height":720},"timestamp":6191.723,"wallTime":1772649751750,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@180","startTime":6194.889,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@178","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@180"} +{"type":"frame-snapshot","snapshot":{"callId":"call@180","snapshotName":"before@call@180","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[171,1]],"viewport":{"width":1280,"height":720},"timestamp":6196.432,"wallTime":1772649751754,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@180","endTime":6222.533,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@180"} +{"type":"frame-snapshot","snapshot":{"callId":"call@180","snapshotName":"after@call@180","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[172,1]],"viewport":{"width":1280,"height":720},"timestamp":6224.047,"wallTime":1772649751782,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@182","startTime":6227.122,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@179","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@182"} +{"type":"frame-snapshot","snapshot":{"callId":"call@182","snapshotName":"before@call@182","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[173,1]],"viewport":{"width":1280,"height":720},"timestamp":6228.578,"wallTime":1772649751787,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@182","endTime":6254.729,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@182"} +{"type":"frame-snapshot","snapshot":{"callId":"call@182","snapshotName":"after@call@182","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[174,1]],"viewport":{"width":1280,"height":720},"timestamp":6256.174,"wallTime":1772649751814,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@184","startTime":6259.293,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@180","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@184"} +{"type":"frame-snapshot","snapshot":{"callId":"call@184","snapshotName":"before@call@184","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[175,1]],"viewport":{"width":1280,"height":720},"timestamp":6260.771,"wallTime":1772649751819,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@184","endTime":6286.996,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@184"} +{"type":"frame-snapshot","snapshot":{"callId":"call@184","snapshotName":"after@call@184","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[176,1]],"viewport":{"width":1280,"height":720},"timestamp":6288.485,"wallTime":1772649751847,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@186","startTime":6291.559,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@181","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@186"} +{"type":"frame-snapshot","snapshot":{"callId":"call@186","snapshotName":"before@call@186","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[177,1]],"viewport":{"width":1280,"height":720},"timestamp":6293.033,"wallTime":1772649751851,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@186","endTime":6319.318,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@186"} +{"type":"frame-snapshot","snapshot":{"callId":"call@186","snapshotName":"after@call@186","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[178,1]],"viewport":{"width":1280,"height":720},"timestamp":6320.877,"wallTime":1772649751879,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@188","startTime":6324.043,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@182","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@188"} +{"type":"frame-snapshot","snapshot":{"callId":"call@188","snapshotName":"before@call@188","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[179,1]],"viewport":{"width":1280,"height":720},"timestamp":6325.501,"wallTime":1772649751884,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@188","endTime":6351.677,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@188"} +{"type":"frame-snapshot","snapshot":{"callId":"call@188","snapshotName":"after@call@188","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[180,1]],"viewport":{"width":1280,"height":720},"timestamp":6353.271,"wallTime":1772649751911,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@190","startTime":6356.401,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@183","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@190"} +{"type":"frame-snapshot","snapshot":{"callId":"call@190","snapshotName":"before@call@190","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[181,1]],"viewport":{"width":1280,"height":720},"timestamp":6357.765,"wallTime":1772649751916,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@190","endTime":6383.898,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@190"} +{"type":"frame-snapshot","snapshot":{"callId":"call@190","snapshotName":"after@call@190","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[182,1]],"viewport":{"width":1280,"height":720},"timestamp":6385.557,"wallTime":1772649751944,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@192","startTime":6388.646,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@184","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@192"} +{"type":"frame-snapshot","snapshot":{"callId":"call@192","snapshotName":"before@call@192","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[183,1]],"viewport":{"width":1280,"height":720},"timestamp":6390.143,"wallTime":1772649751948,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@192","endTime":6416.253,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@192"} +{"type":"frame-snapshot","snapshot":{"callId":"call@192","snapshotName":"after@call@192","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[184,1]],"viewport":{"width":1280,"height":720},"timestamp":6417.783,"wallTime":1772649751976,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@194","startTime":6420.863,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@185","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@194"} +{"type":"frame-snapshot","snapshot":{"callId":"call@194","snapshotName":"before@call@194","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[185,1]],"viewport":{"width":1280,"height":720},"timestamp":6422.317,"wallTime":1772649751980,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@194","endTime":6448.533,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@194"} +{"type":"frame-snapshot","snapshot":{"callId":"call@194","snapshotName":"after@call@194","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[186,1]],"viewport":{"width":1280,"height":720},"timestamp":6450.05,"wallTime":1772649752008,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@196","startTime":6453.219,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@186","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@196"} +{"type":"frame-snapshot","snapshot":{"callId":"call@196","snapshotName":"before@call@196","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[187,1]],"viewport":{"width":1280,"height":720},"timestamp":6455.763,"wallTime":1772649752013,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@196","endTime":6480.746,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@196"} +{"type":"frame-snapshot","snapshot":{"callId":"call@196","snapshotName":"after@call@196","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[188,1]],"viewport":{"width":1280,"height":720},"timestamp":6482.247,"wallTime":1772649752040,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@198","startTime":6495.655,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@187","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@198"} +{"type":"frame-snapshot","snapshot":{"callId":"call@198","snapshotName":"before@call@198","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[189,1]],"viewport":{"width":1280,"height":720},"timestamp":6497.325,"wallTime":1772649752055,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@198","endTime":6529.103,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@198"} +{"type":"frame-snapshot","snapshot":{"callId":"call@198","snapshotName":"after@call@198","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[190,1]],"viewport":{"width":1280,"height":720},"timestamp":6530.662,"wallTime":1772649752089,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@200","startTime":6535.173,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@188","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@200"} +{"type":"frame-snapshot","snapshot":{"callId":"call@200","snapshotName":"before@call@200","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[191,1]],"viewport":{"width":1280,"height":720},"timestamp":6536.81,"wallTime":1772649752095,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@200","endTime":6561.502,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@200"} +{"type":"frame-snapshot","snapshot":{"callId":"call@200","snapshotName":"after@call@200","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[192,1]],"viewport":{"width":1280,"height":720},"timestamp":6563.181,"wallTime":1772649752121,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@202","startTime":6566.522,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@189","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@202"} +{"type":"frame-snapshot","snapshot":{"callId":"call@202","snapshotName":"before@call@202","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[193,1]],"viewport":{"width":1280,"height":720},"timestamp":6568.061,"wallTime":1772649752126,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@202","endTime":6593.822,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@202"} +{"type":"frame-snapshot","snapshot":{"callId":"call@202","snapshotName":"after@call@202","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[194,1]],"viewport":{"width":1280,"height":720},"timestamp":6595.387,"wallTime":1772649752153,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@204","startTime":6598.715,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@190","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@204"} +{"type":"frame-snapshot","snapshot":{"callId":"call@204","snapshotName":"before@call@204","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[195,1]],"viewport":{"width":1280,"height":720},"timestamp":6600.184,"wallTime":1772649752158,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@204","endTime":6626.123,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@204"} +{"type":"frame-snapshot","snapshot":{"callId":"call@204","snapshotName":"after@call@204","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[196,1]],"viewport":{"width":1280,"height":720},"timestamp":6627.647,"wallTime":1772649752186,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@206","startTime":6630.825,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@191","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@206"} +{"type":"frame-snapshot","snapshot":{"callId":"call@206","snapshotName":"before@call@206","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[197,1]],"viewport":{"width":1280,"height":720},"timestamp":6632.532,"wallTime":1772649752190,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@206","endTime":6658.507,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@206"} +{"type":"frame-snapshot","snapshot":{"callId":"call@206","snapshotName":"after@call@206","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[198,1]],"viewport":{"width":1280,"height":720},"timestamp":6660.04,"wallTime":1772649752218,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"before","callId":"call@208","startTime":6663.216,"class":"Frame","method":"evaluateExpression","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":true,"arg":{"value":{"v":"undefined"},"handles":[]}},"stepId":"pw:api@192","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","beforeSnapshot":"before@call@208"} +{"type":"frame-snapshot","snapshot":{"callId":"call@208","snapshotName":"before@call@208","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[199,1]],"viewport":{"width":1280,"height":720},"timestamp":6664.657,"wallTime":1772649752223,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} +{"type":"after","callId":"call@208","endTime":6690.67,"result":{"value":{"v":"undefined"}},"afterSnapshot":"after@call@208"} +{"type":"frame-snapshot","snapshot":{"callId":"call@208","snapshotName":"after@call@208","pageId":"page@504e8ddc2fe731e3535d4800f737b62a","frameId":"frame@cde5dc74a700c4811a6f11cf044883ce","frameUrl":"about:blank","html":[[200,1]],"viewport":{"width":1280,"height":720},"timestamp":6692.126,"wallTime":1772649752250,"collectionTime":0,"resourceOverrides":[],"isMainFrame":true}} diff --git a/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg b/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg new file mode 100644 index 0000000000000..5bd8cdbe43223 Binary files /dev/null and b/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg differ diff --git a/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg b/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg new file mode 100644 index 0000000000000..b7e1c58c4648a Binary files /dev/null and b/www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg differ diff --git a/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt b/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt new file mode 100644 index 0000000000000..e2af8fd019b7c --- /dev/null +++ b/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt @@ -0,0 +1,59 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test } from '@playwright/test'; +import type { TestModeName } from './testMode'; +import { DefaultTestMode, DriverTestMode } from './testMode'; + +export type TestModeWorkerOptions = { + mode: TestModeName; +}; + +export type TestModeTestFixtures = { + toImpl: (rpcObject?: any) => any; +}; + +export type TestModeWorkerFixtures = { + toImplInWorkerScope: (rpcObject?: any) => any; + playwright: typeof import('@playwright/test'); +}; + +export const testModeTest = test.extend({ + mode: ['default', { scope: 'worker', option: true }], + playwright: [async ({ mode }, run) => { + const testMode = { + 'default': new DefaultTestMode(), + 'service': new DefaultTestMode(), + 'service2': new DefaultTestMode(), + 'service-grid': new DefaultTestMode(), + 'wsl': new DefaultTestMode(), + 'driver': new DriverTestMode(), + }[mode]; + const playwright = await testMode.setup(); + await run(playwright); + await testMode.teardown(); + }, { scope: 'worker' }], + + toImplInWorkerScope: [async ({ playwright }, use) => { + await use((playwright as any)._connection.toImpl); + }, { scope: 'worker' }], + + toImpl: async ({ toImplInWorkerScope: toImplWorker, mode }, use, testInfo) => { + if (mode !== 'default' || process.env.PW_TEST_REUSE_CONTEXT) + testInfo.skip(); + await use(toImplWorker); + }, +}); diff --git a/www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt b/www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt new file mode 100644 index 0000000000000..670b583b326bc --- /dev/null +++ b/www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt @@ -0,0 +1,221 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { baseTest } from './baseTest'; +import { RunServer, RemoteServer } from './remoteServer'; +import { removeFolders } from '../../packages/playwright-core/lib/server/utils/fileUtils'; +import { isBidiChannel, parseHar } from '../config/utils'; +import { createSkipTestPredicate } from '../bidi/expectationUtil'; +import { hostPlatform } from '../../packages/playwright-core/src/server/utils/hostPlatform'; + +import type { PageTestFixtures, PageWorkerFixtures } from '../page/pageTestApi'; +import type { RemoteServerOptions, PlaywrightServer } from './remoteServer'; +import type { BrowserContext, BrowserContextOptions, BrowserType, Page } from 'playwright-core'; +import type { Log } from '../../packages/trace/src/har'; +import type { TestInfo } from '@playwright/test'; + +export type BrowserTestWorkerFixtures = PageWorkerFixtures & { + browserVersion: string; + defaultSameSiteCookieValue: string; + allowsThirdParty: boolean; + browserMajorVersion: number; + browserType: BrowserType; + isAndroid: boolean; + isElectron: boolean; + isHeadlessShell: boolean; + isFrozenWebkit: boolean; + nodeVersion: { major: number, minor: number, patch: number }; + isBidi: boolean; + bidiTestSkipPredicate: (info: TestInfo) => boolean; +}; + +interface StartRemoteServer { + (kind: 'run-server' | 'launchServer', options?: RemoteServerOptions): Promise; + (kind: 'launchServer', options?: RemoteServerOptions): Promise; +} + +type BrowserTestTestFixtures = PageTestFixtures & { + createUserDataDir: () => Promise; + launchPersistent: (options?: Parameters[1]) => Promise<{ context: BrowserContext, page: Page }>; + startRemoteServer: StartRemoteServer; + contextFactory: (options?: BrowserContextOptions) => Promise; + pageWithHar(options?: { outputPath?: string, content?: 'embed' | 'attach' | 'omit', omitContent?: boolean }): Promise<{ context: BrowserContext, page: Page, getLog: () => Promise, getZip: () => Promise> }> + autoSkipBidiTest: void; +}; + +const test = baseTest.extend({ + browserVersion: [async ({ browser }, run) => { + await run(browser.version()); + }, { scope: 'worker' }], + + browserType: [async ({ playwright, browserName, mode }, run) => { + test.skip(mode === 'service2'); + await run(playwright[browserName]); + }, { scope: 'worker' }], + + allowsThirdParty: [async ({ browserName, channel }, run) => { + if (browserName === 'firefox') + await run(true); + else + await run(false); + }, { scope: 'worker' }], + + defaultSameSiteCookieValue: [async ({ browserName, platform, channel, isBidi }, run) => { + if (browserName === 'chromium' || isBidi) + await run('Lax'); + else if (browserName === 'webkit' && (platform === 'linux' || channel === 'webkit-wsl')) + await run('Lax'); + else if (browserName === 'webkit') + await run('None'); // Windows + older macOS + else if (browserName === 'firefox') + await run('None'); + else + throw new Error('unknown browser - ' + browserName); + }, { scope: 'worker' }], + + browserMajorVersion: [async ({ browserVersion }, run) => { + await run(Number(browserVersion.split('.')[0])); + }, { scope: 'worker' }], + + nodeVersion: [async ({}, use) => { + const [major, minor, patch] = process.versions.node.split('.'); + await use({ major: +major, minor: +minor, patch: +patch }); + }, { scope: 'worker' }], + + isBidi: [async ({ channel }, use) => { + await use(isBidiChannel(channel)); + }, { scope: 'worker' }], + + isAndroid: [false, { scope: 'worker' }], + isElectron: [false, { scope: 'worker' }], + electronMajorVersion: [0, { scope: 'worker' }], + + isHeadlessShell: [async ({ browserName, channel, headless }, use) => { + const isShell = channel === 'chromium-headless-shell' || (!channel && headless); + const isToTShell = channel === 'chromium-tip-of-tree-headless-shell' || (channel === 'chromium-tip-of-tree' && headless); + await use(browserName === 'chromium' && (isShell || isToTShell)); + }, { scope: 'worker' }], + + isFrozenWebkit: [async ({ browserName, isMac, macVersion }, use) => { + await use(browserName === 'webkit' && (hostPlatform.startsWith('debian11') || hostPlatform.startsWith('ubuntu20.04') || (isMac && macVersion < 15))); + }, { scope: 'worker' }], + + contextFactory: async ({ _contextFactory }: any, run) => { + await run(async options => { + const { context } = await _contextFactory(options); + return context; + }); + }, + + createUserDataDir: async ({ mode }, run) => { + test.skip(mode.startsWith('service')); + const dirs: string[] = []; + // We do not put user data dir in testOutputPath, + // because we do not want to upload them as test result artifacts. + // + // Additionally, it is impossible to upload user data dir after test run: + // - Firefox removes lock file later, presumably from another watchdog process? + // - WebKit has circular symlinks that makes CI go crazy. + await run(async () => { + const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'playwright-test-')); + dirs.push(dir); + return dir; + }); + await removeFolders(dirs); + }, + + launchPersistent: async ({ createUserDataDir, browserType, mode }, run) => { + test.skip(mode !== 'default', 'Remote persistent contexts are not supported'); + + let persistentContext: BrowserContext | undefined; + await run(async options => { + if (persistentContext) + throw new Error('can only launch one persistent context'); + const userDataDir = await createUserDataDir(); + persistentContext = await browserType.launchPersistentContext(userDataDir, { ...options }); + const page = persistentContext.pages()[0]; + return { context: persistentContext, page }; + }); + if (persistentContext) + await persistentContext.close(); + }, + + startRemoteServer: async ({ childProcess, browserType, channel, mode }, run) => { + test.skip(mode !== 'default', 'Starting remote server is not supported in remote modes'); + + let server: PlaywrightServer | undefined; + const fn = async (kind: 'launchServer' | 'run-server', options?: RemoteServerOptions) => { + if (server) + throw new Error('can only start one remote server'); + if (kind === 'launchServer') { + const remoteServer = new RemoteServer(); + await remoteServer._start(childProcess, browserType, channel, options); + server = remoteServer; + } else { + const runServer = new RunServer(); + await runServer.start(childProcess, { artifactsDir: options?.artifactsDir }); + server = runServer; + } + return server; + }; + await run(fn as any); + if (server) { + await server.close(); + // Give any connected browsers a chance to disconnect to avoid + // poisoning next test with quasy-alive browsers. + await new Promise(f => setTimeout(f, 1000)); + } + }, + pageWithHar: async ({ contextFactory }, use, testInfo) => { + const pageWithHar = async (options: { outputPath?: string, content?: 'embed' | 'attach' | 'omit', omitContent?: boolean } = {}) => { + const harPath = testInfo.outputPath(options.outputPath || 'test.har'); + const context = await contextFactory({ recordHar: { path: harPath, content: options.content, omitContent: options.omitContent }, ignoreHTTPSErrors: true }); + const page = await context.newPage(); + return { + page, + context, + getLog: async () => { + await context.close(); + return JSON.parse(fs.readFileSync(harPath).toString())['log'] as Log; + }, + getZip: async () => { + await context.close(); + return parseHar(harPath); + }, + }; + }; + await use(pageWithHar); + }, + + bidiTestSkipPredicate: [async ({ }, run) => { + const filter = await createSkipTestPredicate(test.info().project.name); + await run(filter); + }, { scope: 'worker' }], + + autoSkipBidiTest: [async ({ bidiTestSkipPredicate }, run) => { + test.fixme(bidiTestSkipPredicate(test.info()), 'marked as timeout in bidi expectations'); + await run(); + }, { auto: true, scope: 'test' }], +}); + +export const playwrightTest = test; +export const browserTest = test; +export const contextTest = test; + +export { expect } from '@playwright/test'; diff --git a/www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt b/www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt new file mode 100644 index 0000000000000..b712f9ef8167d --- /dev/null +++ b/www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt @@ -0,0 +1,229 @@ +/** + * Copyright Microsoft Corporation. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Locator, Frame, Page } from 'playwright-core'; +import { ZipFile } from '../../packages/playwright-core/lib/server/utils/zipFile'; +import type { StackFrame } from '../../packages/protocol/src/channels'; +import { parseClientSideCallMetadata } from '../../packages/playwright-core/lib/utils/isomorphic/traceUtils'; +import { TraceLoader } from '../../packages/playwright-core/src/utils/isomorphic/trace/traceLoader'; +import { TraceModel } from '../../packages/playwright-core/src/utils/isomorphic/trace/traceModel'; +import type { ActionTraceEvent, TraceEvent } from '@trace/trace'; +import { renderTitleForCall } from '../../packages/playwright-core/lib/utils/isomorphic/protocolFormatter'; +import { ZipTraceLoaderBackend } from '../../packages/playwright-core/lib/server/trace/viewer/traceParser'; +import type { SnapshotStorage } from '../../packages/playwright-core/src/utils/isomorphic/trace/snapshotStorage'; + +export type BoundingBox = Awaited>; + +export async function attachFrame(page: Page, frameId: string, url: string): Promise { + const handle = await page.evaluateHandle(async ({ frameId, url }) => { + const frame = document.createElement('iframe'); + frame.src = url; + frame.id = frameId; + document.body.appendChild(frame); + await new Promise(x => frame.onload = x); + return frame; + }, { frameId, url }); + return handle.asElement().contentFrame() as Promise; +} + +export async function detachFrame(page: Page, frameId: string) { + await page.evaluate(frameId => { + document.getElementById(frameId)!.remove(); + }, frameId); +} + +export async function verifyViewport(page: Page, width: number, height: number) { + // `expect` may clash in test runner tests if imported eagerly. + const { expect } = require('@playwright/test'); + expect(page.viewportSize()!.width).toBe(width); + expect(page.viewportSize()!.height).toBe(height); + expect(await page.evaluate('window.innerWidth')).toBe(width); + expect(await page.evaluate('window.innerHeight')).toBe(height); +} + +export function expectedSSLError(browserName: string, platform: string, channel: string | undefined): RegExp { + if (browserName === 'chromium') + return /net::(ERR_CERT_AUTHORITY_INVALID|ERR_CERT_INVALID)/; + if (browserName === 'webkit') { + if (platform === 'darwin') + return /The certificate for this server is invalid/; + else if (platform === 'win32' && channel !== 'webkit-wsl') + return /SSL peer certificate or SSH remote key was not OK/; + else + return /Unacceptable TLS certificate|Operation was cancelled/; + } + if (browserName === 'firefox' && isBidiChannel(channel)) + return /MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT/; + return /SSL_ERROR_UNKNOWN/; +} + +export function isBidiChannel(channel: string | undefined): boolean { + return channel?.startsWith('bidi-chrom') || channel?.startsWith('moz-firefox') || false; +} + +export function chromiumVersionLessThan(a: string, b: string) { + const left: number[] = a.split('.').map(e => Number(e)); + const right: number[] = b.split('.').map(e => Number(e)); + for (let i = 0; i < 4; i++) { + if (left[i] > right[i]) + return false; + if (left[i] < right[i]) + return true; + } + return false; +} + +let didSuppressUnverifiedCertificateWarning = false; +let originalEmitWarning: (warning: string | Error, ...args: any[]) => void; +export function suppressCertificateWarning() { + if (didSuppressUnverifiedCertificateWarning) + return; + didSuppressUnverifiedCertificateWarning = true; + // Suppress one-time warning: + // https://github.com/nodejs/node/blob/1bbe66f432591aea83555d27dd76c55fea040a0d/lib/internal/options.js#L37-L49 + originalEmitWarning = process.emitWarning; + process.emitWarning = (warning, ...args) => { + if (typeof warning === 'string' && warning.includes('NODE_TLS_REJECT_UNAUTHORIZED')) { + process.emitWarning = originalEmitWarning; + return; + } + return originalEmitWarning.call(process, warning, ...args); + }; +} + +export async function parseTraceRaw(file: string): Promise<{ events: any[], resources: Map, actions: string[], actionObjects: ActionTraceEvent[], stacks: Map }> { + const zipFS = new ZipFile(file); + const resources = new Map(); + for (const entry of await zipFS.entries()) + resources.set(entry, await zipFS.read(entry)); + zipFS.close(); + + const actionMap = new Map(); + const events: any[] = []; + for (const traceFile of [...resources.keys()].filter(name => name.endsWith('.trace'))) { + for (const line of resources.get(traceFile)!.toString().split('\n')) { + if (line) { + const event = JSON.parse(line) as TraceEvent; + events.push(event); + + if (event.type === 'before') { + const action: ActionTraceEvent = { + ...event, + type: 'action', + endTime: 0, + }; + actionMap.set(event.callId, action); + } else if (event.type === 'input') { + const existing = actionMap.get(event.callId); + existing.inputSnapshot = event.inputSnapshot; + existing.point = event.point; + } else if (event.type === 'after') { + const existing = actionMap.get(event.callId); + existing.afterSnapshot = event.afterSnapshot; + existing.endTime = event.endTime; + existing.error = event.error; + existing.result = event.result; + } + } + } + } + + for (const networkFile of [...resources.keys()].filter(name => name.endsWith('.network'))) { + for (const line of resources.get(networkFile)!.toString().split('\n')) { + if (line) + events.push(JSON.parse(line)); + } + } + + const stacks: Map = new Map(); + for (const stacksFile of [...resources.keys()].filter(name => name.endsWith('.stacks'))) { + for (const [key, value] of parseClientSideCallMetadata(JSON.parse(resources.get(stacksFile)!.toString()))) + stacks.set(key, value); + } + + const actionObjects = [...actionMap.values()]; + actionObjects.sort((a, b) => a.startTime - b.startTime); + return { + events, + resources, + actions: actionObjects.map(a => renderTitleForCall({ ...a, type: a.class })), + actionObjects, + stacks, + }; +} + +export async function parseTrace(file: string): Promise<{ snapshots: SnapshotStorage, model: TraceModel }> { + const backend = new ZipTraceLoaderBackend(file); + const loader = new TraceLoader(); + await loader.load(backend, () => {}); + return { model: new TraceModel(file, loader.contextEntries), snapshots: loader.storage() }; +} + +export async function parseHar(file: string): Promise> { + const zipFS = new ZipFile(file); + const resources = new Map(); + for (const entry of await zipFS.entries()) + resources.set(entry, await zipFS.read(entry)); + zipFS.close(); + return resources; +} + +export function waitForTestLog(page: Page, prefix: string): Promise { + return new Promise(resolve => { + page.on('console', message => { + const text = message.text(); + if (text.startsWith(prefix)) { + const json = text.substring(prefix.length); + resolve(JSON.parse(json)); + } + }); + }); +} + +export async function rafraf(target: Page | Frame, count = 1) { + for (let i = 0; i < count; i++) { + await target.evaluate(async () => { + await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f))); + }); + } +} + +export function roundBox(box: BoundingBox): BoundingBox { + return { + x: Math.round(box.x), + y: Math.round(box.y), + width: Math.round(box.width), + height: Math.round(box.height), + }; +} + +export function unshift(snapshot: string): string { + const lines = snapshot.split('\n'); + let whitespacePrefixLength = 100; + for (const line of lines) { + if (!line.trim()) + continue; + const match = line.match(/^(\s*)/); + if (match && match[1].length < whitespacePrefixLength) + whitespacePrefixLength = match[1].length; + } + return lines.filter(t => t.trim()).map(line => line.substring(whitespacePrefixLength)).join('\n'); +} + +const ansiRegex = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); +export function stripAnsi(str: string): string { + return str.replace(ansiRegex, ''); +} diff --git a/www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt b/www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt new file mode 100644 index 0000000000000..641317aa00cb6 --- /dev/null +++ b/www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt @@ -0,0 +1,988 @@ +/** + * Copyright Microsoft Corporation. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawnSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { PNG, jpegjs } from 'playwright-core/lib/utilsBundle'; +import { registry } from '../../packages/playwright-core/lib/server'; +import { expect, browserTest as it } from '../config/browserTest'; +import { parseTraceRaw, rafraf } from '../config/utils'; +import { kTargetClosedErrorMessage } from '../config/errors'; + +export class VideoPlayer { + fileName: string; + output: string; + duration: number; + frames: number; + videoWidth: number; + videoHeight: number; + cache = new Map(); + + constructor(fileName: string) { + this.fileName = fileName; + const ffmpeg = registry.findExecutable('ffmpeg')!.executablePathOrDie('javascript'); + // Force output frame rate to 25 fps as otherwise it would produce one image per timebase unit + // which is 1 / (25 * 1000). + this.output = spawnSync(ffmpeg, ['-i', this.fileName, '-r', '25', `${this.fileName}-%04d.png`]).stderr.toString(); + + const lines = this.output.split('\n'); + let framesLine = lines.find(l => l.startsWith('frame='))!; + if (!framesLine) + throw new Error(`No frame data in the output:\n${this.output}`); + framesLine = framesLine.substring(framesLine.lastIndexOf('frame=')); + const framesMatch = framesLine.match(/frame=\s+(\d+)/); + const streamLine = lines.find(l => l.trim().startsWith('Stream #0:0')); + const resolutionMatch = streamLine.match(/, (\d+)x(\d+),/); + const durationMatch = lines.find(l => l.trim().startsWith('Duration'))!.match(/Duration: (\d+):(\d\d):(\d\d.\d\d)/); + this.duration = (((parseInt(durationMatch![1], 10) * 60) + parseInt(durationMatch![2], 10)) * 60 + parseFloat(durationMatch![3])) * 1000; + this.frames = parseInt(framesMatch![1], 10); + this.videoWidth = parseInt(resolutionMatch![1], 10); + this.videoHeight = parseInt(resolutionMatch![2], 10); + } + + findFrame(framePredicate: (pixels: Buffer) => boolean, offset?: { x: number, y: number }): any |undefined { + for (let f = 1; f <= this.frames; ++f) { + const frame = this.frame(f, offset); + if (framePredicate(frame.data)) + return frame; + } + } + + seekLastFrame(offset?: { x: number, y: number }): any { + return this.frame(this.frames, offset); + } + + frame(frame: number, offset = { x: 10, y: 10 }): any { + if (!this.cache.has(frame)) { + const gap = '0'.repeat(4 - String(frame).length); + const buffer = fs.readFileSync(`${this.fileName}-${gap}${frame}.png`); + this.cache.set(frame, PNG.sync.read(buffer)); + } + const decoded = this.cache.get(frame); + const dst = new PNG({ width: 10, height: 10 }); + PNG.bitblt(decoded, dst, offset.x, offset.y, 10, 10, 0, 0); + return dst; + } +} + +type Pixel = { r: number, g: number, b: number, alpha: number }; +type PixelPredicate = (pixel: Pixel) => boolean; + +function isAlmostWhite({ r, g, b, alpha }: Pixel): boolean { + return r > 185 && g > 185 && b > 185 && alpha === 255; +} + +function isAlmostRed({ r, g, b, alpha }: Pixel): boolean { + return r > 185 && g < 70 && b < 70 && alpha === 255; +} + +function isAlmostBlack({ r, g, b, alpha }: Pixel): boolean { + return r < 70 && g < 70 && b < 70 && alpha === 255; +} + +function isAlmostGray({ r, g, b, alpha }: Pixel): boolean { + return r > 70 && r < 185 && + g > 70 && g < 185 && + b > 70 && b < 185 && + alpha === 255; +} + +function findPixel(pixels: Buffer, pixelPredicate: PixelPredicate): Pixel|undefined { + for (let i = 0, n = pixels.length; i < n; i += 4) { + const pixel = { + r: pixels[i], + g: pixels[i + 1], + b: pixels[i + 2], + alpha: pixels[i + 3], + }; + if (pixelPredicate(pixel)) + return pixel; + } + return undefined; +} + +function everyPixel(pixels: Buffer, pixelPredicate: PixelPredicate) { + const badPixel = findPixel(pixels, pixel => !pixelPredicate(pixel)); + return !badPixel; +} + +function expectAll(pixels: Buffer, pixelPredicate: PixelPredicate) { + const badPixel = findPixel(pixels, pixel => !pixelPredicate(pixel)); + if (!badPixel) + return; + const rgba = [badPixel.r, badPixel.g, badPixel.b, badPixel.alpha].join(', '); + throw new Error([ + `Expected all pixels to satisfy ${pixelPredicate.name}, found bad pixel (${rgba})`, + `Actual pixels=[${pixels.join(',')}]`, + ].join('\n')); +} + +function findVideos(videoDir: string) { + const files = fs.readdirSync(videoDir); + return files.filter(file => file.endsWith('webm')).map(file => path.join(videoDir, file)); +} + +function expectRedFrames(videoFile: string, size: { width: number, height: number }) { + expectFrames(videoFile, size, isAlmostRed); +} + +function expectFrames(videoFile: string, size: { width: number, height: number }, pixelPredicate: PixelPredicate) { + const videoPlayer = new VideoPlayer(videoFile); + const duration = videoPlayer.duration; + expect(duration).toBeGreaterThan(0); + + expect(videoPlayer.videoWidth).toBe(size.width); + expect(videoPlayer.videoHeight).toBe(size.height); + + { + const pixels = videoPlayer.seekLastFrame().data; + expectAll(pixels, pixelPredicate); + } + { + const pixels = videoPlayer.seekLastFrame({ x: size.width - 20, y: 10 }).data; + expectAll(pixels, pixelPredicate); + } +} + +it.describe('screencast', () => { + it.slow(); + it.skip(({ mode }) => mode !== 'default', 'video.path() is not available in remote mode'); + + it('videoSize should require videosPath', async ({ browser }) => { + const error = await browser.newContext({ videoSize: { width: 100, height: 100 } }).catch(e => e); + expect(error.message).toContain('"videoSize" option requires "videosPath" to be specified'); + }); + + it('should work with old options', async ({ browser, browserName, trace, headless, isWindows }, testInfo) => { + const videosPath = testInfo.outputPath(''); + // Firefox does not have a mobile variant and has a large minimum size (500 on windows and 450 elsewhere). + const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + const context = await browser.newContext({ + videosPath, + viewport: size, + videoSize: size + }); + const page = await context.newPage(); + + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + expectRedFrames(videoFile, size); + }); + + it('should throw without recordVideo.dir', async ({ browser }) => { + const error = await browser.newContext({ recordVideo: {} as any }).catch(e => e); + expect(error.message).toContain('recordVideo.dir: expected string, got undefined'); + }); + + it('should capture static page', async ({ browser, browserName, trace, headless, isWindows }, testInfo) => { + // Firefox does not have a mobile variant and has a large minimum size (500 on windows and 450 elsewhere). + const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size + }, + viewport: size, + }); + const page = await context.newPage(); + + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + expectRedFrames(videoFile, size); + }); + + it('should continue recording main page after popup closes', async ({ browser, browserName }, testInfo) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/30837' }); + // Firefox does not have a mobile variant and has a large minimum size (500 on windows and 450 elsewhere). + const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size + }, + viewport: size, + }); + const page = await context.newPage(); + await page.setContent('clickme'); + const [popup] = await Promise.all([ + page.waitForEvent('popup'), + await page.click('a'), + ]); + await popup.close(); + + await page.evaluate(() => { + document.body.textContent = ''; // remove link + document.body.style.backgroundColor = 'red'; + }); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + expectRedFrames(videoFile, size); + }); + + it('should expose video path', async ({ browser }, testInfo) => { + const videosPath = testInfo.outputPath(''); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + const path = await page.video()!.path(); + expect(path).toContain(videosPath); + await context.close(); + expect(fs.existsSync(path)).toBeTruthy(); + }); + + it('should delete video', async ({ browser }, testInfo) => { + const videosPath = testInfo.outputPath(''); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + const deletePromise = page.video().delete(); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.close(); + + const videoPath = await page.video().path(); + await deletePromise; + expect(fs.existsSync(videoPath)).toBeFalsy(); + }); + + it('should expose video path blank page', async ({ browser }, testInfo) => { + const videosPath = testInfo.outputPath(''); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + const path = await page.video()!.path(); + expect(path).toContain(videosPath); + await context.close(); + expect(fs.existsSync(path)).toBeTruthy(); + }); + + it('should work with weird screen resolution', async ({ browser }, testInfo) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/22069' }); + const videosPath = testInfo.outputPath(''); + const size = { width: 1904, height: 609 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + const path = await page.video()!.path(); + expect(path).toContain(videosPath); + await context.close(); + expect(fs.existsSync(path)).toBeTruthy(); + }); + + it('should work with relative path for recordVideo.dir', async ({ browser }, testInfo) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/27086' }); + const videosPath = path.relative(process.cwd(), testInfo.outputPath('')); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + const videoPath = await page.video()!.path(); + await context.close(); + expect(fs.existsSync(videoPath)).toBeTruthy(); + }); + + it('should expose video path blank popup', async ({ browser }, testInfo) => { + const videosPath = testInfo.outputPath(''); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + const [popup] = await Promise.all([ + page.waitForEvent('popup'), + page.evaluate('window.open("about:blank")') + ]); + const path = await popup.video()!.path(); + expect(path).toContain(videosPath); + await context.close(); + expect(fs.existsSync(path)).toBeTruthy(); + }); + + it('should capture navigation', async ({ browser, browserName, server, trace }, testInfo) => { + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size: { width: 1280, height: 720 } + }, + }); + const page = await context.newPage(); + + await page.goto(server.PREFIX + '/background-color.html#rgb(0,0,0)'); + await rafraf(page, 100); + await page.goto(server.CROSS_PROCESS_PREFIX + '/background-color.html#rgb(100,100,100)'); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + const duration = videoPlayer.duration; + expect(duration).toBeGreaterThan(0); + + { + // Find a frame with all almost-black pixels. + const frame = videoPlayer.findFrame(pixels => everyPixel(pixels, isAlmostBlack)); + expect(frame).not.toBeUndefined(); + } + + { + const pixels = videoPlayer.seekLastFrame().data; + expectAll(pixels, isAlmostGray); + } + }); + + it('should capture css transformation', async ({ browser, server, headless, browserName, platform, trace }, testInfo) => { + it.fixme(!headless, 'Fails on headed'); + it.fixme(browserName === 'webkit' && platform === 'win32'); + + const size = { width: 600, height: 400 }; + // Set viewport equal to screencast frame size to avoid scaling. + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size, + }, + viewport: size, + }); + const page = await context.newPage(); + + await page.goto(server.PREFIX + '/rotate-z.html'); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + const duration = videoPlayer.duration; + expect(duration).toBeGreaterThan(0); + + { + const pixels = videoPlayer.seekLastFrame({ x: 95, y: 45 }).data; + expectAll(pixels, isAlmostRed); + } + }); + + it('should work for popups', async ({ browser, server, browserName, trace }, testInfo) => { + it.fixme(browserName === 'firefox', 'https://github.com/microsoft/playwright/issues/14557'); + const videosPath = testInfo.outputPath(''); + const size = { width: 600, height: 400 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size, + }, + viewport: size, + }); + + const page = await context.newPage(); + await page.goto(server.EMPTY_PAGE); + const [popup] = await Promise.all([ + page.waitForEvent('popup'), + page.evaluate(() => { window.open('about:blank'); }), + ]); + await popup.evaluate(() => document.body.style.backgroundColor = 'red'); + await Promise.all([ + rafraf(page, 100), + rafraf(popup, 100), + ]); + await context.close(); + + const pageVideoFile = await page.video().path(); + const popupVideoFile = await popup.video().path(); + expect(pageVideoFile).not.toEqual(popupVideoFile); + expectRedFrames(popupVideoFile, size); + + const videoFiles = findVideos(videosPath); + expect(videoFiles.length).toBe(2); + }); + + it('should scale frames down to the requested size ', async ({ browser, browserName, server, headless, isHeadlessShell }, testInfo) => { + it.fixme(!headless, 'Fails on headed'); + it.fixme(browserName === 'chromium' && !isHeadlessShell, 'Chromium (but not headless shell) has a min width issue'); + + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + // Set size to 1/2 of the viewport. + size: { width: 320, height: 240 }, + }, + viewport: { width: 640, height: 480 }, + }); + const page = await context.newPage(); + + await page.goto(server.PREFIX + '/checkerboard.html'); + // Update the picture to ensure enough frames are generated. + await page.$eval('.container', container => { + container.firstElementChild.classList.remove('red'); + }); + await rafraf(page, 100); + await page.$eval('.container', container => { + container.firstElementChild.classList.add('red'); + }); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + const duration = videoPlayer.duration; + expect(duration).toBeGreaterThan(0); + + { + const pixels = videoPlayer.seekLastFrame({ x: 10, y: 10 }).data; + expectAll(pixels, isAlmostRed); + } + { + const pixels = videoPlayer.seekLastFrame({ x: 300, y: 10 }).data; + expectAll(pixels, isAlmostGray); + } + { + const pixels = videoPlayer.seekLastFrame({ x: 10, y: 200 }).data; + expectAll(pixels, isAlmostGray); + } + { + const pixels = videoPlayer.seekLastFrame({ x: 300, y: 200 }).data; + expectAll(pixels, isAlmostRed); + } + }); + + it('should use viewport scaled down to fit into 800x800 as default size', async ({ browser }, testInfo) => { + const size = { width: 1600, height: 1200 }; + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + }, + viewport: size, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + expect(videoPlayer.videoWidth).toBe(800); + expect(videoPlayer.videoHeight).toBe(600); + }); + + it('should be 800x450 by default', async ({ browser }, testInfo) => { + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + }, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + expect(videoPlayer.videoWidth).toBe(800); + expect(videoPlayer.videoHeight).toBe(450); + }); + + it('should be 800x600 with null viewport', async ({ browser, headless, browserName }, testInfo) => { + it.fixme(browserName === 'firefox' && headless, 'Fails in headless on bots'); + + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + }, + viewport: null + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + expect(videoPlayer.videoWidth).toBe(800); + expect(videoPlayer.videoHeight).toBe(600); + }); + + it('should capture static page in persistent context @smoke', async ({ launchPersistent, browserName, trace, isMac }, testInfo) => { + it.skip(browserName === 'webkit' && isMac && process.arch === 'arm64', 'Is only failing on self-hosted github actions runner on M1 mac; not reproducible locally'); + const size = { width: 600, height: 400 }; + const { context, page } = await launchPersistent({ + recordVideo: { + dir: testInfo.outputPath(''), + size, + }, + viewport: size, + }); + + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + const duration = videoPlayer.duration; + expect(duration).toBeGreaterThan(0); + + expect(videoPlayer.videoWidth).toBe(600); + expect(videoPlayer.videoHeight).toBe(400); + + { + const pixels = videoPlayer.seekLastFrame().data; + expectAll(pixels, isAlmostRed); + } + }); + + it('should emulate an iphone', async ({ contextFactory, playwright, browserName }, testInfo) => { + it.skip(browserName === 'firefox', 'isMobile is not supported in Firefox'); + + const device = playwright.devices['iPhone 6']; + const context = await contextFactory({ + ...device, + recordVideo: { + dir: testInfo.outputPath(''), + }, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await context.close(); + + const videoFile = await page.video().path(); + const videoPlayer = new VideoPlayer(videoFile); + expect(videoPlayer.videoWidth).toBe(374); + expect(videoPlayer.videoHeight).toBe(666); + }); + + it('should throw on browser close', async ({ browserType }, testInfo) => { + const size = { width: 320, height: 240 }; + const browser = await browserType.launch(); + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size, + }, + viewport: size, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await browser.close(); + + const file = testInfo.outputPath('saved-video-'); + const saveResult = await page.video().saveAs(file).catch(e => e); + expect(saveResult.message).toContain('browser has been closed'); + }); + + it('should throw if browser dies', async ({ browserType }, testInfo) => { + const size = { width: 320, height: 240 }; + const browser = await browserType.launch(); + + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size, + }, + viewport: size, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await (browser as any)._channel.killForTests(); + + const file = testInfo.outputPath('saved-video-'); + const saveResult = await page.video().saveAs(file).catch(e => e); + expect(saveResult.message).toContain('rowser has been closed'); + }); + + it('should wait for video to finish if page was closed', async ({ browserType }, testInfo) => { + const size = { width: 320, height: 240 }; + const browser = await browserType.launch(); + + const videoDir = testInfo.outputPath(''); + const context = await browser.newContext({ + recordVideo: { + dir: videoDir, + size, + }, + viewport: size, + }); + + const page = await context.newPage(); + await rafraf(page, 100); + await page.close(); + await context.close(); + await browser.close(); + + const videoFiles = findVideos(videoDir); + expect(videoFiles.length).toBe(1); + const videoPlayer = new VideoPlayer(videoFiles[0]); + expect(videoPlayer.videoWidth).toBe(320); + expect(videoPlayer.videoHeight).toBe(240); + }); + + it('should not create video for internal pages', async ({ browser, server }, testInfo) => { + server.setRoute('/empty.html', (req, res) => { + res.setHeader('Set-Cookie', 'name=value'); + res.end(); + }); + + const videoDir = testInfo.outputPath(''); + const context = await browser.newContext({ + recordVideo: { + dir: videoDir + } + }); + + const page = await context.newPage(); + await page.goto(server.EMPTY_PAGE); + await rafraf(page, 100); + + const cookies = await context.cookies(); + expect(cookies.length).toBe(1); + await context.storageState(); + await context.close(); + + const files = fs.readdirSync(videoDir); + expect(files.length).toBe(1); + }); + + it('should capture full viewport', async ({ browserType, browserName, isWindows, headless, isHeadlessShell }, testInfo) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/22411' }); + it.fixme(browserName === 'chromium' && !isHeadlessShell, 'The square is not on the video'); + it.fixme(browserName === 'firefox' && isWindows, 'https://github.com/microsoft/playwright/issues/14405'); + const size = { width: 600, height: 400 }; + const browser = await browserType.launch(); + + const videoDir = testInfo.outputPath(''); + const context = await browser.newContext({ + viewport: size, + recordVideo: { + dir: videoDir, + size, + }, + }); + + const page = await context.newPage(); + await page.setContent(`
`); + await rafraf(page, 100); + await page.close(); + await context.close(); + await browser.close(); + + const videoFiles = findVideos(videoDir); + expect(videoFiles.length).toBe(1); + const videoPlayer = new VideoPlayer(videoFiles[0]); + expect(videoPlayer.videoWidth).toBe(size.width); + expect(videoPlayer.videoHeight).toBe(size.height); + + // Bottom right corner should be part of the red border. + // However, headed browsers on mac have rounded corners, so offset by 10. + const pixels = videoPlayer.seekLastFrame({ x: size.width - 20, y: size.height - 20 }).data; + expectAll(pixels, isAlmostRed); + }); + + it('should capture full viewport on hidpi', async ({ browserType, browserName, headless, isWindows, isLinux, isHeadlessShell, channel }, testInfo) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/22411' }); + it.fixme(browserName === 'chromium' && !isHeadlessShell, 'The square is not on the video'); + it.fixme(browserName === 'firefox' && isWindows, 'https://github.com/microsoft/playwright/issues/14405'); + it.fixme(browserName === 'webkit' && !headless && (isLinux || (isWindows && channel === 'webkit-wsl')), 'https://github.com/microsoft/playwright/issues/22617'); + const size = { width: 600, height: 400 }; + const browser = await browserType.launch(); + + const videoDir = testInfo.outputPath(''); + const context = await browser.newContext({ + viewport: size, + deviceScaleFactor: 3, + recordVideo: { + dir: videoDir, + size, + }, + }); + + const page = await context.newPage(); + await page.setContent(`
`); + await rafraf(page, 100); + await page.close(); + await context.close(); + await browser.close(); + + const videoFiles = findVideos(videoDir); + expect(videoFiles.length).toBe(1); + const videoPlayer = new VideoPlayer(videoFiles[0]); + expect(videoPlayer.videoWidth).toBe(size.width); + expect(videoPlayer.videoHeight).toBe(size.height); + + // Bottom right corner should be part of the red border. + // However, headed browsers on mac have rounded corners, so offset by 10. + const pixels = videoPlayer.seekLastFrame({ x: size.width - 20, y: size.height - 20 }).data; + expectAll(pixels, isAlmostRed); + }); + + it('should work with video+trace', async ({ browser, trace, headless, browserName, isHeadlessShell }, testInfo) => { + it.skip(trace === 'on'); + it.fixme(!headless, 'different trace screencast image size on all browsers'); + it.fixme(browserName === 'chromium' && !isHeadlessShell, 'different trace screencast image size'); + + const size = { width: 500, height: 400 }; + const traceFile = testInfo.outputPath('trace.zip'); + + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + size + }, + viewport: size, + }); + await context.tracing.start({ screenshots: true }); + const page = await context.newPage(); + + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.tracing.stop({ path: traceFile }); + await context.close(); + + const videoFile = await page.video().path(); + expectRedFrames(videoFile, size); + + const { events, resources } = await parseTraceRaw(traceFile); + const frame = events.filter(e => e.type === 'screencast-frame').pop(); + const buffer = resources.get('resources/' + frame.sha1); + const image = jpegjs.decode(buffer); + expect(image.width).toBe(size.width); + expect(image.height).toBe(size.height); + const offset = size.width * size.height / 2 * 4 + size.width * 4 / 2; // Center should be red. + const pixel: Pixel = { + r: image.data.readUInt8(offset), + g: image.data.readUInt8(offset + 1), + b: image.data.readUInt8(offset + 2), + alpha: image.data.readUInt8(offset + 3), + }; + expect(isAlmostRed(pixel)).toBe(true); + }); + + it('video.start/stop twice', async ({ browser }, testInfo) => { + const size = { width: 800, height: 600 }; + const context = await browser.newContext({ viewport: size }); + const page = await context.newPage(); + + await page.video().start({ size }); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + const videoPath1 = await page.video().path(); + expect(videoPath1).toBeDefined(); + await page.video().stop(); + expectRedFrames(videoPath1, size); + + await page.video().start({ size }); + await page.evaluate(() => document.body.style.backgroundColor = 'rgb(100,100,100)'); + await rafraf(page, 100); + const videoPath2 = await page.video().path(); + expect(videoPath2).toBeDefined(); + expect(videoPath2).not.toEqual(videoPath1); + const videoPath3 = testInfo.outputPath('video3.webm'); + await page.video().stop({ path: videoPath3 }); + const contents2 = fs.readFileSync(videoPath2).toString('base64'); + const contents3 = fs.readFileSync(videoPath3).toString('base64'); + expect(contents2 === contents3).toBeTruthy(); + expectFrames(videoPath3, size, isAlmostGray); + + await context.close(); + }); + + it('video.start should fail when recordVideo is set, but stop should work', async ({ browser }, testInfo) => { + const context = await browser.newContext({ + recordVideo: { + dir: testInfo.outputPath(''), + }, + }); + const page = await context.newPage(); + const error = await page.video().start().catch(e => e); + expect(error.message).toContain('Video is already being recorded'); + await page.video().stop({ path: testInfo.outputPath('video.webm') }); + await context.close(); + }); + + it('video.start should fail when another recording is in progress', async ({ browser }, testInfo) => { + const context = await browser.newContext(); + const page = await context.newPage(); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + + // await page.video().start(); + // const error = await page.video().start().catch(e => e); + expect(error.message).toContain('Video is already being recorded'); + await context.close(); + }); + + it('video.stop should fail when no recording is in progress', async ({ browser }, testInfo) => { + const context = await browser.newContext(); + const page = await context.newPage(); + const error = await page.video().stop().catch(e => e); + expect(error.message).toContain('Video is not being recorded'); + await context.close(); + }); + + it('video.start should finish when page is closed', async ({ browser, browserName }, testInfo) => { + const context = await browser.newContext(); + const page = await context.newPage(); + await page.video().start(); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + const videoPath = await page.video().path(); + expect(videoPath).toBeDefined(); + await page.close(); + const error = await page.video().stop().catch(e => e); + expect(error.message).toContain(kTargetClosedErrorMessage); + const newPath = testInfo.outputPath('video.webm'); + await page.video().saveAs(newPath); + expect(fs.existsSync(newPath)).toBeTruthy(); + await context.close(); + }); + + it('empty video', async ({ browser, browserName }, testInfo) => { + const size = browserName === 'firefox' ? { width: 500, height: 400 } : { width: 320, height: 240 }; + const context = await browser.newContext({ viewport: size }); + const page = await context.newPage(); + await page.video().start({ size }); + const videoPath = testInfo.outputPath('empty-video.webm'); + await page.video().stop({ path: videoPath }); + await context.close(); + expectFrames(videoPath, size, isAlmostWhite); + }); + + it('inspector.startScreencast emits screencastframe events', async ({ browser, server }) => { + const size = { width: 500, height: 400 }; + const context = await browser.newContext({ viewport: size }); + const page = await context.newPage(); + + const frames: { data: Buffer, width: number, height: number }[] = []; + page.inspector().on('screencastframe', frame => frames.push(frame)); + + await page.inspector().startScreencast({ size }); + await page.goto(server.EMPTY_PAGE); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await page.inspector().stopScreencast(); + + expect(frames.length).toBeGreaterThan(0); + for (const frame of frames) { + // Each frame must be a valid JPEG (starts with FF D8) + expect(frame.data[0]).toBe(0xff); + expect(frame.data[1]).toBe(0xd8); + expect(frame.width).toBe(size.width); + expect(frame.height).toBe(size.height); + } + + await context.close(); + }); + + it('startScreencast throws when called with different options while running', async ({ browser }) => { + const size = { width: 500, height: 400 }; + const context = await browser.newContext({ viewport: size }); + const page = await context.newPage(); + + await page.inspector().startScreencast({ size }); + await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running with different options'); + + await page.inspector().stopScreencast(); + await context.close(); + }); + + it('startScreencast allows restart with different options after stop', async ({ browser }) => { + const context = await browser.newContext({ viewport: { width: 500, height: 400 } }); + const page = await context.newPage(); + + await page.inspector().startScreencast({ size: { width: 500, height: 400 } }); + await page.inspector().stopScreencast(); + // Different options should succeed once the previous screencast is stopped. + await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).resolves.toBeUndefined(); + + await page.inspector().stopScreencast(); + await context.close(); + }); + + it('startScreencast throws when video recording is running with different params', async ({ browser }) => { + const videoSize = { width: 500, height: 400 }; + const context = await browser.newContext({ viewport: videoSize }); + const page = await context.newPage(); + + await page.video().start({ size: videoSize }); + await expect(page.inspector().startScreencast({ size: { width: 320, height: 240 } })).rejects.toThrow('Screencast is already running with different options'); + + await page.video().stop(); + await context.close(); + }); +}); + +it('should saveAs video', async ({ browser }, testInfo) => { + it.slow(); + + const videosPath = testInfo.outputPath(''); + const size = { width: 320, height: 240 }; + const context = await browser.newContext({ + recordVideo: { + dir: videosPath, + size + }, + viewport: size, + }); + const page = await context.newPage(); + await page.evaluate(() => document.body.style.backgroundColor = 'red'); + await rafraf(page, 100); + await context.close(); + + const saveAsPath = testInfo.outputPath('my-video.webm'); + await page.video().saveAs(saveAsPath); + expect(fs.existsSync(saveAsPath)).toBeTruthy(); +}); diff --git a/www/test.trace b/www/test.trace new file mode 100644 index 0000000000000..64eb9e368f8f4 --- /dev/null +++ b/www/test.trace @@ -0,0 +1,251 @@ +{"version":8,"type":"context-options","origin":"testRunner","browserName":"","playwrightVersion":"1.59.0-next","options":{},"platform":"linux","wallTime":1772649748075,"monotonicTime":2516.041,"sdkLanguage":"javascript","testTimeout":90000} +{"type":"before","callId":"hook@1","stepId":"hook@1","startTime":2533.386,"class":"Test","method":"hook","title":"Before Hooks","params":{},"stack":[]} +{"type":"before","callId":"hook@2","stepId":"hook@2","parentId":"hook@1","startTime":2534.074,"class":"Test","method":"hook","title":"skip modifier","params":{},"stack":[{"file":"/home/yurys/playwright/tests/library/video.spec.ts","line":163,"column":6}]} +{"type":"before","callId":"fixture@3","stepId":"fixture@3","parentId":"hook@2","startTime":2536.114,"class":"Test","method":"fixture","title":"Fixture \"playwright\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/testModeFixtures.ts","line":34,"column":34}]} +{"type":"after","callId":"fixture@3","endTime":2536.989,"annotations":[]} +{"type":"after","callId":"hook@2","endTime":2560.159,"annotations":[]} +{"type":"before","callId":"fixture@85","stepId":"fixture@85","parentId":"hook@1","startTime":2567.125,"class":"Test","method":"fixture","title":"Fixture \"bidiTestSkipPredicate\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/browserTest.ts","line":62,"column":23}]} +{"type":"after","callId":"fixture@85","endTime":2567.284,"annotations":[]} +{"type":"before","callId":"fixture@86","stepId":"fixture@86","parentId":"hook@1","startTime":2567.591,"class":"Test","method":"fixture","title":"Fixture \"autoSkipBidiTest\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/browserTest.ts","line":62,"column":23}]} +{"type":"after","callId":"fixture@86","endTime":2567.756,"annotations":[]} +{"type":"before","callId":"fixture@87","stepId":"fixture@87","parentId":"hook@1","startTime":2568.028,"class":"Test","method":"fixture","title":"Fixture \"connectOptions\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}],"group":"configuration"} +{"type":"after","callId":"fixture@87","endTime":2568.143,"annotations":[]} +{"type":"before","callId":"fixture@88","stepId":"fixture@88","parentId":"hook@1","startTime":2568.43,"class":"Test","method":"fixture","title":"Fixture \"browser\"","params":{},"stack":[]} +{"type":"before","callId":"pw:api@89","stepId":"pw:api@89","parentId":"fixture@88","startTime":2573.889,"class":"Test","method":"pw:api","title":"Launch browser","params":{"handleSIGINT":"false","executablePath":"undefined","tracesDir":"/home/yurys/playwright/test-results/.playwright-artifacts-0/traces","artifactsDir":"/home/yurys/playwright/test-results/.playwright-artifacts-0","headless":"true","ignoreDefaultArgs":"undefined","ignoreAllDefaultArgs":"false","env":"undefined","timeout":"180000"},"stack":[]} +{"type":"after","callId":"pw:api@89","endTime":2699.61,"annotations":[]} +{"type":"after","callId":"fixture@88","endTime":2699.725,"annotations":[]} +{"type":"after","callId":"hook@1","endTime":2699.896,"annotations":[]} +{"type":"before","callId":"pw:api@90","stepId":"pw:api@90","startTime":2706.754,"class":"Test","method":"pw:api","title":"Create context","params":{"selectorEngines":"[]","testIdAttributeName":"data-testid","acceptDownloads":"accept","bypassCSP":"false","colorScheme":"light","hasTouch":"false","ignoreHTTPSErrors":"false","isMobile":"false","javaScriptEnabled":"true","locale":"en-US","offline":"false","viewport":"Object","serviceWorkers":"allow","noDefaultViewport":"false","extraHTTPHeaders":"undefined","storageState":"undefined","reducedMotion":"undefined","forcedColors":"undefined","contrast":"undefined","clientCertificates":"undefined"},"stack":[{"file":"/home/yurys/playwright/tests/library/video.spec.ts","line":857,"column":21}]} +{"type":"after","callId":"pw:api@90","endTime":2719.825,"annotations":[]} +{"type":"before","callId":"pw:api@91","stepId":"pw:api@91","startTime":2731.834,"class":"Test","method":"pw:api","title":"Create page","params":{},"stack":[{"file":"/home/yurys/playwright/tests/library/video.spec.ts","line":858,"column":32}]} +{"type":"stderr","timestamp":3234.468,"text":"setOptions { width: \u001b[33m800\u001b[39m, height: \u001b[33m600\u001b[39m, quality: \u001b[33m90\u001b[39m }\n"} +{"type":"stderr","timestamp":3234.936,"text":"startScreencast { width: \u001b[33m800\u001b[39m, height: \u001b[33m600\u001b[39m, quality: \u001b[33m90\u001b[39m }\n"} +{"type":"after","callId":"pw:api@91","endTime":3248.687,"annotations":[]} +{"type":"before","callId":"pw:api@92","stepId":"pw:api@92","startTime":3256.243,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"() => document.body.style.backgroundColor = 'red'","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/library/video.spec.ts","line":859,"column":16}]} +{"type":"after","callId":"pw:api@92","endTime":3268.93,"annotations":[]} +{"type":"before","callId":"pw:api@93","stepId":"pw:api@93","startTime":3271.887,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"stderr","timestamp":3376.514,"text":"screencast frame \u001b[33m1280\u001b[39m \u001b[33m720\u001b[39m\n"} +{"type":"stderr","timestamp":3387.912,"text":"screencast frame \u001b[33m1280\u001b[39m \u001b[33m720\u001b[39m\n"} +{"type":"after","callId":"pw:api@93","endTime":3389.969,"annotations":[]} +{"type":"before","callId":"pw:api@94","stepId":"pw:api@94","startTime":3393.757,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@94","endTime":3431.768,"annotations":[]} +{"type":"before","callId":"pw:api@95","stepId":"pw:api@95","startTime":3435.272,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@95","endTime":3463.989,"annotations":[]} +{"type":"before","callId":"pw:api@96","stepId":"pw:api@96","startTime":3467.491,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@96","endTime":3496.31,"annotations":[]} +{"type":"before","callId":"pw:api@97","stepId":"pw:api@97","startTime":3499.824,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@97","endTime":3528.194,"annotations":[]} +{"type":"before","callId":"pw:api@98","stepId":"pw:api@98","startTime":3531.569,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@98","endTime":3560.903,"annotations":[]} +{"type":"before","callId":"pw:api@99","stepId":"pw:api@99","startTime":3564.444,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@99","endTime":3593.103,"annotations":[]} +{"type":"before","callId":"pw:api@100","stepId":"pw:api@100","startTime":3610.131,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@100","endTime":3641.105,"annotations":[]} +{"type":"before","callId":"pw:api@101","stepId":"pw:api@101","startTime":3645.465,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@101","endTime":3673.905,"annotations":[]} +{"type":"before","callId":"pw:api@102","stepId":"pw:api@102","startTime":3677.458,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@102","endTime":3706.436,"annotations":[]} +{"type":"before","callId":"pw:api@103","stepId":"pw:api@103","startTime":3709.916,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@103","endTime":3738.263,"annotations":[]} +{"type":"before","callId":"pw:api@104","stepId":"pw:api@104","startTime":3741.503,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@104","endTime":3802.932,"annotations":[]} +{"type":"before","callId":"pw:api@105","stepId":"pw:api@105","startTime":3806.006,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@105","endTime":3834.774,"annotations":[]} +{"type":"before","callId":"pw:api@106","stepId":"pw:api@106","startTime":3837.57,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@106","endTime":3867.248,"annotations":[]} +{"type":"before","callId":"pw:api@107","stepId":"pw:api@107","startTime":3870.567,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@107","endTime":3899.45,"annotations":[]} +{"type":"before","callId":"pw:api@108","stepId":"pw:api@108","startTime":3902.367,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@108","endTime":3931.83,"annotations":[]} +{"type":"before","callId":"pw:api@109","stepId":"pw:api@109","startTime":3935.052,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@109","endTime":3964.245,"annotations":[]} +{"type":"before","callId":"pw:api@110","stepId":"pw:api@110","startTime":3967.206,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@110","endTime":3996.313,"annotations":[]} +{"type":"before","callId":"pw:api@111","stepId":"pw:api@111","startTime":3999.315,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@111","endTime":4028.652,"annotations":[]} +{"type":"before","callId":"pw:api@112","stepId":"pw:api@112","startTime":4031.592,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@112","endTime":4060.849,"annotations":[]} +{"type":"before","callId":"pw:api@113","stepId":"pw:api@113","startTime":4063.683,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@113","endTime":4093.298,"annotations":[]} +{"type":"before","callId":"pw:api@114","stepId":"pw:api@114","startTime":4096.209,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@114","endTime":4125.621,"annotations":[]} +{"type":"before","callId":"pw:api@115","stepId":"pw:api@115","startTime":4128.573,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@115","endTime":4157.924,"annotations":[]} +{"type":"before","callId":"pw:api@116","stepId":"pw:api@116","startTime":4160.668,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@116","endTime":4190.388,"annotations":[]} +{"type":"before","callId":"pw:api@117","stepId":"pw:api@117","startTime":4193.775,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@117","endTime":4222.654,"annotations":[]} +{"type":"before","callId":"pw:api@118","stepId":"pw:api@118","startTime":4225.97,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@118","endTime":4254.604,"annotations":[]} +{"type":"before","callId":"pw:api@119","stepId":"pw:api@119","startTime":4257.497,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@119","endTime":4286.963,"annotations":[]} +{"type":"before","callId":"pw:api@120","stepId":"pw:api@120","startTime":4290.116,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@120","endTime":4319.384,"annotations":[]} +{"type":"before","callId":"pw:api@121","stepId":"pw:api@121","startTime":4322.636,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@121","endTime":4351.724,"annotations":[]} +{"type":"before","callId":"pw:api@122","stepId":"pw:api@122","startTime":4354.959,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@122","endTime":4383.957,"annotations":[]} +{"type":"before","callId":"pw:api@123","stepId":"pw:api@123","startTime":4387.123,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@123","endTime":4416.108,"annotations":[]} +{"type":"before","callId":"pw:api@124","stepId":"pw:api@124","startTime":4419.34,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@124","endTime":4448.315,"annotations":[]} +{"type":"before","callId":"pw:api@125","stepId":"pw:api@125","startTime":4451.618,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@125","endTime":4480.531,"annotations":[]} +{"type":"before","callId":"pw:api@126","stepId":"pw:api@126","startTime":4483.841,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@126","endTime":4512.98,"annotations":[]} +{"type":"before","callId":"pw:api@127","stepId":"pw:api@127","startTime":4516.255,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@127","endTime":4545.179,"annotations":[]} +{"type":"before","callId":"pw:api@128","stepId":"pw:api@128","startTime":4548.561,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@128","endTime":4577.741,"annotations":[]} +{"type":"before","callId":"pw:api@129","stepId":"pw:api@129","startTime":4581.045,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@129","endTime":4609.778,"annotations":[]} +{"type":"before","callId":"pw:api@130","stepId":"pw:api@130","startTime":4613.037,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@130","endTime":4642.111,"annotations":[]} +{"type":"before","callId":"pw:api@131","stepId":"pw:api@131","startTime":4645.392,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@131","endTime":4674.409,"annotations":[]} +{"type":"before","callId":"pw:api@132","stepId":"pw:api@132","startTime":4677.593,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@132","endTime":4706.903,"annotations":[]} +{"type":"before","callId":"pw:api@133","stepId":"pw:api@133","startTime":4710.076,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@133","endTime":4739.3,"annotations":[]} +{"type":"before","callId":"pw:api@134","stepId":"pw:api@134","startTime":4742.552,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@134","endTime":4771.417,"annotations":[]} +{"type":"before","callId":"pw:api@135","stepId":"pw:api@135","startTime":4774.609,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@135","endTime":4803.657,"annotations":[]} +{"type":"before","callId":"pw:api@136","stepId":"pw:api@136","startTime":4806.958,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@136","endTime":4836.125,"annotations":[]} +{"type":"before","callId":"pw:api@137","stepId":"pw:api@137","startTime":4839.196,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@137","endTime":4868.599,"annotations":[]} +{"type":"before","callId":"pw:api@138","stepId":"pw:api@138","startTime":4871.684,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@138","endTime":4934.565,"annotations":[]} +{"type":"before","callId":"pw:api@139","stepId":"pw:api@139","startTime":4935.435,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@139","endTime":4964.746,"annotations":[]} +{"type":"before","callId":"pw:api@140","stepId":"pw:api@140","startTime":4966.999,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@140","endTime":4996.974,"annotations":[]} +{"type":"before","callId":"pw:api@141","stepId":"pw:api@141","startTime":4999.182,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@141","endTime":5029.944,"annotations":[]} +{"type":"before","callId":"pw:api@142","stepId":"pw:api@142","startTime":5032.643,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@142","endTime":5061.675,"annotations":[]} +{"type":"before","callId":"pw:api@143","stepId":"pw:api@143","startTime":5063.889,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@143","endTime":5094.206,"annotations":[]} +{"type":"before","callId":"pw:api@144","stepId":"pw:api@144","startTime":5096.486,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@144","endTime":5126.463,"annotations":[]} +{"type":"before","callId":"pw:api@145","stepId":"pw:api@145","startTime":5128.823,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@145","endTime":5158.51,"annotations":[]} +{"type":"before","callId":"pw:api@146","stepId":"pw:api@146","startTime":5160.791,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@146","endTime":5190.817,"annotations":[]} +{"type":"before","callId":"pw:api@147","stepId":"pw:api@147","startTime":5193.219,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@147","endTime":5223.197,"annotations":[]} +{"type":"before","callId":"pw:api@148","stepId":"pw:api@148","startTime":5225.415,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@148","endTime":5255.367,"annotations":[]} +{"type":"before","callId":"pw:api@149","stepId":"pw:api@149","startTime":5257.63,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@149","endTime":5287.763,"annotations":[]} +{"type":"before","callId":"pw:api@150","stepId":"pw:api@150","startTime":5290.008,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@150","endTime":5319.958,"annotations":[]} +{"type":"before","callId":"pw:api@151","stepId":"pw:api@151","startTime":5322.244,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@151","endTime":5352.17,"annotations":[]} +{"type":"before","callId":"pw:api@152","stepId":"pw:api@152","startTime":5354.367,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@152","endTime":5384.457,"annotations":[]} +{"type":"before","callId":"pw:api@153","stepId":"pw:api@153","startTime":5386.664,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@153","endTime":5416.684,"annotations":[]} +{"type":"before","callId":"pw:api@154","stepId":"pw:api@154","startTime":5418.905,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@154","endTime":5448.994,"annotations":[]} +{"type":"before","callId":"pw:api@155","stepId":"pw:api@155","startTime":5451.24,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@155","endTime":5481.322,"annotations":[]} +{"type":"before","callId":"pw:api@156","stepId":"pw:api@156","startTime":5483.52,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@156","endTime":5513.607,"annotations":[]} +{"type":"before","callId":"pw:api@157","stepId":"pw:api@157","startTime":5515.81,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@157","endTime":5545.931,"annotations":[]} +{"type":"before","callId":"pw:api@158","stepId":"pw:api@158","startTime":5548.125,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@158","endTime":5578.358,"annotations":[]} +{"type":"before","callId":"pw:api@159","stepId":"pw:api@159","startTime":5580.55,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@159","endTime":5610.636,"annotations":[]} +{"type":"before","callId":"pw:api@160","stepId":"pw:api@160","startTime":5612.865,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@160","endTime":5643,"annotations":[]} +{"type":"before","callId":"pw:api@161","stepId":"pw:api@161","startTime":5645.274,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@161","endTime":5675.324,"annotations":[]} +{"type":"before","callId":"pw:api@162","stepId":"pw:api@162","startTime":5677.644,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@162","endTime":5707.732,"annotations":[]} +{"type":"before","callId":"pw:api@163","stepId":"pw:api@163","startTime":5710.06,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@163","endTime":5739.952,"annotations":[]} +{"type":"before","callId":"pw:api@164","stepId":"pw:api@164","startTime":5742.367,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@164","endTime":5772.256,"annotations":[]} +{"type":"before","callId":"pw:api@165","stepId":"pw:api@165","startTime":5774.592,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@165","endTime":5804.195,"annotations":[]} +{"type":"before","callId":"pw:api@166","stepId":"pw:api@166","startTime":5806.49,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@166","endTime":5836.632,"annotations":[]} +{"type":"before","callId":"pw:api@167","stepId":"pw:api@167","startTime":5838.949,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@167","endTime":5868.936,"annotations":[]} +{"type":"before","callId":"pw:api@168","stepId":"pw:api@168","startTime":5871.227,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@168","endTime":5901.128,"annotations":[]} +{"type":"before","callId":"pw:api@169","stepId":"pw:api@169","startTime":5903.417,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@169","endTime":5933.562,"annotations":[]} +{"type":"before","callId":"pw:api@170","stepId":"pw:api@170","startTime":5935.969,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@170","endTime":5965.809,"annotations":[]} +{"type":"before","callId":"pw:api@171","stepId":"pw:api@171","startTime":5968.133,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@171","endTime":5998.077,"annotations":[]} +{"type":"before","callId":"pw:api@172","stepId":"pw:api@172","startTime":6000.394,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@172","endTime":6030.459,"annotations":[]} +{"type":"before","callId":"pw:api@173","stepId":"pw:api@173","startTime":6032.797,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@173","endTime":6062.828,"annotations":[]} +{"type":"before","callId":"pw:api@174","stepId":"pw:api@174","startTime":6065.181,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@174","endTime":6095.103,"annotations":[]} +{"type":"before","callId":"pw:api@175","stepId":"pw:api@175","startTime":6097.44,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@175","endTime":6127.238,"annotations":[]} +{"type":"before","callId":"pw:api@176","stepId":"pw:api@176","startTime":6129.572,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@176","endTime":6159.609,"annotations":[]} +{"type":"before","callId":"pw:api@177","stepId":"pw:api@177","startTime":6162.029,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@177","endTime":6191.961,"annotations":[]} +{"type":"before","callId":"pw:api@178","stepId":"pw:api@178","startTime":6194.338,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@178","endTime":6224.281,"annotations":[]} +{"type":"before","callId":"pw:api@179","stepId":"pw:api@179","startTime":6226.613,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@179","endTime":6256.408,"annotations":[]} +{"type":"before","callId":"pw:api@180","stepId":"pw:api@180","startTime":6258.803,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@180","endTime":6288.749,"annotations":[]} +{"type":"before","callId":"pw:api@181","stepId":"pw:api@181","startTime":6291.065,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@181","endTime":6321.11,"annotations":[]} +{"type":"before","callId":"pw:api@182","stepId":"pw:api@182","startTime":6323.529,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@182","endTime":6353.509,"annotations":[]} +{"type":"before","callId":"pw:api@183","stepId":"pw:api@183","startTime":6355.915,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@183","endTime":6385.827,"annotations":[]} +{"type":"before","callId":"pw:api@184","stepId":"pw:api@184","startTime":6388.177,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@184","endTime":6418.017,"annotations":[]} +{"type":"before","callId":"pw:api@185","stepId":"pw:api@185","startTime":6420.355,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@185","endTime":6450.284,"annotations":[]} +{"type":"before","callId":"pw:api@186","stepId":"pw:api@186","startTime":6452.624,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@186","endTime":6482.484,"annotations":[]} +{"type":"before","callId":"pw:api@187","stepId":"pw:api@187","startTime":6485.221,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@187","endTime":6530.936,"annotations":[]} +{"type":"before","callId":"pw:api@188","stepId":"pw:api@188","startTime":6534.444,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@188","endTime":6563.429,"annotations":[]} +{"type":"before","callId":"pw:api@189","stepId":"pw:api@189","startTime":6565.94,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@189","endTime":6595.673,"annotations":[]} +{"type":"before","callId":"pw:api@190","stepId":"pw:api@190","startTime":6598.193,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@190","endTime":6627.904,"annotations":[]} +{"type":"before","callId":"pw:api@191","stepId":"pw:api@191","startTime":6630.299,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@191","endTime":6660.276,"annotations":[]} +{"type":"before","callId":"pw:api@192","stepId":"pw:api@192","startTime":6662.665,"class":"Test","method":"pw:api","title":"Evaluate","params":{"expression":"async () => {\n await new Promise(f => window.builtins.requestAnimationFrame(() => window.builtins.requestAnimationFrame(f)));\n }","isFunction":"true","arg":"Object"},"stack":[{"file":"/home/yurys/playwright/tests/config/utils.ts","line":198,"column":18,"function":"rafraf"}]} +{"type":"after","callId":"pw:api@192","endTime":6692.377,"annotations":[]} +{"type":"error","message":"ReferenceError: error is not defined","stack":[{"file":"/home/yurys/playwright/tests/library/video.spec.ts","line":864,"column":12}]} +{"type":"before","callId":"hook@193","stepId":"hook@193","startTime":6695.4,"class":"Test","method":"hook","title":"After Hooks","params":{},"stack":[]} +{"type":"before","callId":"fixture@194","stepId":"fixture@194","parentId":"hook@193","startTime":6697.331,"class":"Test","method":"fixture","title":"Fixture \"autoSkipBidiTest\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/browserTest.ts","line":62,"column":23}]} +{"type":"after","callId":"fixture@194","endTime":6697.512,"annotations":[]} +{"type":"stderr","timestamp":6702.321,"text":"setOptions \u001b[1mnull\u001b[22m\n"} +{"type":"after","callId":"hook@193","endTime":6812.997,"annotations":[]} +{"type":"before","callId":"hook@224","stepId":"hook@224","startTime":6813.515,"class":"Test","method":"hook","title":"Worker Cleanup","params":{},"stack":[]} +{"type":"before","callId":"fixture@225","stepId":"fixture@225","parentId":"hook@224","startTime":6814.296,"class":"Test","method":"fixture","title":"Fixture \"browser\"","params":{},"stack":[]} +{"type":"after","callId":"fixture@225","endTime":6906.737,"annotations":[]} +{"type":"before","callId":"fixture@226","stepId":"fixture@226","parentId":"hook@224","startTime":6907.876,"class":"Test","method":"fixture","title":"Fixture \"connectOptions\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}],"group":"configuration"} +{"type":"after","callId":"fixture@226","endTime":6907.974,"annotations":[]} +{"type":"before","callId":"fixture@228","stepId":"fixture@228","parentId":"hook@224","startTime":6909.33,"class":"Test","method":"fixture","title":"Fixture \"browserName\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}],"group":"configuration"} +{"type":"after","callId":"fixture@228","endTime":6909.382,"annotations":[]} +{"type":"before","callId":"fixture@229","stepId":"fixture@229","parentId":"hook@224","startTime":6910.032,"class":"Test","method":"fixture","title":"Fixture \"bidiTestSkipPredicate\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/browserTest.ts","line":62,"column":23}]} +{"type":"after","callId":"fixture@229","endTime":6910.169,"annotations":[]} +{"type":"before","callId":"fixture@233","stepId":"fixture@233","parentId":"hook@224","startTime":6913.264,"class":"Test","method":"fixture","title":"Fixture \"launchOptions\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}],"group":"configuration"} +{"type":"after","callId":"fixture@233","endTime":6913.301,"annotations":[]} +{"type":"before","callId":"fixture@234","stepId":"fixture@234","parentId":"hook@224","startTime":6913.8,"class":"Test","method":"fixture","title":"Fixture \"headless\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}],"group":"configuration"} +{"type":"after","callId":"fixture@234","endTime":6913.838,"annotations":[]} +{"type":"before","callId":"fixture@235","stepId":"fixture@235","parentId":"hook@224","startTime":6914.292,"class":"Test","method":"fixture","title":"Fixture \"playwright\"","params":{},"stack":[{"file":"/home/yurys/playwright/tests/config/testModeFixtures.ts","line":34,"column":34}]} +{"type":"after","callId":"fixture@235","endTime":6914.445,"annotations":[]} +{"type":"before","callId":"fixture@236","stepId":"fixture@236","parentId":"hook@224","startTime":6915.076,"class":"Test","method":"fixture","title":"Fixture \"mode\"","params":{},"stack":[{"file":"project#webkit-library","line":1,"column":1}]} +{"type":"after","callId":"fixture@236","endTime":6915.173,"annotations":[]} +{"type":"after","callId":"hook@224","endTime":6915.218,"annotations":[]} \ No newline at end of file diff --git a/xxx.patch b/xxx.patch new file mode 100644 index 0000000000000..585c9b0179e56 --- /dev/null +++ b/xxx.patch @@ -0,0 +1,158 @@ +diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts +index 6b9bc4459..e09fe219c 100644 +--- a/packages/playwright/src/index.ts ++++ b/packages/playwright/src/index.ts +@@ -84,11 +84,13 @@ const playwrightFixtures: Fixtures = ({ + video: ['off', { scope: 'worker', option: true, box: true }], + trace: ['off', { scope: 'worker', option: true, box: true }], + +- _browserOptions: [async ({ playwright, headless, channel, launchOptions }, use) => { ++ _browserOptions: [async ({ playwright, headless, channel, launchOptions }, use, testInfo) => { ++ const testInfoImpl = test.info() as TestInfoImpl; + const options: LaunchOptions = { + handleSIGINT: false, + ...launchOptions, +- tracesDir: tracing().tracesDir(), ++ tracesDir: testInfoImpl._tracing.tracesDir(), ++ artifactsDir: testInfoImpl.artifactsDir(), + }; + if (headless !== undefined) + options.headless = headless; +@@ -231,14 +233,14 @@ const playwrightFixtures: Fixtures = ({ + }); + }, { box: true }], + +- _setupContextOptions: [async ({ playwright, actionTimeout, navigationTimeout, testIdAttribute }, use, _testInfo) => { +- const testInfo = _testInfo as TestInfoImpl; ++ _setupContextOptions: [async ({ playwright, actionTimeout, navigationTimeout, testIdAttribute }, use, testInfo) => { ++ const testInfoImpl = testInfo as TestInfoImpl; + if (testIdAttribute) + playwrightLibrary.selectors.setTestIdAttribute(testIdAttribute); +- testInfo.snapshotSuffix = process.platform; +- testInfo._onCustomMessageCallback = () => Promise.reject(new Error('Only tests that use default Playwright context or page fixture support test_debug')); ++ testInfoImpl.snapshotSuffix = process.platform; ++ testInfoImpl._onCustomMessageCallback = () => Promise.reject(new Error('Only tests that use default Playwright context or page fixture support test_debug')); + if (debugMode() === 'inspector') +- (testInfo as TestInfoImpl)._setDebugMode(); ++ testInfoImpl._setDebugMode(); + + playwright._defaultContextTimeout = actionTimeout || 0; + playwright._defaultContextNavigationTimeout = navigationTimeout || 0; +@@ -253,8 +255,9 @@ const playwrightFixtures: Fixtures = ({ + // Now that default test timeout is known, we can replace zero with an actual value. + testInfo.setTimeout(testInfo.project.timeout); + +- const artifactsRecorder = new ArtifactsRecorder(playwright, tracing().artifactsDir(), screenshot); +- await artifactsRecorder.willStartTest(testInfo as TestInfoImpl); ++ const testInfoImpl = testInfo as TestInfoImpl; ++ const artifactsRecorder = new ArtifactsRecorder(playwright, testInfoImpl, screenshot); ++ await artifactsRecorder.willStartTest(); + + const tracingGroupSteps: TestStepInternal[] = []; + const csiListener: ClientInstrumentationListener = { +@@ -363,7 +366,7 @@ const playwrightFixtures: Fixtures = ({ + } + const videoOptions: BrowserContextOptions = captureVideo ? { + recordVideo: { +- dir: tracing().artifactsDir(), ++ dir: path.join(testInfoImpl.artifactsDir(), 'videos'), + size: typeof video === 'string' ? undefined : video.size, + } + } : {}; +@@ -426,22 +429,22 @@ const playwrightFixtures: Fixtures = ({ + await use(reuse); + }, { scope: 'worker', title: 'context', box: true }], + +- context: async ({ browser, _reuseContext, _contextFactory }, use, testInfoPublic) => { ++ context: async ({ browser, _reuseContext, _contextFactory }, use, testInfo) => { + const browserImpl = browser as BrowserImpl; +- const testInfo = testInfoPublic as TestInfoImpl; ++ const testInfoImpl = testInfo as TestInfoImpl; + attachConnectedHeaderIfNeeded(testInfo, browserImpl); + if (!_reuseContext) { + const { context, close } = await _contextFactory(); +- testInfo._onCustomMessageCallback = createCustomMessageHandler(testInfo, context); +- testInfo._onDidFinishTestFunctionCallbacks.add(() => runDaemonForContext(testInfo, context)); ++ testInfoImpl._onCustomMessageCallback = createCustomMessageHandler(testInfoImpl, context); ++ testInfoImpl._onDidFinishTestFunctionCallbacks.add(() => runDaemonForContext(testInfoImpl, context)); + await use(context); + await close(); + return; + } + + const context = await browserImpl._wrapApiCall(() => browserImpl._newContextForReuse(), { internal: true }); +- testInfo._onCustomMessageCallback = createCustomMessageHandler(testInfo, context); +- testInfo._onDidFinishTestFunctionCallbacks.add(() => runDaemonForContext(testInfo, context)); ++ testInfoImpl._onCustomMessageCallback = createCustomMessageHandler(testInfoImpl, context); ++ testInfoImpl._onDidFinishTestFunctionCallbacks.add(() => runDaemonForContext(testInfoImpl, context)); + await use(context); + const closeReason = testInfo.status === 'timedOut' ? 'Test timeout of ' + testInfo.timeout + 'ms exceeded.' : 'Test ended.'; + await browserImpl._wrapApiCall(() => browserImpl._disconnectFromReusedContext(closeReason), { internal: true }); +@@ -501,10 +504,10 @@ const playwrightFixtures: Fixtures = ({ + await testInfoImpl._upstreamStorage(resolvedCacheFile, cacheOutFile); + }, + +- request: async ({ playwright }, use) => { ++ request: async ({ playwright }, use, testInfo) => { + const request = await playwright.request.newContext(); + await use(request); +- const hook = (test.info() as TestInfoImpl)._currentHookType(); ++ const hook = (testInfo as TestInfoImpl)._currentHookType(); + if (hook === 'beforeAll') { + await request.dispose({ reason: [ + `Fixture { request } from beforeAll cannot be reused in a test.`, +@@ -654,8 +657,7 @@ class SnapshotRecorder { + } + + private _createTemporaryArtifact(...name: string[]) { +- const file = path.join(this._artifactsRecorder._artifactsDir, ...name); +- return file; ++ return path.join(this.testInfo.artifactsDir(), ...name); + } + + private async _snapshotPage(page: PageImpl, temporary: boolean) { +@@ -682,17 +684,16 @@ class SnapshotRecorder { + } + + class ArtifactsRecorder { +- _testInfo!: TestInfoImpl; +- _playwright: PlaywrightImpl; +- _artifactsDir: string; ++ readonly _testInfo: TestInfoImpl; ++ readonly _playwright: PlaywrightImpl; + private _startedCollectingArtifacts: symbol; + + private _screenshotRecorder: SnapshotRecorder; + private _pageSnapshot: string | undefined; + +- constructor(playwright: PlaywrightImpl, artifactsDir: string, screenshot: ScreenshotOption) { ++ constructor(playwright: PlaywrightImpl, testInfo: TestInfoImpl, screenshot: ScreenshotOption) { + this._playwright = playwright; +- this._artifactsDir = artifactsDir; ++ this._testInfo = testInfo; + const screenshotOptions = typeof screenshot === 'string' ? undefined : screenshot; + this._startedCollectingArtifacts = Symbol('startedCollectingArtifacts'); + +@@ -703,9 +704,8 @@ class ArtifactsRecorder { + }); + } + +- async willStartTest(testInfo: TestInfoImpl) { +- this._testInfo = testInfo; +- testInfo._onDidFinishTestFunctionCallbacks.add(() => this.didFinishTestFunction()); ++ async willStartTest() { ++ this._testInfo._onDidFinishTestFunctionCallbacks.add(() => this.didFinishTestFunction()); + + this._screenshotRecorder.fixOrdinal(); + +@@ -834,10 +834,6 @@ function renderTitle(type: string, method: string, params: Record(playwrightFixtures); + + export { defineConfig } from './common/configLoader';