From 3f001aba88a03bded5381e97ad29892cdd82afae Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 4 Mar 2026 16:00:36 -0800 Subject: [PATCH 1/7] chore: disposable follow-up 2 (#39517) --- packages/playwright-core/src/client/disposable.ts | 6 ++++-- packages/playwright-core/src/mcp/browser/context.ts | 2 +- packages/playwright-core/src/mcp/browser/tab.ts | 8 ++++---- .../src/server/dispatchers/browserContextDispatcher.ts | 5 ++--- .../src/server/dispatchers/pageDispatcher.ts | 5 ++--- packages/playwright-core/src/server/disposable.ts | 6 ++++++ 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/playwright-core/src/client/disposable.ts b/packages/playwright-core/src/client/disposable.ts index 1c6856834f9eb..fc6b414d5ae01 100644 --- a/packages/playwright-core/src/client/disposable.ts +++ b/packages/playwright-core/src/client/disposable.ts @@ -69,6 +69,8 @@ export class DisposableStub implements Disposable { } } -export function disposeAll(disposables: Disposable[]) { - return Promise.all(disposables.map(d => d.dispose())); +export async function disposeAll(disposables: Disposable[]) { + const copy = [...disposables]; + disposables.length = 0; + await Promise.all(copy.map(d => d.dispose())); } diff --git a/packages/playwright-core/src/mcp/browser/context.ts b/packages/playwright-core/src/mcp/browser/context.ts index c439cc3a3673f..8a768c9a5d796 100644 --- a/packages/playwright-core/src/mcp/browser/context.ts +++ b/packages/playwright-core/src/mcp/browser/context.ts @@ -89,7 +89,7 @@ export class Context { } async dispose() { - disposeAll(this._disposables); + await disposeAll(this._disposables); for (const tab of this._tabs) await tab.dispose(); this._tabs.length = 0; diff --git a/packages/playwright-core/src/mcp/browser/tab.ts b/packages/playwright-core/src/mcp/browser/tab.ts index 7e31209505196..427e159d6cc54 100644 --- a/packages/playwright-core/src/mcp/browser/tab.ts +++ b/packages/playwright-core/src/mcp/browser/tab.ts @@ -28,11 +28,13 @@ import { LogFile } from './logFile'; import { ModalState } from './tools/tool'; import { handleDialog } from './tools/dialogs'; import { uploadFile } from './tools/files'; -import type { Disposable } from '../../client/disposable'; +import { disposeAll } from '../../client/disposable'; + import type { Context } from './context'; import type { Page } from '../../client/page'; import type { Locator } from '../../client/locator'; import type { FullConfig } from './config'; +import type { Disposable } from '../../client/disposable'; const TabEvents = { modalState: 'modalState' @@ -143,9 +145,7 @@ export class Tab extends EventEmitter { } async dispose() { - for (const disposable of this._disposables) - await disposable.dispose(); - this._disposables = []; + await disposeAll(this._disposables); this._consoleLog.stop(); } diff --git a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts index 511b529e870bc..bbc9bd2146f56 100644 --- a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts @@ -37,6 +37,7 @@ import { Recorder } from '../recorder'; import { RecorderApp } from '../recorder/recorderApp'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; import { JSHandleDispatcher } from './jsHandleDispatcher'; +import { disposeAll } from '../disposable'; import type { ConsoleMessage } from '../console'; import type { Dialog } from '../dialog'; @@ -433,9 +434,7 @@ export class BrowserContextDispatcher extends Dispatcher {}); - for (const disposable of this._disposables) - disposable.dispose().catch(() => {}); - this._disposables = []; + disposeAll(this._disposables).catch(() => {}); if (this._routeWebSocketInitScript) WebSocketRouteDispatcher.uninstall(this.connection, this._context, this._routeWebSocketInitScript).catch(() => {}); this._routeWebSocketInitScript = undefined; diff --git a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts index df6fb0e7540c5..1db5d3b64530f 100644 --- a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts @@ -31,6 +31,7 @@ import { SdkObject } from '../instrumentation'; import { deserializeURLMatch, urlMatches } from '../../utils/isomorphic/urlMatch'; import { PageAgentDispatcher } from './pageAgentDispatcher'; import { Recorder } from '../recorder'; +import { disposeAll } from '../disposable'; import type { Artifact } from '../artifact'; import type { BrowserContext } from '../browserContext'; @@ -425,9 +426,7 @@ export class PageDispatcher extends Dispatcher {}); - for (const disposable of this._disposables) - disposable.dispose().catch(() => {}); - this._disposables = []; + disposeAll(this._disposables).catch(() => {}); if (this._routeWebSocketInitScript) WebSocketRouteDispatcher.uninstall(this.connection, this._page, this._routeWebSocketInitScript).catch(() => {}); this._routeWebSocketInitScript = undefined; diff --git a/packages/playwright-core/src/server/disposable.ts b/packages/playwright-core/src/server/disposable.ts index dd3a04e36a2a6..de64b8527fa75 100644 --- a/packages/playwright-core/src/server/disposable.ts +++ b/packages/playwright-core/src/server/disposable.ts @@ -33,3 +33,9 @@ export abstract class DisposableObject extends SdkObject implements Disposable { abstract dispose(): Promise; } + +export async function disposeAll(disposables: Disposable[]) { + const copy = [...disposables]; + disposables.length = 0; + await Promise.all(copy.map(d => d.dispose())); +} From e1387929c9f1a9d5943611e44615a10ffca71518 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 4 Mar 2026 16:19:51 -0800 Subject: [PATCH 2/7] chore: screencast/tracing/video size conflicts (#39512) --- .playwright/cli.config.json | 8 + docs/src/api/class-inspector.md | 16 +- intro-0.png | Bin 0 -> 9146 bytes intro-1.png | Bin 0 -> 89342 bytes intro.png | Bin 0 -> 8087 bytes log.txt | 27 + loggg.txt | 24 + packages/playwright-client/types/types.d.ts | 77 +- .../playwright-core/src/client/inspector.ts | 4 +- .../playwright-core/src/protocol/validator.ts | 4 +- .../src/server/chromium/crPage.ts | 4 +- .../src/server/dispatchers/pageDispatcher.ts | 19 +- .../src/server/firefox/ffPage.ts | 4 +- .../src/server/trace/recorder/tracing.ts | 9 +- packages/playwright-core/src/server/types.ts | 4 +- .../src/server/webkit/wkPage.ts | 4 +- packages/playwright-core/types/types.d.ts | 77 +- packages/protocol/src/channels.d.ts | 6 +- packages/protocol/src/protocol.yml | 4 +- playwright-cli.json.bcp | 10 + pw.js | 37 + screenshot.png | Bin 0 -> 17476 bytes test.js | 62 ++ tests/library/video.spec.ts | 90 +- version.js | 10 + www/0-trace.network | 0 www/0-trace.stacks | 1 + www/0-trace.trace | 410 ++++++++ ...fe731e3535d4800f737b62a-1772649748935.jpeg | Bin 0 -> 2459 bytes ...fe731e3535d4800f737b62a-1772649748946.jpeg | Bin 0 -> 2463 bytes ...aade36943ae8f9a3faa4b83739e7320107e940.txt | 59 ++ ...c92dcf2feef6b379e868c1225edd91457f68a8.txt | 221 ++++ ...73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt | 229 ++++ ...769c75a7e523a7184981be2f6ca899350ad9ff.txt | 988 ++++++++++++++++++ www/test.trace | 251 +++++ xxx.patch | 158 +++ 36 files changed, 2620 insertions(+), 197 deletions(-) create mode 100644 .playwright/cli.config.json create mode 100644 intro-0.png create mode 100644 intro-1.png create mode 100644 intro.png create mode 100644 log.txt create mode 100644 loggg.txt create mode 100644 playwright-cli.json.bcp create mode 100644 pw.js create mode 100644 screenshot.png create mode 100644 test.js create mode 100644 version.js create mode 100644 www/0-trace.network create mode 100644 www/0-trace.stacks create mode 100644 www/0-trace.trace create mode 100644 www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg create mode 100644 www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg create mode 100644 www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt create mode 100644 www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt create mode 100644 www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt create mode 100644 www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt create mode 100644 www/test.trace create mode 100644 xxx.patch 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 0000000000000000000000000000000000000000..cd0da8c99154395f18e02945d0fbd1c69c5f9372 GIT binary patch literal 9146 zcma)iWl)?=(=Ja4gainI5C|UJA$afvclTvkbc4Hlg1hS?!QI`1yX)c*bg^K&I49xx zzW2|0>(rSacXicBU(+LZ_ca}&q#%j;itrT@5)!7gl$Z(<((}qcvJ%>}Ki@zpqL)ZW zZ;+(LzNopT9j;)h#Ua{+fA@EdzD?f1H&6atJFn!C`s3LkDkH&+#l#9(r8TDIcXm4x zpJr*84Zap2`k*5$x9#oX?7Bwu^!ES}KyV3)J8jQ&*N+$6O3gCv=3cE05}V|S#G4-n zv6^qay2!5IzS)kdck77kN4`E6P;B=Zb6fRnAAgG&PGVL41L;p$cVDLeSF)8x^Z!?3 zdG+nhlk`)Z{LNqJNJx!z&qbaDB>aHSXiw65_8YW+o+RBFWCsC6l+T^tGo&Clg%=}) zNde_AkdS;UC~4nyRkYv09{D}DKX>8)stf}l5Xfz#+4$=yA_9U=f?dH2-)>>vXtI34 zFl}UqsK0uBZ{y;w4C-_SA90!Ran2sSzPRC#9WqzCE`f;(PM8WS&3`e?_fysUch5TuP9wliFR|44W< zLxgXI`?uLy%39l`d|8m8NdB#~a!`Pd4rTrh@=%YFV1uwIA)DzVXsahn{Go*X-c~*; zM8}d_G@SvS^lpSCy&4lr)3MB5yM8Vx8%3j?;sCzsuK^yI-sxXVFx_CK;=@mwNm!{1 zlJ*DZEW^1Oua(ZZ%%zk0L!BA0yehANPG2P~Rrv?O09z*wP{v)Gnd(l6Xqn5|7iPiH zQG7hJNX&i4sd#N4&gDsn_2t;|%GL$+T5+`n9>6V|qIbG~A;<)7k=Oc;{dYUq3MV6y zOeRH4l&6~pR|heEDI>6XSWk~*@$B`jf8-?(Kl$;w2jSl<5}~&(FOP!TWa}+n7EaEBKcb z-df-U_|Khdvir6g&ZBzHe>ci1V1dU3iV^Xc#eh&V%Lv0!%HQcWOO0_H?T|z-=T0JJ zwYe+o-=crLlK8`2haS$!MW&pv*iDt_uq$N1^ZpPSb;{6Soj-Q%bN`K##?K+yiZ7aYui^!zKUBTupZI~2g@~zLUiw;AVpq+=toP6$CrFCmY3FE@D z8kh<#`_%L;Ow=|-Z zZJWnn0o$TBDkzo8X%QFFr@!K%pTP$gOS5$R9Ct zbB*FtCD-*oms*;Qgdbp!Yx*px#O%%Kdc#y19Ft%{hA|@QYQN<|&0YNI=k5hjo#u%AXvNoOZb_rRsz^=<$e?70tD)mO-~? z&#IeuR3Ui<&FfAyTTS*>c{B-YSx4;9F*| ze9Etah;+QndaBqcs19bt=a<5({^Q~I(taM7&XGlv!92rE1$SIz%e@pN1W!yLXAIZH znEH@~Bv_qH29H(!5<-=jy~$#rW9KD1`mKzIh>Mn=nKF?;&|V$4KqmT?sOk*Lew=E= zbVH5e2ysMxSivihAS(@~o_gx}eP_n7pK1Yye3NqG_!s~e2AgO1`*aR5)dA@>Bhkxt-4lt;-5)W4>fRNF`stD67}W$(35;g3wenq?tI!c^h9O2Jc3y = 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

t0M14t(;&|U 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 bO?YO8uRL##|Ky&Z12WUo)z4*}Q$iB}cWcH> literal 0 HcmV?d00001 diff --git a/intro.png b/intro.png new file mode 100644 index 0000000000000000000000000000000000000000..5997d7722b06b79f9e5ce8ebab4a466b3dbc5a19 GIT binary patch literal 8087 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 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 0000000000000000000000000000000000000000..c26cac27e5787c932e314f5d7dd1b92eca5d42f2 GIT binary patch literal 17476 zcmeHv`8U=3+y1UpN@z3`(dm>V6lDyl(?lrBJcJ`5bLL@}3>DE}%2-M&b21M*L}ko8 zlZ4FkHf{EEy+3Dtzw24gAMmX2`mWOtr_$c<{TlB3y07cH?|mLzRzArdhi9b(&g)<@4_EQd|k#6jcoPWGLRnFVP%9}XY>u#?I0uQD%z)Xkde zr_xDly|v^hy@WBw5miGJen-qE$B<*_n$gDnO-+1U1u zexPYzia5?6@Wr@1V5siZmtr9n(kJr9yN}OQr|9J?%dO0c+_>49GxbbGc9ALcH|3LP z?a7Sm#a;mc0ZBMY#BsBy;o+LMj0#=nSX6CSnXbN5Js>D(SsNoGDJd!KILgSE zf)D)h>8?|!?Uzk_Q8sBzn(yBzMF#GbS-Kv!mh^)XaO&&JQGC|#*7Uw&p)&F_CgFm~ z=}KW%1NvkstLTj?=hekQe72sZri9Vw`x}^df4o`u^Lp4e(w*3VQx|T_&}lP$UxHY@ zUfigTP&qmESCZgV4}EoBZgnast!~JGzNFD#5i(dCE9bE^d%~jm?;AI)IMC39V7 z227)D%lQ+cRBzwKJ1AjCv_6?{b?Tj}8r0uX)s- zZu~_cwLrw8IVsbkMIEPN+gF|t?WjG`UC8?5;3w>BcBEzE?W@4Np*NA!Gc!(O?I)}{ zbC$>RQ(K3-o%%$^lX6w!yIQRPCrGeGd(TrNUsE*9Y z$jG+pig^08KF78X!8p^Xrqb2Jy_RJ2dmH0}6egjZA9D1?+Mi|qSk*~S+JgMO4eRC8 z5NtSw_3~SJc*rBk*}nUO-B;#XCJN{ENBs@oFXB_#g!NC_{P@&5yK%4cb)4r}jj1lD z9+|mDwbVkYwxgrtEhA^Q?kGw7@%)LR)<-Tq9`jw4)w$HTp6YMJuf?U2R0Ge&{tm1B zWc$II<<7WkiRxXB9hMd?Da<|Cfc+E}#V$NN8Q(R?dq1*h^1B#(Xv_!De zIJbf22}-P#!!TC4*X7rf;NV~zqj-f7eI!*uK|x%G2YqFJqF|<`lvS=1ktMR3Ucw~o zKK+gFYyyH6zl1c?uJ@MshsRF7Y$78b9*y=?gV`^#(ZuWs`C@kqQI z=wiE-fmM!XV`XKvl_5;eQL8dkuv9Wq%rYV>suR#*)s^Qk(k$4lFK*fXvA;5GqVU&2 zr3fyE#w*F%nVWljpC=fVJwzB;bYxlT>gsM~aB*=d+kX9!kWdQVcb?nfYSPM4Y3XHZ zhqXbrm0nw927cUI>gQ*chGgN3asF9%o<}d;sEn79O-Pp`%V%#m0?u|hKdrE{2&-f&B*!R^{V`S_ehThnp) zy`K?>%F$Apzq2Ed!>=zs!(X_`v?;8WspaXjXKF`GL-z>^j@{oM_#2mMZf-7NvNSss zOI}@EGqD3lc8~2ei-|a{t9yrOO%$hF7r<_HWjTmb^i5jYWYO~Yavu+!L$hhR_!z7E046wKhu6 z7370_e13`?N3WlfmoJXAE^?V`((oH{BA>8qKQ1fl2`rW0nq)wcjasNz6efbjFlvvC z>unAL_9L1{QD6{6O^F(msq#G(`pSgAWqWJ7ap`qQoT;S!fOq~<@kX94I!1`@6DTLV zi~}{%Zv7z|;nIW**s-j9!Z~gFvEu)p&*FPH)eZrMdAg>8joqJ*TdU5P^HV z;U_HA6O^M_uKSTlTp}O0Zg((^c2IBKV?Q_CL|*RbDcRW81zeb#no4&$te(W7c&~TM z7ap?vf)v|hg~kMx*vYfbtojQ}zy;<$B}2pB;ikmO1y@97O3~8r)p?vKaIpS%k!*!zX>vW0l*}h!`oh-A&M!V z`w9RcH2u@j7@tSp>1pg8dWq`Eho#8r=b0Qwni1UQhAj;M_LcTfZ*T8b?V{DCk(DJO z(x;c_nfCd82o=;RkGo=qPw?HsS)Xb^LD^*AxsyTO26yo#PuMrhx@UDbG1U_X25@Z4 zveYp$G8*+Ph?~zEBc2YZG305Cii$#h`RZL8X?(XsEY-3rFLU%~v`xvTUI`&k+s+(Y z8Y=;e~V98`{VD-7Ja4(>Xv14`FK-+%$`>?qvfM~e5Pay z6UpZOHb%){JpfI=%jjQNXN0)*UdJ`eUO&Vsi%NAW*|*y4N}0uXa!VZ$7ZYrGGrG>4_q}Zzk`qUMcn(^`JMkiX~4!o8d7jIu&h z7@nFPd-QIU`Z7~aJ#n1q=FT@177!4i=G`?aql)Tk!DUA!5{cywfv&74Cr{mSu8Kpk_c|&|@G`^jq4vy?i+s^LyB#I$ zetn(H=azQ7bn&8D!yBd6OY^P9K_000N)g8&1O*x3fNHM}jE;`Z)XGuL`m==`zNTH| z?s9}n-|pLibe9M*%RF$Kw8uQ23%w}8dhb-@L9K6=2XJa>X)P`;?mr*MCGB_%ConTJ zgZdWy{J9IF0Vif3Ye62%Y>{1E=mV?6C&aDEIqkDKyT{Y5?i>Z=t!0f> zU9j)SwKuJML*Zpi$@%#(PNgdUhZoa03KK8m=FOYclQg%<-WNV`!r|A~C)r(&Iua2# z!G7wLLwY=yEnU&z&nr4OLT9vuJwX z6nECYFHkxqASBDI;RcElZo2oL`1bAFfiwCUH>#;)9ZrCE6zsD+r5w*JKATI*Qg>xi{ zB=LIv6cH6=b>zHr{oB(6h5{yl%{P~x+ok!hBc1w_{so3?NLU{YBuv{o)%DN<|&(X}yur~Foi_3PK8#7MQqFYxbT zW0NvrVIJOg=-#Od-e4@lxD$b?SBR1>GJR!ZR;$~1t|{PHF6Czb^iO|bDsB(4Lo;Yg z9cu?PaYM!-3_!$}pPR-=em7dxWw}1%uLT)`C*_;g#>9Tqr8pujz?xTq*sPB7o{3KsFQO+xffP#%k(li({ADL?Pgm>xB8$)2B~E3bK9-mkV3hN;C3Ik68Lfh+XhTJhFQ*3cKYI zx9Y?$w?%H};ps`z$^cKHSD6HO$MIcV6zKo5VA8C*S8m{sMGG5JKi#AzIx!{hJ*Xa} z_R^C|e&coIZ;A#@@2^39#XNpI>7Tr9VT$223qN^f!~g_Ut+*qCx2fa^NjnwlC+&Yzy19)N6hnf`^{abF(tbljM>=obLZ{~7_` z|J;6Npqj{-I)3br_634BW0#=z!n!LNOV9mm>tF~~#ItE#E7I=)<$_MVq5bL1t- zWdpjSZOb_g$SZReShc{#+ou>ddH+?3DzrKiOTX2blaAGb95%zw;8LbQzao)$t&(X& z39*3ySrA4DmLb3dq$jL2|1LsN2Y;XV0ENi%0>a!9Ump%wE=)j{JgRcaXl$5X=xZ5J* z09R&Rd2@HxtTPgL$e*`}IzsMyB#yF>A1&&4$*2Lh=&~6UaM1uu|%eYa2w*X6NNC~{B+oqHmDls3z zrqtz)N-Rz*)vuqQ+`mEosC9S2m%VPc5Z^d#%Fl-a%2GqGZI;d;!Ew7c{{9>86)NUJ z5SeC-yfupV7){3;M$>s2rJTmyAfe8VUi{pUr(TGxFQ-eKgvX&A$0KrWN z8EaGo8#9weGs$^#vk(Wk0{8$LVl06BG(SH-)UcYSlZwpTRdscB1%(Q0$dF2*{3D%v z2)Lmw&WMVLK#8;>q9A7qXKJM3c3p9Fq#A-xg7khgZ#tZ{4>V{9wnyL3pWtA^`J*2| zx`Q?QdVq$g&ILBTC7(Zk?k;pQaBMT_-K0r%@jyu@ZabZ+c+{$;RURYU=gw~{c+7-HG@jecB+AOi#|I|L=F7?K3_B%OmFNMEKB?RKyEBotqP*18~Z@e#wR2M?GYbG-AmC-H_}YrBX)~0 zmW=Iz?-R%>*|CoeC3~a|T!-Ruu_*GtpfqKAy?0PkUVIStIA)^Tpdf9aApO<|9LJuZ z4Y9I?;E1R|^EfJ$9h6LgYwsIz*dwVF!Y*0v6#XQ8iT6)!_)Q)|@nLx5Ok!$L9({Eg zc;GPnE`crD5K)IxKtW=-&Hjc#7FZoA&aQJBG8i)X1N<7GmCUhYwkX6PRDm9O@Hip( z^l=&YHZT*V0muQ%YU36T7&YK?`KV;L1sDgZ5M`iB@7}!wZLk3QKz1Aj1qHOg^W&7? z+L&rU{`zw$Cn6{(U;6EBm(DM*ij|{J zec|Deb$9k>6BM&-hv6B&-4tbW@cq?y+Zp8XJTKmy6>0~xk{>HiOhkkfUlIPl%%Cn&Xz>EtY=cTzUEO>}t!$!RJ{4>X zaFm5G1KFnlpv&Hi(8i{-DJy_=Pa?~f=0;4b!nZ9Sg8KV(XAQU1Z4TH3`ug3li6xyU zf8c;2QZ~vTg)@MI?z!Ed1V#u3dh`1W`L>R0s}(D7+^h=cno-n-7yAA~$-h3?Pb4e6 zBVI<-Ifoj_K`taTgubY0O#$}FrxK%!P_)^Fv?Vw{Qo>0al@>-Z$|(huKm*=lp!E2C zZa?TUVG7M|L5ik!`pW;!Y*2H3Kq^55-X+9H!Jfg3z#L<@Q0lQ}U=k`NL!qWj(C&$Fh*Drm-GW0t*^c(8Dd3C=stu~t%py1v5*l7TcHRLt+b+G;bE=FTQL;zm?+c(RaKZ?p zkfM`4E=*ojS`8`FJ*Cz!X+X`%!$4APH&7H@XX4GE8d&PiTa`#ZC=ph)#<_QUx#L zURaW-?BYp*FvVMvb><7_yP4!7L`)PQjo=-#W$g{%I2H#}V*(}IEFqeT_!WYQ1HHv8 z{T+Dn@nocWO-1xk!_%qyg(aZ`u@%%WSZLBPc(f8{UKe+^b-)JFsph$;DKt*HSmNPp z?{|*S;du^Dmf=+^Xq_O+=hK(v6i4{=Vx$D!QbVt3L8}twV;$?s??|a*#^qbMB#yG3 zH?~|$oM2O83uU9KY23@jMtRXnLGAq#?IHVQpZ7!Q<>iI&(L?IHP1F_&pl>t=M}S#8_qSGVt&D+hVT;2&;d4i%$DX5okWq8i~I5i75|vS)J~{>xDT{7O$z9Dr$${|fZdZXV-iYbWB9CS8K@c!b zv1T|#ZvnX-+19ZqU8V_ru-6zgqIJA0|4R@L#fkSwU%kfO_-J7hgCYg{&)d#>)04Mw zOU(jL(J0W;H29S2Cs)5!uQ&FwztSzVTVQ|?mVbzVM(9HFdM38pIL^3gS%BW;&0K zfte`b>2q>&63qb4nVmBTGsoZG_tEBdfU!M;tT3oa4Wn?N^UE-KHO`QKfvjC3F*;cExMPwlTShiZI zdM->(T`atA+y0J^W@_!Bp*dHMflIs6roN=+4ZkNc`<9nbZRyeZL}kSzr`kds044x< zstS3j0mMxGcCD~}fis#Z?E21zptUFlT1Hna8sDOA@)5Z2j*TO;8NzqSdZmcB(p&-vYvccq|90S|qX7jr?7M^IJH^LXs^JPz4+^bm6Vt>${7 zn~0#)fdH#J5aux?5VXBEY$eY<-w80 zAuDJU5SxJ%c=(7Gik3(Fp~X-ND~Qyrr-L&0yM;s}wqxhcyF&sW*$wl3sEkv_@79Fi;wEGBshp<9o=g|%#FVoMCp_%aU z;al}&ZBEV!bRcx|ZV#c(ccAS8?!gMv_T>J`361E`9F2J`t@CJ%K|vbLulmg2>q1Wr zWTFsF0C37#$iRs%W6|Kpj~|DHY0Qox=M$O<;HXRVB0=>6(}`KlFHpBBR~$!FtbiK zeiN`iIbe6yw{I7flw|Jk<$q=gvFQbyle$yVf(}*ZK9j3IW!Y8R-)US$_4UyIr}{$H z5dzPmiD;vuVuS8@z#!Qu{~a=qs6v3_+S=M!X(ub^3Bs{M_|}~{c0?7TrLHe`RMFr{ ze3QciI_r2#f8ue(jeu+5I?DF7`|7T>(|s;pyhxz-E)Csd;HM)g`Bo^w>FMW6YMces zlMYS!qu}*2A3Zz4)Q+a_gRVj}FcfI(>3}p()BxyfN{PWU1g;=GE0}u|M1~kNCeZNP*0dwFhx35C$wGq|=(gh? z{d5)om2iJcJ)|O@N?lbreYynUQK1#HedLdmk9}Er^gmV_)wwk(=zQ&Fa>rs&2byiJ zhd}RrW>a;vYD<+8v`r1w(*k)RdYv0txFoPgT&^GYT1e9l6eP{CN-%&>Hpcnxs(O~8 zwDA(rl(%S~qNNy(2EkcA->IU}87bPPRmkhvv5t8V-CT$X6bFJ#5~LfI8W1V(qL4qo zC0*%|TWy$a(Wt%Pfg0WNC+g>z)l>Cl`1ttbJV-VPpQDSDLP$yunChU*;Af<(a^ z?Jk+5hZW}EC$jy0fQ7c%prWL(L3~?kALl~ZZ;{Oh6qS?;0ZusbRfs$G=x$6BpdjoV z3)!iL><5rl#mGpDnLxe+I;0`yD=FPJA8TV(K!;XogK}iV+p_Kzbm!QPXl`Bo!B`z5 zlONSlk4!UKP7W~oXwf1BB!djf^gl#3ULpPY=bs+|xyjkxho>4q3Jamh(qj+8v;#?F zny480{<0LjaDKIeE-P*x3n+?+i9s=#j?>YOaSVdBYb4_bhg^YH_dGcGs-~u9d(Sq{ zOVPd+DM?@!QI73q1PO=hItS-C&en#lD{@~$@ziGQ zrGKreiV`(dMrT*x>f56L8_4yYd-mr8Z1nPO=i*jTX@;>KpZ#fNOUZf;P1m6Ckkmu4 zXYgEN8o-8QcAEVK_!e5YJeYPl%dST_2HPXwvwXs20;~ZR>CrUs5khiIq1-69fV~ zMx3y7{7f(7h7wM1zAZNq%Or+(ur)aHs2WWK!RD4$jyWlb8v^%2sY~Zc1&;#K*U4%~ohnO)kMj`R@ir_^vg@VmvGn-vL4c0)P?AWn`pp|jNjKgAN5A7hA#PK)4 zs~vpGQIKI0=86!?;}9hXsL$m$F{eZ;`+YR({-LRgO45 z1RF&MV+H^cq9ut3g$x$3c>REbP(Zkc#&NTwZ8MG_`u~=Udw!KBQ zChLPp;71YVY;;#&;B(d9Tp}jQFk43O-&Mxl0yc2@Fh)b17_xy)P&>H!Ob)6M!4qJ; z>Z0~R_+yBVyd@z_{lW6J0FhwlUG0Orrtj27r$raE1_Lz9HW)p62MZ26CZ>8el)%0v z968*`*@x%P0u80(A`sva`7lS^DsUIrQ!*^pX0*N^FkRKkDdyIX~1b3b>;R$+a`3Ko9a(9 zVm|uHInMsAvv8ACFpi1xhe|ThkWh<@(S3Q^hnKMkln4#h6kH?@A5vBVd?mGDx&khY zZ_nW)N8AwsXzgbKPH{P`97lO&WMmkc~n) z71h9D5$aIrH9E5Bg|HY9LmK3TQl5u0v4n%3JXub z$zDaQq5IK}`T=K`kb=Bp+L$Qd&kL}7s|9}sg`Du^@lnYjvXIGG3|u=#uOB$0E?A}a zx9!IO7#Y22!URRqy8nLZN6a8G6r_L5SnSE{pSL1;u%{R(7)m*w-F6%;0ml? zKD6a=->k9=KZsUH3uW~LqgO(Vt2t7faE25Wb?}T^XGx^V{X-%ZFK@sKCOTvX!gQa) zw}VoEjIc+y2ZFsf0VfR`$PAH#;<-Y!QlMIaB92=bZ~z{d1xlr?F7*Y;5jHzYxt@{H z&(XFFV}DB!B77WdaqN$SK^_GP0ilYuW6Q*V0OU_l_4DxX@QDBXdi*$zVnR?>yoqSf zpczYnUy4$Mc{BaOJhcR6967Mk@t>;f`Gk8D2BuVae?2C=c}zG)LC>c1W8wkhX{#71 z$(x6M`iA8)WpskP%wzNd%HNNttgMV1pbC5zusjQrgITvvg!>5#m5>HdW^$HoIOj~X z0MgFSBc3J)BCVA%eJ3oO%C(GKsZb2N!ovTL+%0SW4m;*aNXWIHG&ESCEX}quw6(QC z31d|E%IGT;H#h->pREg_YlyBGtUcm4?1T_LcpW~jB!45uX?HOc!*j-T}4Q z6@?^GLaDhzNJmyoT%*P-;N-Jz@w>k2LQ4g5Nij+eDu@Oj!VVJz1cJ>r6k4y{g2Zqm ziX5J}yC@kEH~K0kC#Sxo*E2*=NJxll@SuCgKN_J1{b5uS*d;{$y*yxr?={%fnFODK z{d^6VuQuCFK~on)#N%K02X(p)VCmH`&Tu~RTmL(uzo4uvWGjdr8D8(u!Fu4?1_|pt zAe=0s!-yym8l;g(m&F9Vxy<3}zu$Mp_x0=7w?~>WoaPX8a{2-Y0j4c^Jo8Y3vG_N* zS(rc05ETSTSsF_4t9ByDA4+i(2IEi#d`dmb+e!XIpi>B}E~G8c`&WPeuEM)S?+%WF z5$Y)f0+NcDq70+lihnNS=7=&BE#(0FkcPa+_^gP#dzoc+mzeA9Z@>ja|etPk0u5^WdF$j+hDcmnBJ1*|ml0TUg*z{g~v)A?N_N10>?SiFcLFsA7 zgo7G|eQ(rSQYt-H#tvAtm{@nD3#6O(_i*V?c=b43xNyjGugAhvHjhWaVPoU*7#W{A zbG~`m%<82_x%RSph5Ytzj~d^bQcu#tm6eP{DRP4yT6C>+Nej2a_KT)bcFqYs$G0R* z6jCcf`V>3xEguQe+I?4^~Nyc2I4fjb#H&mjlRdLIkOVV9GT6s&}R$WZqE};wd-HVMKfcN3d% zrL%cOLiL`6rgtGI89Et75p%s2GoEgL-E-v^DC(kpW}3NI@hMgzWs>P54(8s_0QT-_h2Z3*;&d%1}vK~J{}h+9X5s=w0i^L@A zxhC?d|!XAN?z}s2dH^ngW`5j~>-;CUCSq-L};A9iOB0s8d3w zTYry1XckpO4BUhm<%=^~ta!xTapLXOW3uiYNw$xYM!6+(rPZD${%tbhj5`;gRCk8N z#%g9xH;?6457or+~|Bwn>`8J9U*bj`Llri7O<%c>(p zGuck}i5uzJv+X6_$p#%o^*$PhWF3IPv0N7E&X9AT`yu+ba;g7oL@lH zqsXjoksrUjy%+EV@ov3Ulk&2%_41cFf*Va|={102vjs8!^y#dz{LM`FG!IsFMX)o- zs~VMfTAp5H+Cn0o&Gmcy_GVo{^TTVAi3#e0OTt1zt!i7dCdT$Ru5htfXu}AZtV|U# zQj^vBD3*M#sr|$b#VE?h|Afc>t#*v z8xYb-w?!KAG7h&WDJ#D}*`K+7MC{iMlZmgb;miIZ8Rj7hNCn!^yI9ZZGAFsDT2Jd5 z@zfekck0kspTZ`WcuQat7l+^UOmYHuS6> z7Iky$(!PicygImlcc_@XS>&XD2ph)kFX^J?Q!KO&fVlB4hD7 { + 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 0000000000000000000000000000000000000000..5bd8cdbe4322396807a78dea25cda377bde50ccc GIT binary patch literal 2459 zcmeH@I}XAy42JDGp^qdbDM{&wxJU;iBsc}<;}i&S2p$VJ2?-Mw69b#Sc*!q0cD{Ix zPq6##ZVQM2m=44TY=DX)S3;zcm6SrrrYvWbZnRd7Ql{;!XKzOeTpVTS#Htjwor}p2|9L-^Bp6WmxCI}5vgY{NG!EH7Qt z6Wo5g+X5m0(t`AW0YsLKMMx^8m6B4Gc|Oy&wAPfyRCVjB+SkUo&iQ$WG1_L)ccE`X z4C5szs7IULzy{a=8(;%$fDQcFK$C7SmNy{Y literal 0 HcmV?d00001 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'; From 97be1549501c0133791d31f2fe7e2d958f6152c3 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 4 Mar 2026 17:39:28 -0800 Subject: [PATCH 3/7] chore: remove garbage added in #39512 (#39519) --- .playwright/cli.config.json | 8 - intro-0.png | Bin 9146 -> 0 bytes intro-1.png | Bin 89342 -> 0 bytes intro.png | Bin 8087 -> 0 bytes log.txt | 27 - loggg.txt | 24 - playwright-cli.json.bcp | 10 - pw.js | 37 - screenshot.png | Bin 17476 -> 0 bytes test.js | 62 -- version.js | 10 - www/0-trace.network | 0 www/0-trace.stacks | 1 - www/0-trace.trace | 410 -------- ...fe731e3535d4800f737b62a-1772649748935.jpeg | Bin 2459 -> 0 bytes ...fe731e3535d4800f737b62a-1772649748946.jpeg | Bin 2463 -> 0 bytes ...aade36943ae8f9a3faa4b83739e7320107e940.txt | 59 -- ...c92dcf2feef6b379e868c1225edd91457f68a8.txt | 221 ---- ...73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt | 229 ---- ...769c75a7e523a7184981be2f6ca899350ad9ff.txt | 988 ------------------ www/test.trace | 251 ----- xxx.patch | 158 --- 22 files changed, 2495 deletions(-) delete mode 100644 .playwright/cli.config.json delete mode 100644 intro-0.png delete mode 100644 intro-1.png delete mode 100644 intro.png delete mode 100644 log.txt delete mode 100644 loggg.txt delete mode 100644 playwright-cli.json.bcp delete mode 100644 pw.js delete mode 100644 screenshot.png delete mode 100644 test.js delete mode 100644 version.js delete mode 100644 www/0-trace.network delete mode 100644 www/0-trace.stacks delete mode 100644 www/0-trace.trace delete mode 100644 www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748935.jpeg delete mode 100644 www/resources/page@504e8ddc2fe731e3535d4800f737b62a-1772649748946.jpeg delete mode 100644 www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt delete mode 100644 www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt delete mode 100644 www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt delete mode 100644 www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt delete mode 100644 www/test.trace delete mode 100644 xxx.patch diff --git a/.playwright/cli.config.json b/.playwright/cli.config.json deleted file mode 100644 index 587f73e4f8c75..0000000000000 --- a/.playwright/cli.config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "browser": { - "browserName": "chromium", - "launchOptions": { - "channel": "chromium" - } - } -} \ No newline at end of file diff --git a/intro-0.png b/intro-0.png deleted file mode 100644 index cd0da8c99154395f18e02945d0fbd1c69c5f9372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9146 zcma)iWl)?=(=Ja4gainI5C|UJA$afvclTvkbc4Hlg1hS?!QI`1yX)c*bg^K&I49xx zzW2|0>(rSacXicBU(+LZ_ca}&q#%j;itrT@5)!7gl$Z(<((}qcvJ%>}Ki@zpqL)ZW zZ;+(LzNopT9j;)h#Ua{+fA@EdzD?f1H&6atJFn!C`s3LkDkH&+#l#9(r8TDIcXm4x zpJr*84Zap2`k*5$x9#oX?7Bwu^!ES}KyV3)J8jQ&*N+$6O3gCv=3cE05}V|S#G4-n zv6^qay2!5IzS)kdck77kN4`E6P;B=Zb6fRnAAgG&PGVL41L;p$cVDLeSF)8x^Z!?3 zdG+nhlk`)Z{LNqJNJx!z&qbaDB>aHSXiw65_8YW+o+RBFWCsC6l+T^tGo&Clg%=}) zNde_AkdS;UC~4nyRkYv09{D}DKX>8)stf}l5Xfz#+4$=yA_9U=f?dH2-)>>vXtI34 zFl}UqsK0uBZ{y;w4C-_SA90!Ran2sSzPRC#9WqzCE`f;(PM8WS&3`e?_fysUch5TuP9wliFR|44W< zLxgXI`?uLy%39l`d|8m8NdB#~a!`Pd4rTrh@=%YFV1uwIA)DzVXsahn{Go*X-c~*; zM8}d_G@SvS^lpSCy&4lr)3MB5yM8Vx8%3j?;sCzsuK^yI-sxXVFx_CK;=@mwNm!{1 zlJ*DZEW^1Oua(ZZ%%zk0L!BA0yehANPG2P~Rrv?O09z*wP{v)Gnd(l6Xqn5|7iPiH zQG7hJNX&i4sd#N4&gDsn_2t;|%GL$+T5+`n9>6V|qIbG~A;<)7k=Oc;{dYUq3MV6y zOeRH4l&6~pR|heEDI>6XSWk~*@$B`jf8-?(Kl$;w2jSl<5}~&(FOP!TWa}+n7EaEBKcb z-df-U_|Khdvir6g&ZBzHe>ci1V1dU3iV^Xc#eh&V%Lv0!%HQcWOO0_H?T|z-=T0JJ zwYe+o-=crLlK8`2haS$!MW&pv*iDt_uq$N1^ZpPSb;{6Soj-Q%bN`K##?K+yiZ7aYui^!zKUBTupZI~2g@~zLUiw;AVpq+=toP6$CrFCmY3FE@D z8kh<#`_%L;Ow=|-Z zZJWnn0o$TBDkzo8X%QFFr@!K%pTP$gOS5$R9Ct zbB*FtCD-*oms*;Qgdbp!Yx*px#O%%Kdc#y19Ft%{hA|@QYQN<|&0YNI=k5hjo#u%AXvNoOZb_rRsz^=<$e?70tD)mO-~? z&#IeuR3Ui<&FfAyTTS*>c{B-YSx4;9F*| ze9Etah;+QndaBqcs19bt=a<5({^Q~I(taM7&XGlv!92rE1$SIz%e@pN1W!yLXAIZH znEH@~Bv_qH29H(!5<-=jy~$#rW9KD1`mKzIh>Mn=nKF?;&|V$4KqmT?sOk*Lew=E= zbVH5e2ysMxSivihAS(@~o_gx}eP_n7pK1Yye3NqG_!s~e2AgO1`*aR5)dA@>Bhkxt-4lt;-5)W4>fRNF`stD67}W$(35;g3wenq?tI!c^h9O2Jc3y = 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

t0M14t(;&|U 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 bO?YO8uRL##|Ky&Z12WUo)z4*}Q$iB}cWcH> diff --git a/intro.png b/intro.png deleted file mode 100644 index 5997d7722b06b79f9e5ce8ebab4a466b3dbc5a19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8087 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 { - // 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 deleted file mode 100644 index c26cac27e5787c932e314f5d7dd1b92eca5d42f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17476 zcmeHv`8U=3+y1UpN@z3`(dm>V6lDyl(?lrBJcJ`5bLL@}3>DE}%2-M&b21M*L}ko8 zlZ4FkHf{EEy+3Dtzw24gAMmX2`mWOtr_$c<{TlB3y07cH?|mLzRzArdhi9b(&g)<@4_EQd|k#6jcoPWGLRnFVP%9}XY>u#?I0uQD%z)Xkde zr_xDly|v^hy@WBw5miGJen-qE$B<*_n$gDnO-+1U1u zexPYzia5?6@Wr@1V5siZmtr9n(kJr9yN}OQr|9J?%dO0c+_>49GxbbGc9ALcH|3LP z?a7Sm#a;mc0ZBMY#BsBy;o+LMj0#=nSX6CSnXbN5Js>D(SsNoGDJd!KILgSE zf)D)h>8?|!?Uzk_Q8sBzn(yBzMF#GbS-Kv!mh^)XaO&&JQGC|#*7Uw&p)&F_CgFm~ z=}KW%1NvkstLTj?=hekQe72sZri9Vw`x}^df4o`u^Lp4e(w*3VQx|T_&}lP$UxHY@ zUfigTP&qmESCZgV4}EoBZgnast!~JGzNFD#5i(dCE9bE^d%~jm?;AI)IMC39V7 z227)D%lQ+cRBzwKJ1AjCv_6?{b?Tj}8r0uX)s- zZu~_cwLrw8IVsbkMIEPN+gF|t?WjG`UC8?5;3w>BcBEzE?W@4Np*NA!Gc!(O?I)}{ zbC$>RQ(K3-o%%$^lX6w!yIQRPCrGeGd(TrNUsE*9Y z$jG+pig^08KF78X!8p^Xrqb2Jy_RJ2dmH0}6egjZA9D1?+Mi|qSk*~S+JgMO4eRC8 z5NtSw_3~SJc*rBk*}nUO-B;#XCJN{ENBs@oFXB_#g!NC_{P@&5yK%4cb)4r}jj1lD z9+|mDwbVkYwxgrtEhA^Q?kGw7@%)LR)<-Tq9`jw4)w$HTp6YMJuf?U2R0Ge&{tm1B zWc$II<<7WkiRxXB9hMd?Da<|Cfc+E}#V$NN8Q(R?dq1*h^1B#(Xv_!De zIJbf22}-P#!!TC4*X7rf;NV~zqj-f7eI!*uK|x%G2YqFJqF|<`lvS=1ktMR3Ucw~o zKK+gFYyyH6zl1c?uJ@MshsRF7Y$78b9*y=?gV`^#(ZuWs`C@kqQI z=wiE-fmM!XV`XKvl_5;eQL8dkuv9Wq%rYV>suR#*)s^Qk(k$4lFK*fXvA;5GqVU&2 zr3fyE#w*F%nVWljpC=fVJwzB;bYxlT>gsM~aB*=d+kX9!kWdQVcb?nfYSPM4Y3XHZ zhqXbrm0nw927cUI>gQ*chGgN3asF9%o<}d;sEn79O-Pp`%V%#m0?u|hKdrE{2&-f&B*!R^{V`S_ehThnp) zy`K?>%F$Apzq2Ed!>=zs!(X_`v?;8WspaXjXKF`GL-z>^j@{oM_#2mMZf-7NvNSss zOI}@EGqD3lc8~2ei-|a{t9yrOO%$hF7r<_HWjTmb^i5jYWYO~Yavu+!L$hhR_!z7E046wKhu6 z7370_e13`?N3WlfmoJXAE^?V`((oH{BA>8qKQ1fl2`rW0nq)wcjasNz6efbjFlvvC z>unAL_9L1{QD6{6O^F(msq#G(`pSgAWqWJ7ap`qQoT;S!fOq~<@kX94I!1`@6DTLV zi~}{%Zv7z|;nIW**s-j9!Z~gFvEu)p&*FPH)eZrMdAg>8joqJ*TdU5P^HV z;U_HA6O^M_uKSTlTp}O0Zg((^c2IBKV?Q_CL|*RbDcRW81zeb#no4&$te(W7c&~TM z7ap?vf)v|hg~kMx*vYfbtojQ}zy;<$B}2pB;ikmO1y@97O3~8r)p?vKaIpS%k!*!zX>vW0l*}h!`oh-A&M!V z`w9RcH2u@j7@tSp>1pg8dWq`Eho#8r=b0Qwni1UQhAj;M_LcTfZ*T8b?V{DCk(DJO z(x;c_nfCd82o=;RkGo=qPw?HsS)Xb^LD^*AxsyTO26yo#PuMrhx@UDbG1U_X25@Z4 zveYp$G8*+Ph?~zEBc2YZG305Cii$#h`RZL8X?(XsEY-3rFLU%~v`xvTUI`&k+s+(Y z8Y=;e~V98`{VD-7Ja4(>Xv14`FK-+%$`>?qvfM~e5Pay z6UpZOHb%){JpfI=%jjQNXN0)*UdJ`eUO&Vsi%NAW*|*y4N}0uXa!VZ$7ZYrGGrG>4_q}Zzk`qUMcn(^`JMkiX~4!o8d7jIu&h z7@nFPd-QIU`Z7~aJ#n1q=FT@177!4i=G`?aql)Tk!DUA!5{cywfv&74Cr{mSu8Kpk_c|&|@G`^jq4vy?i+s^LyB#I$ zetn(H=azQ7bn&8D!yBd6OY^P9K_000N)g8&1O*x3fNHM}jE;`Z)XGuL`m==`zNTH| z?s9}n-|pLibe9M*%RF$Kw8uQ23%w}8dhb-@L9K6=2XJa>X)P`;?mr*MCGB_%ConTJ zgZdWy{J9IF0Vif3Ye62%Y>{1E=mV?6C&aDEIqkDKyT{Y5?i>Z=t!0f> zU9j)SwKuJML*Zpi$@%#(PNgdUhZoa03KK8m=FOYclQg%<-WNV`!r|A~C)r(&Iua2# z!G7wLLwY=yEnU&z&nr4OLT9vuJwX z6nECYFHkxqASBDI;RcElZo2oL`1bAFfiwCUH>#;)9ZrCE6zsD+r5w*JKATI*Qg>xi{ zB=LIv6cH6=b>zHr{oB(6h5{yl%{P~x+ok!hBc1w_{so3?NLU{YBuv{o)%DN<|&(X}yur~Foi_3PK8#7MQqFYxbT zW0NvrVIJOg=-#Od-e4@lxD$b?SBR1>GJR!ZR;$~1t|{PHF6Czb^iO|bDsB(4Lo;Yg z9cu?PaYM!-3_!$}pPR-=em7dxWw}1%uLT)`C*_;g#>9Tqr8pujz?xTq*sPB7o{3KsFQO+xffP#%k(li({ADL?Pgm>xB8$)2B~E3bK9-mkV3hN;C3Ik68Lfh+XhTJhFQ*3cKYI zx9Y?$w?%H};ps`z$^cKHSD6HO$MIcV6zKo5VA8C*S8m{sMGG5JKi#AzIx!{hJ*Xa} z_R^C|e&coIZ;A#@@2^39#XNpI>7Tr9VT$223qN^f!~g_Ut+*qCx2fa^NjnwlC+&Yzy19)N6hnf`^{abF(tbljM>=obLZ{~7_` z|J;6Npqj{-I)3br_634BW0#=z!n!LNOV9mm>tF~~#ItE#E7I=)<$_MVq5bL1t- zWdpjSZOb_g$SZReShc{#+ou>ddH+?3DzrKiOTX2blaAGb95%zw;8LbQzao)$t&(X& z39*3ySrA4DmLb3dq$jL2|1LsN2Y;XV0ENi%0>a!9Ump%wE=)j{JgRcaXl$5X=xZ5J* z09R&Rd2@HxtTPgL$e*`}IzsMyB#yF>A1&&4$*2Lh=&~6UaM1uu|%eYa2w*X6NNC~{B+oqHmDls3z zrqtz)N-Rz*)vuqQ+`mEosC9S2m%VPc5Z^d#%Fl-a%2GqGZI;d;!Ew7c{{9>86)NUJ z5SeC-yfupV7){3;M$>s2rJTmyAfe8VUi{pUr(TGxFQ-eKgvX&A$0KrWN z8EaGo8#9weGs$^#vk(Wk0{8$LVl06BG(SH-)UcYSlZwpTRdscB1%(Q0$dF2*{3D%v z2)Lmw&WMVLK#8;>q9A7qXKJM3c3p9Fq#A-xg7khgZ#tZ{4>V{9wnyL3pWtA^`J*2| zx`Q?QdVq$g&ILBTC7(Zk?k;pQaBMT_-K0r%@jyu@ZabZ+c+{$;RURYU=gw~{c+7-HG@jecB+AOi#|I|L=F7?K3_B%OmFNMEKB?RKyEBotqP*18~Z@e#wR2M?GYbG-AmC-H_}YrBX)~0 zmW=Iz?-R%>*|CoeC3~a|T!-Ruu_*GtpfqKAy?0PkUVIStIA)^Tpdf9aApO<|9LJuZ z4Y9I?;E1R|^EfJ$9h6LgYwsIz*dwVF!Y*0v6#XQ8iT6)!_)Q)|@nLx5Ok!$L9({Eg zc;GPnE`crD5K)IxKtW=-&Hjc#7FZoA&aQJBG8i)X1N<7GmCUhYwkX6PRDm9O@Hip( z^l=&YHZT*V0muQ%YU36T7&YK?`KV;L1sDgZ5M`iB@7}!wZLk3QKz1Aj1qHOg^W&7? z+L&rU{`zw$Cn6{(U;6EBm(DM*ij|{J zec|Deb$9k>6BM&-hv6B&-4tbW@cq?y+Zp8XJTKmy6>0~xk{>HiOhkkfUlIPl%%Cn&Xz>EtY=cTzUEO>}t!$!RJ{4>X zaFm5G1KFnlpv&Hi(8i{-DJy_=Pa?~f=0;4b!nZ9Sg8KV(XAQU1Z4TH3`ug3li6xyU zf8c;2QZ~vTg)@MI?z!Ed1V#u3dh`1W`L>R0s}(D7+^h=cno-n-7yAA~$-h3?Pb4e6 zBVI<-Ifoj_K`taTgubY0O#$}FrxK%!P_)^Fv?Vw{Qo>0al@>-Z$|(huKm*=lp!E2C zZa?TUVG7M|L5ik!`pW;!Y*2H3Kq^55-X+9H!Jfg3z#L<@Q0lQ}U=k`NL!qWj(C&$Fh*Drm-GW0t*^c(8Dd3C=stu~t%py1v5*l7TcHRLt+b+G;bE=FTQL;zm?+c(RaKZ?p zkfM`4E=*ojS`8`FJ*Cz!X+X`%!$4APH&7H@XX4GE8d&PiTa`#ZC=ph)#<_QUx#L zURaW-?BYp*FvVMvb><7_yP4!7L`)PQjo=-#W$g{%I2H#}V*(}IEFqeT_!WYQ1HHv8 z{T+Dn@nocWO-1xk!_%qyg(aZ`u@%%WSZLBPc(f8{UKe+^b-)JFsph$;DKt*HSmNPp z?{|*S;du^Dmf=+^Xq_O+=hK(v6i4{=Vx$D!QbVt3L8}twV;$?s??|a*#^qbMB#yG3 zH?~|$oM2O83uU9KY23@jMtRXnLGAq#?IHVQpZ7!Q<>iI&(L?IHP1F_&pl>t=M}S#8_qSGVt&D+hVT;2&;d4i%$DX5okWq8i~I5i75|vS)J~{>xDT{7O$z9Dr$${|fZdZXV-iYbWB9CS8K@c!b zv1T|#ZvnX-+19ZqU8V_ru-6zgqIJA0|4R@L#fkSwU%kfO_-J7hgCYg{&)d#>)04Mw zOU(jL(J0W;H29S2Cs)5!uQ&FwztSzVTVQ|?mVbzVM(9HFdM38pIL^3gS%BW;&0K zfte`b>2q>&63qb4nVmBTGsoZG_tEBdfU!M;tT3oa4Wn?N^UE-KHO`QKfvjC3F*;cExMPwlTShiZI zdM->(T`atA+y0J^W@_!Bp*dHMflIs6roN=+4ZkNc`<9nbZRyeZL}kSzr`kds044x< zstS3j0mMxGcCD~}fis#Z?E21zptUFlT1Hna8sDOA@)5Z2j*TO;8NzqSdZmcB(p&-vYvccq|90S|qX7jr?7M^IJH^LXs^JPz4+^bm6Vt>${7 zn~0#)fdH#J5aux?5VXBEY$eY<-w80 zAuDJU5SxJ%c=(7Gik3(Fp~X-ND~Qyrr-L&0yM;s}wqxhcyF&sW*$wl3sEkv_@79Fi;wEGBshp<9o=g|%#FVoMCp_%aU z;al}&ZBEV!bRcx|ZV#c(ccAS8?!gMv_T>J`361E`9F2J`t@CJ%K|vbLulmg2>q1Wr zWTFsF0C37#$iRs%W6|Kpj~|DHY0Qox=M$O<;HXRVB0=>6(}`KlFHpBBR~$!FtbiK zeiN`iIbe6yw{I7flw|Jk<$q=gvFQbyle$yVf(}*ZK9j3IW!Y8R-)US$_4UyIr}{$H z5dzPmiD;vuVuS8@z#!Qu{~a=qs6v3_+S=M!X(ub^3Bs{M_|}~{c0?7TrLHe`RMFr{ ze3QciI_r2#f8ue(jeu+5I?DF7`|7T>(|s;pyhxz-E)Csd;HM)g`Bo^w>FMW6YMces zlMYS!qu}*2A3Zz4)Q+a_gRVj}FcfI(>3}p()BxyfN{PWU1g;=GE0}u|M1~kNCeZNP*0dwFhx35C$wGq|=(gh? z{d5)om2iJcJ)|O@N?lbreYynUQK1#HedLdmk9}Er^gmV_)wwk(=zQ&Fa>rs&2byiJ zhd}RrW>a;vYD<+8v`r1w(*k)RdYv0txFoPgT&^GYT1e9l6eP{CN-%&>Hpcnxs(O~8 zwDA(rl(%S~qNNy(2EkcA->IU}87bPPRmkhvv5t8V-CT$X6bFJ#5~LfI8W1V(qL4qo zC0*%|TWy$a(Wt%Pfg0WNC+g>z)l>Cl`1ttbJV-VPpQDSDLP$yunChU*;Af<(a^ z?Jk+5hZW}EC$jy0fQ7c%prWL(L3~?kALl~ZZ;{Oh6qS?;0ZusbRfs$G=x$6BpdjoV z3)!iL><5rl#mGpDnLxe+I;0`yD=FPJA8TV(K!;XogK}iV+p_Kzbm!QPXl`Bo!B`z5 zlONSlk4!UKP7W~oXwf1BB!djf^gl#3ULpPY=bs+|xyjkxho>4q3Jamh(qj+8v;#?F zny480{<0LjaDKIeE-P*x3n+?+i9s=#j?>YOaSVdBYb4_bhg^YH_dGcGs-~u9d(Sq{ zOVPd+DM?@!QI73q1PO=hItS-C&en#lD{@~$@ziGQ zrGKreiV`(dMrT*x>f56L8_4yYd-mr8Z1nPO=i*jTX@;>KpZ#fNOUZf;P1m6Ckkmu4 zXYgEN8o-8QcAEVK_!e5YJeYPl%dST_2HPXwvwXs20;~ZR>CrUs5khiIq1-69fV~ zMx3y7{7f(7h7wM1zAZNq%Or+(ur)aHs2WWK!RD4$jyWlb8v^%2sY~Zc1&;#K*U4%~ohnO)kMj`R@ir_^vg@VmvGn-vL4c0)P?AWn`pp|jNjKgAN5A7hA#PK)4 zs~vpGQIKI0=86!?;}9hXsL$m$F{eZ;`+YR({-LRgO45 z1RF&MV+H^cq9ut3g$x$3c>REbP(Zkc#&NTwZ8MG_`u~=Udw!KBQ zChLPp;71YVY;;#&;B(d9Tp}jQFk43O-&Mxl0yc2@Fh)b17_xy)P&>H!Ob)6M!4qJ; z>Z0~R_+yBVyd@z_{lW6J0FhwlUG0Orrtj27r$raE1_Lz9HW)p62MZ26CZ>8el)%0v z968*`*@x%P0u80(A`sva`7lS^DsUIrQ!*^pX0*N^FkRKkDdyIX~1b3b>;R$+a`3Ko9a(9 zVm|uHInMsAvv8ACFpi1xhe|ThkWh<@(S3Q^hnKMkln4#h6kH?@A5vBVd?mGDx&khY zZ_nW)N8AwsXzgbKPH{P`97lO&WMmkc~n) z71h9D5$aIrH9E5Bg|HY9LmK3TQl5u0v4n%3JXub z$zDaQq5IK}`T=K`kb=Bp+L$Qd&kL}7s|9}sg`Du^@lnYjvXIGG3|u=#uOB$0E?A}a zx9!IO7#Y22!URRqy8nLZN6a8G6r_L5SnSE{pSL1;u%{R(7)m*w-F6%;0ml? zKD6a=->k9=KZsUH3uW~LqgO(Vt2t7faE25Wb?}T^XGx^V{X-%ZFK@sKCOTvX!gQa) zw}VoEjIc+y2ZFsf0VfR`$PAH#;<-Y!QlMIaB92=bZ~z{d1xlr?F7*Y;5jHzYxt@{H z&(XFFV}DB!B77WdaqN$SK^_GP0ilYuW6Q*V0OU_l_4DxX@QDBXdi*$zVnR?>yoqSf zpczYnUy4$Mc{BaOJhcR6967Mk@t>;f`Gk8D2BuVae?2C=c}zG)LC>c1W8wkhX{#71 z$(x6M`iA8)WpskP%wzNd%HNNttgMV1pbC5zusjQrgITvvg!>5#m5>HdW^$HoIOj~X z0MgFSBc3J)BCVA%eJ3oO%C(GKsZb2N!ovTL+%0SW4m;*aNXWIHG&ESCEX}quw6(QC z31d|E%IGT;H#h->pREg_YlyBGtUcm4?1T_LcpW~jB!45uX?HOc!*j-T}4Q z6@?^GLaDhzNJmyoT%*P-;N-Jz@w>k2LQ4g5Nij+eDu@Oj!VVJz1cJ>r6k4y{g2Zqm ziX5J}yC@kEH~K0kC#Sxo*E2*=NJxll@SuCgKN_J1{b5uS*d;{$y*yxr?={%fnFODK z{d^6VuQuCFK~on)#N%K02X(p)VCmH`&Tu~RTmL(uzo4uvWGjdr8D8(u!Fu4?1_|pt zAe=0s!-yym8l;g(m&F9Vxy<3}zu$Mp_x0=7w?~>WoaPX8a{2-Y0j4c^Jo8Y3vG_N* zS(rc05ETSTSsF_4t9ByDA4+i(2IEi#d`dmb+e!XIpi>B}E~G8c`&WPeuEM)S?+%WF z5$Y)f0+NcDq70+lihnNS=7=&BE#(0FkcPa+_^gP#dzoc+mzeA9Z@>ja|etPk0u5^WdF$j+hDcmnBJ1*|ml0TUg*z{g~v)A?N_N10>?SiFcLFsA7 zgo7G|eQ(rSQYt-H#tvAtm{@nD3#6O(_i*V?c=b43xNyjGugAhvHjhWaVPoU*7#W{A zbG~`m%<82_x%RSph5Ytzj~d^bQcu#tm6eP{DRP4yT6C>+Nej2a_KT)bcFqYs$G0R* z6jCcf`V>3xEguQe+I?4^~Nyc2I4fjb#H&mjlRdLIkOVV9GT6s&}R$WZqE};wd-HVMKfcN3d% zrL%cOLiL`6rgtGI89Et75p%s2GoEgL-E-v^DC(kpW}3NI@hMgzWs>P54(8s_0QT-_h2Z3*;&d%1}vK~J{}h+9X5s=w0i^L@A zxhC?d|!XAN?z}s2dH^ngW`5j~>-;CUCSq-L};A9iOB0s8d3w zTYry1XckpO4BUhm<%=^~ta!xTapLXOW3uiYNw$xYM!6+(rPZD${%tbhj5`;gRCk8N z#%g9xH;?6457or+~|Bwn>`8J9U*bj`Llri7O<%c>(p zGuck}i5uzJv+X6_$p#%o^*$PhWF3IPv0N7E&X9AT`yu+ba;g7oL@lH zqsXjoksrUjy%+EV@ov3Ulk&2%_41cFf*Va|={102vjs8!^y#dz{LM`FG!IsFMX)o- zs~VMfTAp5H+Cn0o&Gmcy_GVo{^TTVAi3#e0OTt1zt!i7dCdT$Ru5htfXu}AZtV|U# zQj^vBD3*M#sr|$b#VE?h|Afc>t#*v z8xYb-w?!KAG7h&WDJ#D}*`K+7MC{iMlZmgb;miIZ8Rj7hNCn!^yI9ZZGAFsDT2Jd5 z@zfekck0kspTZ`WcuQat7l+^UOmYHuS6> z7Iky$(!PicygImlcc_@XS>&XD2ph)kFX^J?Q!KO&fVlB4hD7 { - 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/version.js b/version.js deleted file mode 100644 index 3c631168604d6..0000000000000 --- a/version.js +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/www/0-trace.stacks b/www/0-trace.stacks deleted file mode 100644 index 9dc4624aa2a8e..0000000000000 --- a/www/0-trace.stacks +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 73eac38efda75..0000000000000 --- a/www/0-trace.trace +++ /dev/null @@ -1,410 +0,0 @@ -{"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 deleted file mode 100644 index 5bd8cdbe4322396807a78dea25cda377bde50ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2459 zcmeH@I}XAy42JDGp^qdbDM{&wxJU;iBsc}<;}i&S2p$VJ2?-Mw69b#Sc*!q0cD{Ix zPq6##ZVQM2m=44TY=DX)S3;zcm6SrrrYvWbZnRd7Ql{;!XKzOeTpVTS#Htjwor}p2|9L-^Bp6WmxCI}5vgY{NG!EH7Qt z6Wo5g+X5m0(t`AW0YsLKMMx^8m6B4Gc|Oy&wAPfyRCVjB+SkUo&iQ$WG1_L)ccE`X z4C5szs7IULzy{a=8(;%$fDQcFK$C7SmNy{Y diff --git a/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt b/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt deleted file mode 100644 index e2af8fd019b7c..0000000000000 --- a/www/resources/src@24aade36943ae8f9a3faa4b83739e7320107e940.txt +++ /dev/null @@ -1,59 +0,0 @@ -/** - * 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 deleted file mode 100644 index 670b583b326bc..0000000000000 --- a/www/resources/src@6cc92dcf2feef6b379e868c1225edd91457f68a8.txt +++ /dev/null @@ -1,221 +0,0 @@ -/** - * 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 deleted file mode 100644 index b712f9ef8167d..0000000000000 --- a/www/resources/src@9c73c3c17d11bb78ec4db2600b4ce9ce2e35a790.txt +++ /dev/null @@ -1,229 +0,0 @@ -/** - * 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 deleted file mode 100644 index 641317aa00cb6..0000000000000 --- a/www/resources/src@d5769c75a7e523a7184981be2f6ca899350ad9ff.txt +++ /dev/null @@ -1,988 +0,0 @@ -/** - * 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 deleted file mode 100644 index 64eb9e368f8f4..0000000000000 --- a/www/test.trace +++ /dev/null @@ -1,251 +0,0 @@ -{"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 deleted file mode 100644 index 585c9b0179e56..0000000000000 --- a/xxx.patch +++ /dev/null @@ -1,158 +0,0 @@ -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'; From 3c8c457b85e211f30dd15f343aa7213dc50ab18b Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 4 Mar 2026 17:39:51 -0800 Subject: [PATCH 4/7] chore(mcp): fix PLAYWRIGHT_MCP_ALLOWED_HOSTS name (#39521) --- packages/playwright-core/src/mcp/browser/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-core/src/mcp/browser/config.ts b/packages/playwright-core/src/mcp/browser/config.ts index 88e5b1bec3a81..6c3792e0c4f68 100644 --- a/packages/playwright-core/src/mcp/browser/config.ts +++ b/packages/playwright-core/src/mcp/browser/config.ts @@ -316,7 +316,7 @@ export function configFromCLIOptions(cliOptions: CLIOptions): Config & { configF export function configFromEnv(): Config & { configFile?: string } { const options: CLIOptions = {}; - options.allowedHosts = commaSeparatedList(process.env.PLAYWRIGHT_MCP_ALLOWED_HOSTNAMES); + options.allowedHosts = commaSeparatedList(process.env.PLAYWRIGHT_MCP_ALLOWED_HOSTS); options.allowedOrigins = semicolonSeparatedList(process.env.PLAYWRIGHT_MCP_ALLOWED_ORIGINS); options.allowUnrestrictedFileAccess = envToBoolean(process.env.PLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESS); options.blockedOrigins = semicolonSeparatedList(process.env.PLAYWRIGHT_MCP_BLOCKED_ORIGINS); From 1a9c7e63d6501f22d6df2a26aa122468b9cf1a16 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 4 Mar 2026 18:38:29 -0800 Subject: [PATCH 5/7] chore: introduce screencast listener (#39520) --- .../src/server/chromium/crPage.ts | 2 +- .../src/server/devtoolsController.ts | 21 +++---- .../src/server/dispatchers/pageDispatcher.ts | 30 +++++----- .../src/server/firefox/ffPage.ts | 2 +- packages/playwright-core/src/server/page.ts | 2 - .../playwright-core/src/server/screencast.ts | 56 ++++++++++--------- .../src/server/trace/recorder/tracing.ts | 50 +++++++++-------- .../src/server/webkit/wkPage.ts | 2 +- tests/library/tracing.spec.ts | 2 +- tests/library/video.spec.ts | 8 +-- 10 files changed, 90 insertions(+), 85 deletions(-) diff --git a/packages/playwright-core/src/server/chromium/crPage.ts b/packages/playwright-core/src/server/chromium/crPage.ts index c6d80f63d5e06..9f56a3b9e5717 100644 --- a/packages/playwright-core/src/server/chromium/crPage.ts +++ b/packages/playwright-core/src/server/chromium/crPage.ts @@ -886,7 +886,7 @@ class FrameSession { this._client._sendMayFail('Page.screencastFrameAck', { sessionId: payload.sessionId }); }); const buffer = Buffer.from(payload.data, 'base64'); - this._page.emit(Page.Events.ScreencastFrame, { + this._page.screencast.onScreencastFrame({ buffer, frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1000 : Date.now(), viewportWidth: payload.metadata.deviceWidth, diff --git a/packages/playwright-core/src/server/devtoolsController.ts b/packages/playwright-core/src/server/devtoolsController.ts index 0a85d3498d577..ed431eea0ae76 100644 --- a/packages/playwright-core/src/server/devtoolsController.ts +++ b/packages/playwright-core/src/server/devtoolsController.ts @@ -28,6 +28,7 @@ import type { RegisteredListener } from '../utils'; import type { Transport } from './utils/httpServer'; import type { CRBrowser } from './chromium/crBrowser'; import type { ElementInfo } from '@recorder/recorderTypes'; +import type { ScreencastListener } from './screencast'; import type { DevToolsChannel, DevToolsChannelEvents, Tab } from '@devtools/devtoolsChannel'; export class DevToolsController { @@ -68,7 +69,7 @@ class DevToolsConnection implements Transport, DevToolsChannel { selectedPage: Page | null = null; private _lastFrameData: string | null = null; private _lastViewportSize: { width: number, height: number } | null = null; - private _pageListeners: RegisteredListener[] = []; + private _screencastFrameListener: ScreencastListener | null = null; private _contextListeners: RegisteredListener[] = []; private _recorderListeners: RegisteredListener[] = []; private _context: BrowserContext; @@ -240,9 +241,8 @@ class DevToolsConnection implements Transport, DevToolsChannel { return; if (this.selectedPage) { - eventsHelper.removeEventListeners(this._pageListeners); - this._pageListeners = []; - await this.selectedPage.screencast.stopScreencast(this); + await this.selectedPage.screencast.stopScreencast(this._screencastFrameListener!); + this._screencastFrameListener = null; } this.selectedPage = page; @@ -250,11 +250,8 @@ class DevToolsConnection implements Transport, DevToolsChannel { this._lastViewportSize = null; this._sendTabList(); - this._pageListeners.push( - eventsHelper.addEventListener(page, Page.Events.ScreencastFrame, frame => this._writeFrame(frame.buffer, frame.width, frame.height)) - ); - - await page.screencast.startScreencast(this, { width: 1280, height: 800, quality: 90 }); + this._screencastFrameListener = frame => this._writeFrame(frame.buffer, frame.viewportWidth, frame.viewportHeight); + await page.screencast.startScreencast(this._screencastFrameListener, { width: 1280, height: 800, quality: 90 }); } private async _deselectPage() { @@ -262,9 +259,9 @@ class DevToolsConnection implements Transport, DevToolsChannel { return; const promises = []; promises.push(this._cancelPicking()); - eventsHelper.removeEventListeners(this._pageListeners); - this._pageListeners = []; - promises.push(this.selectedPage.screencast.stopScreencast(this)); + const screencastFrameListener = this._screencastFrameListener!; + this._screencastFrameListener = null; + promises.push(this.selectedPage.screencast.stopScreencast(screencastFrameListener)); this.selectedPage = null; this._lastFrameData = null; this._lastViewportSize = null; diff --git a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts index 5cdd38b83eac1..14bd1b0aa0412 100644 --- a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts @@ -30,7 +30,6 @@ 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,7 +47,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'; +import type { ScreencastListener } from '../screencast'; export class PageDispatcher extends Dispatcher implements channels.PageChannel { _type_EventTarget = true; @@ -63,7 +62,7 @@ export class PageDispatcher extends Dispatcher(); private _jsCoverageActive = false; private _cssCoverageActive = false; - private _screencastFrameListener: RegisteredListener | null = null; + private _screencastListener: ScreencastListener | null = null; static from(parentScope: BrowserContextDispatcher, page: Page): PageDispatcher { return PageDispatcher.fromNullable(parentScope, page)!; @@ -366,21 +365,24 @@ export class PageDispatcher extends Dispatcher { - if (this._screencastFrameListener) + if (this._screencastListener) 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._screencastListener = (frame: ScreencastFrame) => { this._dispatchEvent('screencastFrame', { data: frame.buffer }); - }); - await this._page.screencast.startScreencast(this, { quality: 90, width: size.width, height: size.height }); + }; + await this._page.screencast.startScreencast(this._screencastListener, { 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); + await this._stopScreencast(); + } + + private async _stopScreencast() { + const listener = this._screencastListener; + this._screencastListener = null; + if (listener) + await this._page.screencast.stopScreencast(listener); } async videoStart(params: channels.PageVideoStartParams, progress: Progress): Promise { @@ -450,9 +452,7 @@ export class PageDispatcher extends Dispatcher {}); this._cssCoverageActive = false; - if (this._screencastFrameListener) - eventsHelper.removeEventListeners([this._screencastFrameListener]); - this._screencastFrameListener = null; + this._stopScreencast().catch(() => {}); } 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 ac82272e8de18..ef3f39119044e 100644 --- a/packages/playwright-core/src/server/firefox/ffPage.ts +++ b/packages/playwright-core/src/server/firefox/ffPage.ts @@ -490,7 +490,7 @@ export class FFPage implements PageDelegate { }); const buffer = Buffer.from(event.data, 'base64'); - this._page.emit(Page.Events.ScreencastFrame, { + this._page.screencast.onScreencastFrame({ buffer, frameSwapWallTime: event.timestamp * 1000, // timestamp is in seconds, we need to convert to milliseconds. viewportWidth: event.deviceWidth, diff --git a/packages/playwright-core/src/server/page.ts b/packages/playwright-core/src/server/page.ts index 51a91df429bee..95cd244ebb996 100644 --- a/packages/playwright-core/src/server/page.ts +++ b/packages/playwright-core/src/server/page.ts @@ -131,7 +131,6 @@ const PageEvent = { FrameDetached: 'framedetached', InternalFrameNavigatedToNewDocument: 'internalframenavigatedtonewdocument', LocatorHandlerTriggered: 'locatorhandlertriggered', - ScreencastFrame: 'screencastframe', WebSocket: 'websocket', Worker: 'worker', } as const; @@ -146,7 +145,6 @@ export type PageEventMap = { [PageEvent.FrameDetached]: [frame: frames.Frame]; [PageEvent.InternalFrameNavigatedToNewDocument]: [frame: frames.Frame]; [PageEvent.LocatorHandlerTriggered]: [uid: number]; - [PageEvent.ScreencastFrame]: [frame: types.ScreencastFrame]; [PageEvent.WebSocket]: [webSocket: network.WebSocket]; [PageEvent.Worker]: [worker: Worker]; }; diff --git a/packages/playwright-core/src/server/screencast.ts b/packages/playwright-core/src/server/screencast.ts index 42c6f446408f6..6e59e42d6a358 100644 --- a/packages/playwright-core/src/server/screencast.ts +++ b/packages/playwright-core/src/server/screencast.ts @@ -15,7 +15,7 @@ */ import path from 'path'; -import { assert, createGuid, eventsHelper, RegisteredListener } from '../utils'; +import { assert, createGuid } from '../utils'; import { debugLogger } from '../utils'; import { VideoRecorder } from './videoRecorder'; import { Page } from './page'; @@ -24,17 +24,19 @@ import { validateVideoSize } from './browserContext'; import type * as types from './types'; +export type ScreencastListener = (frame: types.ScreencastFrame) => void; + export class Screencast { private _page: Page; private _videoRecorder: VideoRecorder | null = null; private _videoId: string | null = null; - private _screencastClients = new Set(); + private _listeners = new Set(); private _screencastOptions: { width: number, height: number, quality: number } | null = null; // Aiming at 25 fps by default - each frame is 40ms, but we give some slack with 35ms. // When throttling for tracing, 200ms between frames, except for 10 frames around the action. private _frameThrottler = new FrameThrottler(10, 35, 200); - private _frameListener: RegisteredListener | null = null; + private _videoFrameListener: ScreencastListener | null = null; constructor(page: Page) { this._page = page; @@ -44,9 +46,16 @@ export class Screencast { this._frameThrottler.dispose(); } - setOptions(options: { width: number, height: number, quality: number } | null) { - this._setOptions(options).catch(e => debugLogger.log('error', e)); - this._frameThrottler.setThrottlingEnabled(!!options); + startForTracing(listener: ScreencastListener) { + // If screencast is already running, use the same options, it's ok for tracing. + const options = this._screencastOptions || { width: 800, height: 800, quality: 90 }; + this.startScreencast(listener, options).catch(e => debugLogger.log('error', e)); + this._frameThrottler.setThrottlingEnabled(true); + } + + stopForTracing(listener: ScreencastListener) { + this.stopScreencast(listener).catch(e => debugLogger.log('error', e)); + this._frameThrottler.setThrottlingEnabled(false); } throttleFrameAck(ack: () => void) { @@ -81,7 +90,7 @@ export class Screencast { }; this._videoRecorder = new VideoRecorder(ffmpegPath, videoOptions); - this._frameListener = eventsHelper.addEventListener(this._page, Page.Events.ScreencastFrame, frame => this._videoRecorder!.writeFrame(frame.buffer, frame.frameSwapWallTime / 1000)); + this._videoFrameListener = frame => this._videoRecorder!.writeFrame(frame.buffer, frame.frameSwapWallTime / 1000); this._page.waitForInitializedOrError().then(p => { if (p instanceof Error) this.stopVideoRecording().catch(() => {}); @@ -93,7 +102,7 @@ export class Screencast { const videoId = this._videoId; assert(videoId); this._page.once(Page.Events.Close, () => this.stopVideoRecording().catch(() => {})); - await this.startScreencast(this._videoRecorder, { + await this.startScreencast(this._videoFrameListener!, { quality: 90, width: options.width, height: options.height, @@ -104,14 +113,13 @@ export class Screencast { async stopVideoRecording(): Promise { if (!this._videoId) return; - if (this._frameListener) - eventsHelper.removeEventListeners([this._frameListener]); - this._frameListener = null; + const videoFrameListener = this._videoFrameListener!; + this._videoFrameListener = null; const videoId = this._videoId; this._videoId = null; const videoRecorder = this._videoRecorder!; this._videoRecorder = null; - await this.stopScreencast(videoRecorder); + await this.stopScreencast(videoFrameListener); await videoRecorder.stop(); // Keep the video artifact in the map until encoding is fully finished, if the context // starts closing before the video is fully written to disk it will wait for it. @@ -133,20 +141,13 @@ export class Screencast { await this.stopVideoRecording(); } - private async _setOptions(options: { width: number, height: number, quality: number } | null): Promise { - if (options) - await this.startScreencast(this, options); - else - await this.stopScreencast(this); - } - - async startScreencast(client: unknown, options: { width: number, height: number, quality: number }) { + async startScreencast(listener: ScreencastListener, options: { width: number, height: number, quality: number }) { if (this._screencastOptions) { if (options.width !== this._screencastOptions.width || options.height !== this._screencastOptions.height || options.quality !== this._screencastOptions.quality) throw new Error(`Screencast is already running with different options (${this._screencastOptions.width}x${this._screencastOptions.height} quality=${this._screencastOptions.quality})`); } - this._screencastClients.add(client); - if (this._screencastClients.size === 1) { + this._listeners.add(listener); + if (this._listeners.size === 1) { this._screencastOptions = options; await this._page.delegate.startScreencast({ width: options.width, @@ -156,13 +157,18 @@ export class Screencast { } } - async stopScreencast(client: unknown) { - this._screencastClients.delete(client); - if (!this._screencastClients.size) { + async stopScreencast(listener: ScreencastListener) { + this._listeners.delete(listener); + if (!this._listeners.size) { this._screencastOptions = null; await this._page.delegate.stopScreencast(); } } + + onScreencastFrame(frame: types.ScreencastFrame) { + for (const listener of this._listeners) + listener(frame); + } } class FrameThrottler { diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index a79a85efb1560..93d9ce5817fe6 100644 --- a/packages/playwright-core/src/server/trace/recorder/tracing.ts +++ b/packages/playwright-core/src/server/trace/recorder/tracing.ts @@ -50,6 +50,7 @@ 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'; +import type { ScreencastListener } from '../../screencast'; const version: trace.VERSION = 8; @@ -75,13 +76,12 @@ type RecordingState = { groupStack: string[]; }; -const kScreencastOptions = { width: 800, height: 600, quality: 90 }; - export class Tracing extends SdkObject implements InstrumentationListener, SnapshotterDelegate, HarTracerDelegate { private _fs = new SerializedFS(); private _snapshotter?: Snapshotter; private _harTracer: HarTracer; private _screencastListeners: RegisteredListener[] = []; + private _pageScreencastListeners = new Map(); private _eventListeners: RegisteredListener[] = []; private _context: BrowserContext | APIRequestContext; // Note: state should only be touched inside API methods, but not inside trace operations. @@ -281,8 +281,13 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps eventsHelper.removeEventListeners(this._screencastListeners); if (!(this._context instanceof BrowserContext)) return; - for (const page of this._context.pages()) - page.screencast.setOptions(null); + for (const page of this._context.pages()) { + const listener = this._pageScreencastListeners.get(page); + if (listener) { + page.screencast.stopForTracing(listener); + this._pageScreencastListeners.delete(page); + } + } } private _allocateNewTraceFile(state: RecordingState) { @@ -593,26 +598,25 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps } private _startScreencastInPage(page: Page) { - page.screencast.setOptions(kScreencastOptions); const prefix = page.guid; - this._screencastListeners.push( - 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.viewportWidth, - height: params.viewportHeight, - timestamp: monotonicTime(), - frameSwapWallTime: params.frameSwapWallTime, - }; - // Make sure to write the screencast frame before adding a reference to it. - this._appendResource(sha1, params.buffer); - this._appendTraceEvent(event); - }), - ); + const listener = (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.viewportWidth, + height: params.viewportHeight, + timestamp: monotonicTime(), + frameSwapWallTime: params.frameSwapWallTime, + }; + // Make sure to write the screencast frame before adding a reference to it. + this._appendResource(sha1, params.buffer); + this._appendTraceEvent(event); + }; + this._pageScreencastListeners.set(page, listener); + page.screencast.startForTracing(listener); } private _appendTraceEvent(event: trace.TraceEvent) { diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 1dc976039a329..a2c848e72010e 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -947,7 +947,7 @@ export class WKPage implements PageDelegate { this._pageProxySession.sendMayFail('Screencast.screencastFrameAck', { generation }); }); const buffer = Buffer.from(event.data, 'base64'); - this._page.emit(Page.Events.ScreencastFrame, { + this._page.screencast.onScreencastFrame({ buffer, frameSwapWallTime: event.timestamp // timestamp is in seconds, we need to convert to milliseconds. diff --git a/tests/library/tracing.spec.ts b/tests/library/tracing.spec.ts index 72e3966af0cc8..7dc0771616a57 100644 --- a/tests/library/tracing.spec.ts +++ b/tests/library/tracing.spec.ts @@ -436,7 +436,7 @@ for (const params of [ browserTest.fixme(params.id === 'fit' && browserName === 'webkit' && platform === 'linux', 'Image size is flaky'); browserTest.fixme(browserName === 'firefox' && !headless, 'Image size is different'); - const scale = Math.min(800 / params.width, 600 / params.height, 1); + const scale = Math.min(800 / params.width, 800 / params.height, 1); const previewWidth = params.width * scale; const previewHeight = params.height * scale; diff --git a/tests/library/video.spec.ts b/tests/library/video.spec.ts index 59d45bf2e96d5..da6ddf7a8e91f 100644 --- a/tests/library/video.spec.ts +++ b/tests/library/video.spec.ts @@ -812,7 +812,7 @@ it.describe('screencast', () => { }); it('video.start/stop twice', async ({ browser }, testInfo) => { - const size = { width: 800, height: 600 }; + const size = { width: 800, height: 800 }; const context = await browser.newContext({ viewport: size }); const page = await context.newPage(); @@ -868,10 +868,10 @@ it.describe('screencast', () => { await context.close(); }); - it('video.start should finish when page is closed', async ({ browser, browserName }, testInfo) => { + it('video.start should finish when page is closed', async ({ browser }, testInfo) => { const context = await browser.newContext(); const page = await context.newPage(); - await page.video().start({ size: { width: 800, height: 600 } }); + await page.video().start({ size: { width: 800, height: 800 } }); await page.evaluate(() => document.body.style.backgroundColor = 'red'); await rafraf(page, 100); const videoPath = await page.video().path(); @@ -886,7 +886,7 @@ it.describe('screencast', () => { }); it('empty video', async ({ browser }, testInfo) => { - const size = { width: 800, height: 600 }; + const size = { width: 800, height: 800 }; const context = await browser.newContext({ viewport: size }); const page = await context.newPage(); await page.video().start({ size }); From 7a01f2e20ce5480d9713e0bfe672abc997651db1 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 4 Mar 2026 19:22:59 -0800 Subject: [PATCH 6/7] fix(cli): isolate sockets by users (#39518) --- packages/playwright-core/src/cli/client/devtoolsApp.ts | 8 +++++--- packages/playwright-core/src/cli/client/program.ts | 10 +++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/playwright-core/src/cli/client/devtoolsApp.ts b/packages/playwright-core/src/cli/client/devtoolsApp.ts index 4143302b324d2..b479cd9d85037 100644 --- a/packages/playwright-core/src/cli/client/devtoolsApp.ts +++ b/packages/playwright-core/src/cli/client/devtoolsApp.ts @@ -19,11 +19,12 @@ import path from 'path'; import os from 'os'; import net from 'net'; + import { chromium } from '../../..'; import { HttpServer } from '../../server/utils/httpServer'; import { gracefullyProcessExitDoNotHang } from '../../server/utils/processLauncher'; import { findChromiumChannelBestEffort, registryDirectory } from '../../server/registry/index'; - +import { calculateSha1 } from '../../utils'; import { createClientInfo, Registry } from './registry'; import { Session } from './session'; @@ -213,9 +214,10 @@ function socketsDirectory() { } function devtoolsSocketPath() { + const userNameHash = calculateSha1(process.env.USERNAME || 'default').slice(0, 8); return process.platform === 'win32' - ? `\\\\.\\pipe\\playwright-devtools-${process.env.USERNAME || 'default'}` - : path.join(socketsDirectory(), 'devtools.sock'); + ? `\\\\.\\pipe\\playwright-devtools-${userNameHash}` + : path.join(socketsDirectory(), `devtools-${userNameHash}.sock`); } async function acquireSingleton(): Promise { diff --git a/packages/playwright-core/src/cli/client/program.ts b/packages/playwright-core/src/cli/client/program.ts index 2eff9ad027c99..5b10e82ae6a06 100644 --- a/packages/playwright-core/src/cli/client/program.ts +++ b/packages/playwright-core/src/cli/client/program.ts @@ -19,6 +19,7 @@ import { execSync, spawn } from 'child_process'; +import crypto from 'crypto'; import fs from 'fs'; import os from 'os'; import path from 'path'; @@ -298,7 +299,8 @@ async function findOrInstallDefaultBrowser() { } function daemonSocketPath(clientInfo: ClientInfo, sessionName: string): string { - const socketName = `${sessionName}.sock`; + const userNameHash = calculateSha1(process.env.USERNAME || 'default').slice(0, 8); + const socketName = `${sessionName}-${userNameHash}.sock`; if (os.platform() === 'win32') return `\\\\.\\pipe\\${clientInfo.workspaceDirHash}-${socketName}`; const socketsDir = process.env.PLAYWRIGHT_DAEMON_SOCKETS_DIR || path.join(os.tmpdir(), 'playwright-cli'); @@ -442,3 +444,9 @@ async function renderSessionStatus(clientInfo: ClientInfo, session: Session) { text.push(...renderResolvedConfig(config.resolvedConfig)); return text.join('\n'); } + +export function calculateSha1(buffer: Buffer | string): string { + const hash = crypto.createHash('sha1'); + hash.update(buffer); + return hash.digest('hex'); +} From 23d98999a9745d6f6333718cf8d1be2e8f777234 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 4 Mar 2026 19:23:34 -0800 Subject: [PATCH 7/7] chore(mcp): extract serving config (#39523) --- .../src/cli/daemon/commands.ts | 2 +- .../playwright-core/src/cli/daemon/daemon.ts | 31 +++---- .../playwright-core/src/cli/daemon/program.ts | 20 ++++- .../src/mcp/browser/browserContextFactory.ts | 10 ++- .../src/mcp/browser/browserServerBackend.ts | 16 ++-- .../playwright-core/src/mcp/browser/config.ts | 70 +--------------- .../src/mcp/browser/context.ts | 82 +++++++++++++++---- .../src/mcp/browser/response.ts | 9 +- .../src/mcp/browser/sessionLog.ts | 9 +- .../playwright-core/src/mcp/browser/tab.ts | 25 +++--- .../playwright-core/src/mcp/browser/tools.ts | 6 +- .../src/mcp/browser/tools/install.ts | 60 -------------- packages/playwright-core/src/mcp/exports.ts | 7 +- packages/playwright-core/src/mcp/program.ts | 16 ++++ .../playwright/src/mcp/test/browserBackend.ts | 18 ++-- tests/mcp/capabilities.spec.ts | 1 - tests/mcp/generator.spec.ts | 1 - tests/mcp/install.spec.ts | 26 ------ 18 files changed, 161 insertions(+), 248 deletions(-) delete mode 100644 packages/playwright-core/src/mcp/browser/tools/install.ts delete mode 100644 tests/mcp/install.spec.ts diff --git a/packages/playwright-core/src/cli/daemon/commands.ts b/packages/playwright-core/src/cli/daemon/commands.ts index 9a289fa35d236..2065cc1d9366c 100644 --- a/packages/playwright-core/src/cli/daemon/commands.ts +++ b/packages/playwright-core/src/cli/daemon/commands.ts @@ -875,7 +875,7 @@ const installBrowser = declareCommand({ ['only-shell']: z.boolean().optional().describe('Only install headless shell when installing Chromium'), ['no-shell']: z.boolean().optional().describe('Do not install Chromium headless shell'), }), - toolName: 'browser_install', + toolName: '', toolParams: () => ({}), }); diff --git a/packages/playwright-core/src/cli/daemon/daemon.ts b/packages/playwright-core/src/cli/daemon/daemon.ts index 89a25504a660a..d77a1d5940966 100644 --- a/packages/playwright-core/src/cli/daemon/daemon.ts +++ b/packages/playwright-core/src/cli/daemon/daemon.ts @@ -30,9 +30,8 @@ import { SocketConnection } from '../client/socketConnection'; import { commands } from './commands'; import { parseCommand } from './command'; +import type * as playwright from '../../..'; import type * as mcp from '../../mcp/exports'; -import type { FullConfig } from '../../mcp/browser/config'; -import type { BrowserContextFactory } from '../../mcp/browser/browserContextFactory'; import type { SessionConfig } from '../client/registry'; const daemonDebug = debug('pw:daemon'); @@ -48,9 +47,9 @@ async function socketExists(socketPath: string): Promise { } export async function startMcpDaemonServer( - mcpConfig: FullConfig, + config: mcp.ContextConfig, sessionConfig: SessionConfig, - contextFactory: BrowserContextFactory, + browserContext: playwright.BrowserContext, noShutdown?: boolean, ): Promise<() => Promise> { const { socketPath } = sessionConfig; @@ -65,18 +64,6 @@ export async function startMcpDaemonServer( } } - const cwd = url.pathToFileURL(process.cwd()).href; - const clientInfo = { - name: 'playwright-cli', - version: sessionConfig.version, - roots: [{ - uri: cwd, - name: 'cwd' - }], - timestamp: Date.now(), - }; - - const browserContext = mcpConfig.browser.isolated ? await contextFactory.createContext(clientInfo) : (await contextFactory.contexts(clientInfo))[0]; if (!noShutdown) { browserContext.on('close', () => { daemonDebug('browser closed, shutting down daemon'); @@ -84,8 +71,16 @@ export async function startMcpDaemonServer( }); } - const backend = new BrowserServerBackend(mcpConfig, browserContext, browserTools); - await backend.initialize(clientInfo); + const backend = new BrowserServerBackend(config, browserContext, browserTools); + await backend.initialize({ + name: 'playwright-cli', + version: sessionConfig.version, + roots: [{ + uri: url.pathToFileURL(process.cwd()).href, + name: 'cwd', + }], + timestamp: Date.now(), + }); await fs.mkdir(path.dirname(socketPath), { recursive: true }); diff --git a/packages/playwright-core/src/cli/daemon/program.ts b/packages/playwright-core/src/cli/daemon/program.ts index 0b261b1cdb333..e79269b1d9de0 100644 --- a/packages/playwright-core/src/cli/daemon/program.ts +++ b/packages/playwright-core/src/cli/daemon/program.ts @@ -17,6 +17,7 @@ /* eslint-disable no-console */ import fs from 'fs'; +import url from 'url'; import { startMcpDaemonServer } from './daemon'; import { setupExitWatchdog } from '../../mcp/browser/watchdog'; @@ -38,13 +39,26 @@ export function decorateCLICommand(command: Command, version: string) { setupExitWatchdog(); const sessionConfig = await fs.promises.readFile(options.daemonSession, 'utf-8').then(data => JSON.parse(data) as SessionConfig); + + const cwd = url.pathToFileURL(process.cwd()).href; + const clientInfo = { + name: 'playwright-cli', + version: sessionConfig.version, + roots: [{ + uri: cwd, + name: 'cwd' + }], + timestamp: Date.now(), + }; + const mcpConfig = await resolveCLIConfig(sessionConfig); - const browserContextFactory = contextFactory(mcpConfig); const extensionContextFactory = new ExtensionContextFactory(mcpConfig.browser.launchOptions.channel || 'chrome', mcpConfig.browser.userDataDir, mcpConfig.browser.launchOptions.executablePath); - + const browserContextFactory = contextFactory(mcpConfig); const cf = mcpConfig.extension ? extensionContextFactory : browserContextFactory; + try { - await startMcpDaemonServer(mcpConfig, sessionConfig, cf); + const browserContext = mcpConfig.browser.isolated ? await cf.createContext(clientInfo) : (await cf.contexts(clientInfo))[0]; + await startMcpDaemonServer(mcpConfig, sessionConfig, browserContext); console.log(`### Config`); console.log('```json'); console.log(JSON.stringify(mcpConfig, null, 2)); diff --git a/packages/playwright-core/src/mcp/browser/browserContextFactory.ts b/packages/playwright-core/src/mcp/browser/browserContextFactory.ts index c3c9bc6ea8a29..4f4c620562c54 100644 --- a/packages/playwright-core/src/mcp/browser/browserContextFactory.ts +++ b/packages/playwright-core/src/mcp/browser/browserContextFactory.ts @@ -23,7 +23,7 @@ import * as playwright from '../../..'; import { registryDirectory } from '../../server/registry/index'; import { startTraceViewerServer } from '../../server'; import { testDebug } from '../log'; -import { outputDir, outputFile } from './config'; +import { outputDir, outputFile } from './context'; import { firstRootPath } from '../sdk/server'; import type { FullConfig } from './config'; @@ -255,13 +255,15 @@ function createHash(data: string): string { } async function computeTracesDir(config: FullConfig, clientInfo: ClientInfo): Promise { - return path.resolve(outputDir(config, clientInfo), 'traces'); + const cwd = firstRootPath(clientInfo); + return path.resolve(outputDir({ config, cwd }), 'traces'); } async function browserContextOptionsFromConfig(config: FullConfig, clientInfo: ClientInfo): Promise { const result = { ...config.browser.contextOptions }; if (config.saveVideo) { - const dir = await outputFile(config, clientInfo, `videos`, { origin: 'code' }); + const cwd = firstRootPath(clientInfo); + const dir = await outputFile({ config, cwd }, `videos`, { origin: 'code' }); result.recordVideo = { dir, size: config.saveVideo, @@ -310,5 +312,5 @@ function throwBrowserIsNotInstalledError(config: FullConfig): never { if (config.skillMode) throw new Error(`Browser "${channel}" is not installed. Run \`playwright-cli install-browser ${channel}\` to install`); else - throw new Error(`Browser "${channel}" is not installed. Either install it (likely) or change the config.`); + throw new Error(`Browser "${channel}" is not installed. Run \`npx @playwright/mcp install-browser ${channel}\` to install`); } diff --git a/packages/playwright-core/src/mcp/browser/browserServerBackend.ts b/packages/playwright-core/src/mcp/browser/browserServerBackend.ts index a8b158eab4280..5b005d5a0c21e 100644 --- a/packages/playwright-core/src/mcp/browser/browserServerBackend.ts +++ b/packages/playwright-core/src/mcp/browser/browserServerBackend.ts @@ -14,37 +14,39 @@ * limitations under the License. */ -import { FullConfig } from './config'; import { Context } from './context'; import { Response } from './response'; import { SessionLog } from './sessionLog'; import { toMcpTool } from '../sdk/tool'; import { logUnhandledError } from '../log'; +import { firstRootPath } from '../sdk/server'; +import type { ContextConfig } from './context'; import type * as playwright from '../../..'; import type { Tool } from './tools/tool'; import type * as mcpServer from '../sdk/server'; -import type { ServerBackend } from '../sdk/server'; +import type { ClientInfo, ServerBackend } from '../sdk/server'; export class BrowserServerBackend implements ServerBackend { private _tools: Tool[]; private _context: Context | undefined; private _sessionLog: SessionLog | undefined; - private _config: FullConfig; + private _config: ContextConfig; readonly browserContext: playwright.BrowserContext; - constructor(config: FullConfig, browserContext: playwright.BrowserContext, tools: Tool[]) { + constructor(config: ContextConfig, browserContext: playwright.BrowserContext, tools: Tool[]) { this._config = config; this._tools = tools; this.browserContext = browserContext; } - async initialize(clientInfo: mcpServer.ClientInfo): Promise { - this._sessionLog = this._config.saveSession ? await SessionLog.create(this._config, clientInfo) : undefined; + async initialize(clientInfo: ClientInfo): Promise { + const cwd = firstRootPath(clientInfo); + this._sessionLog = this._config.saveSession ? await SessionLog.create(this._config, cwd) : undefined; this._context = new Context(this.browserContext, { config: this._config, sessionLog: this._sessionLog, - clientInfo, + cwd, }); } diff --git a/packages/playwright-core/src/mcp/browser/config.ts b/packages/playwright-core/src/mcp/browser/config.ts index 6c3792e0c4f68..639a5f8b2a188 100644 --- a/packages/playwright-core/src/mcp/browser/config.ts +++ b/packages/playwright-core/src/mcp/browser/config.ts @@ -16,18 +16,15 @@ import fs from 'fs'; import os from 'os'; -import path from 'path'; import { registry } from '../../server'; import { devices } from '../../..'; -import { dotenv, debug } from '../../utilsBundle'; +import { dotenv } from '../../utilsBundle'; import { configFromIniFile } from './configIni'; -import { firstRootPath } from '../sdk/server'; import type * as playwright from '../../..'; import type { Config, ToolCapability } from '../config'; -import type { ClientInfo } from '../sdk/server'; async function fileExistsAsync(resolved: string) { try { return (await fs.promises.stat(resolved)).isFile(); } catch { return false; } @@ -93,19 +90,7 @@ export const defaultConfig: FullConfig = { }, isolated: false, }, - console: { - level: 'info', - }, - network: { - allowedOrigins: undefined, - blockedOrigins: undefined, - }, server: {}, - saveTrace: false, - snapshot: { - mode: 'incremental', - output: 'stdout', - }, timeouts: { action: 5000, navigation: 60000, @@ -122,21 +107,7 @@ export type FullConfig = Config & { contextOptions: NonNullable; isolated: boolean; }, - console: { - level: 'error' | 'warning' | 'info' | 'debug'; - }, - network: NonNullable, - saveTrace: boolean; server: NonNullable, - snapshot: { - mode: 'incremental' | 'full' | 'none'; - output: 'stdout' | 'file'; - }, - timeouts: { - action: number; - navigation: number; - expect: number; - }, skillMode?: boolean; configFile?: string; }; @@ -378,45 +349,6 @@ export async function loadConfig(configFile: string | undefined): Promise { - const workspace = perCallWorkspaceDir ?? workspaceDir(clientInfo); - const resolvedName = path.resolve(workspace, fileName); - await checkFile(config, clientInfo, resolvedName, { origin: 'code' }); - return resolvedName; -} - -export function outputDir(config: FullConfig, clientInfo: ClientInfo): string { - if (config.outputDir) - return path.resolve(config.outputDir); - return path.resolve(firstRootPath(clientInfo), config.skillMode ? '.playwright-cli' : '.playwright-mcp'); -} - -export async function outputFile(config: FullConfig, clientInfo: ClientInfo, fileName: string, options: { origin: 'code' | 'llm' }): Promise { - const resolvedFile = path.resolve(outputDir(config, clientInfo), fileName); - await checkFile(config, clientInfo, resolvedFile, options); - await fs.promises.mkdir(path.dirname(resolvedFile), { recursive: true }); - debug('pw:mcp:file')(resolvedFile); - return resolvedFile; -} - -async function checkFile(config: FullConfig, clientInfo: ClientInfo, resolvedFilename: string, options: { origin: 'code' | 'llm' }) { - // Trust code. - if (options.origin === 'code') - return; - - // Trust llm to use valid characters in file names. - const output = outputDir(config, clientInfo); - const workspace = workspaceDir(clientInfo); - if (!resolvedFilename.startsWith(output) && !resolvedFilename.startsWith(workspace)) - throw new Error(`Resolved file path ${resolvedFilename} is outside of the output directory ${output} and workspace directory ${workspace}. Use relative file names to stay within the output directory.`); -} - function pickDefined(obj: T | undefined): Partial { return Object.fromEntries( Object.entries(obj ?? {}).filter(([_, v]) => v !== undefined) diff --git a/packages/playwright-core/src/mcp/browser/context.ts b/packages/playwright-core/src/mcp/browser/context.ts index 8a768c9a5d796..8f0a40755cdca 100644 --- a/packages/playwright-core/src/mcp/browser/context.ts +++ b/packages/playwright-core/src/mcp/browser/context.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import fs from 'fs'; import path from 'path'; import { disposeAll } from '../../client/disposable'; @@ -23,23 +24,42 @@ import { escapeWithQuotes } from '../../utils/isomorphic/stringUtils'; import { selectors } from '../../..'; import { Tab } from './tab'; -import { outputFile, workspaceFile } from './config'; -import { allRootPaths, firstRootPath } from '../sdk/server'; import type * as playwright from '../../..'; -import type { FullConfig } from './config'; import type { SessionLog } from './sessionLog'; import type { Tracing } from '../../client/tracing'; import type { Disposable } from '../../client/disposable'; import type { BrowserContext } from '../../client/browserContext'; -import type { ClientInfo } from '../sdk/server'; +import type { Config } from '../config.d.ts'; const testDebug = debug('pw:mcp:test'); +export type ContextConfig = Pick & { + browser?: { + initScript?: string[]; + initPage?: string[]; + }; + skillMode?: boolean; + }; + type ContextOptions = { - config: FullConfig; - sessionLog: SessionLog | undefined; - clientInfo: ClientInfo; + config: ContextConfig; + sessionLog?: SessionLog; + cwd: string; }; export type RouteEntry = { @@ -62,14 +82,13 @@ export type FilenameTemplate = { type VideoParams = NonNullable[0]>; export class Context { - readonly config: FullConfig; + readonly config: ContextConfig; readonly sessionLog: SessionLog | undefined; readonly options: ContextOptions; private _rawBrowserContext: playwright.BrowserContext; private _browserContextPromise: Promise | undefined; private _tabs: Tab[] = []; private _currentTab: Tab | undefined; - private _clientInfo: ClientInfo; private _routes: RouteEntry[] = []; private _video: { allVideos: Set; @@ -84,7 +103,6 @@ export class Context { this.sessionLog = options.sessionLog; this.options = options; this._rawBrowserContext = browserContext; - this._clientInfo = options.clientInfo; testDebug('create context'); } @@ -144,12 +162,12 @@ export class Context { } async workspaceFile(fileName: string, perCallWorkspaceDir: string | undefined): Promise { - return await workspaceFile(this.config, this._clientInfo, fileName, perCallWorkspaceDir); + return await workspaceFile(this.options, fileName, perCallWorkspaceDir); } async outputFile(template: FilenameTemplate, options: { origin: 'code' | 'llm' }): Promise { const baseName = template.suggestedFilename || `${template.prefix}-${(template.date ?? new Date()).toISOString().replace(/[:.]/g, '-')}${template.ext ? '.' + template.ext : ''}`; - return await outputFile(this.config, this._clientInfo, baseName, options); + return await outputFile(this.options, baseName, options); } async startVideoRecording(params: VideoParams) { @@ -261,7 +279,7 @@ export class Context { const browserContext = this._rawBrowserContext; if (!this.config.allowUnrestrictedFileAccess) { (browserContext as any)._setAllowedProtocols(['http:', 'https:', 'about:', 'data:']); - (browserContext as any)._setAllowedDirectories(allRootPaths(this._clientInfo)); + (browserContext as any)._setAllowedDirectories([this.options.cwd]); } await this._setupRequestInterception(browserContext); @@ -278,9 +296,8 @@ export class Context { }, }); } - const rootPath = firstRootPath(this._clientInfo); - for (const initScript of this.config.browser.initScript || []) - this._disposables.push(await browserContext.addInitScript({ path: path.resolve(rootPath, initScript) })); + for (const initScript of this.config.browser?.initScript || []) + this._disposables.push(await browserContext.addInitScript({ path: path.resolve(this.options.cwd, initScript) })); for (const page of browserContext.pages()) this._onPageCreated(page); @@ -315,3 +332,36 @@ function originOrHostGlob(originOrHost: string) { // Support for legacy host-only mode. return `*://${originOrHost}/**`; } + +export async function workspaceFile(options: ContextOptions, fileName: string, perCallWorkspaceDir?: string): Promise { + const workspace = perCallWorkspaceDir ?? options.cwd; + const resolvedName = path.resolve(workspace, fileName); + await checkFile(options, resolvedName, { origin: 'code' }); + return resolvedName; +} + +export function outputDir(options: ContextOptions): string { + if (options.config.outputDir) + return path.resolve(options.config.outputDir); + return path.resolve(options.cwd, options.config.skillMode ? '.playwright-cli' : '.playwright-mcp'); +} + +export async function outputFile(options: ContextOptions, fileName: string, flags: { origin: 'code' | 'llm' }): Promise { + const resolvedFile = path.resolve(outputDir(options), fileName); + await checkFile(options, resolvedFile, flags); + await fs.promises.mkdir(path.dirname(resolvedFile), { recursive: true }); + debug('pw:mcp:file')(resolvedFile); + return resolvedFile; +} + +async function checkFile(options: ContextOptions, resolvedFilename: string, flags: { origin: 'code' | 'llm' }) { + // Trust code. + if (flags.origin === 'code') + return; + + // Trust llm to use valid characters in file names. + const output = outputDir(options); + const workspace = options.cwd; + if (!resolvedFilename.startsWith(output) && !resolvedFilename.startsWith(workspace)) + throw new Error(`Resolved file path ${resolvedFilename} is outside of the output directory ${output} and workspace directory ${workspace}. Use relative file names to stay within the output directory.`); +} diff --git a/packages/playwright-core/src/mcp/browser/response.ts b/packages/playwright-core/src/mcp/browser/response.ts index aef12159245ad..e15f6ba8f2661 100644 --- a/packages/playwright-core/src/mcp/browser/response.ts +++ b/packages/playwright-core/src/mcp/browser/response.ts @@ -20,7 +20,6 @@ import path from 'path'; import { debug } from '../../utilsBundle'; import { renderModalStates, shouldIncludeMessage } from './tab'; import { scaleImageToFitMessage } from './tools/screenshot'; -import { firstRootPath } from '../sdk/server'; import type { TabHeader } from './tab'; import type { CallToolResult, ImageContent, TextContent } from '@modelcontextprotocol/sdk/types.js'; @@ -59,7 +58,7 @@ export class Response { this._context = context; this.toolName = toolName; this.toolArgs = toolArgs; - this._clientWorkspace = relativeTo ?? firstRootPath(context.options.clientInfo); + this._clientWorkspace = relativeTo ?? context.options.cwd; } private _computRelativeTo(fileName: string): string { @@ -120,7 +119,7 @@ export class Response { } setIncludeSnapshot() { - this._includeSnapshot = this._context.config.snapshot.mode; + this._includeSnapshot = this._context.config.snapshot?.mode || 'incremental'; } setIncludeFullSnapshot(includeSnapshotFileName?: string) { @@ -222,8 +221,8 @@ export class Response { text.push(`- New console entries: ${tabSnapshot.consoleLink}`); if (tabSnapshot?.events.filter(event => event.type !== 'request').length) { for (const event of tabSnapshot.events) { - if (event.type === 'console' && this._context.config.outputMode !== 'file' && this._context.config.snapshot.mode !== 'none') { - if (shouldIncludeMessage(this._context.config.console.level, event.message.type)) + if (event.type === 'console' && this._context.config.outputMode !== 'file' && this._context.config.snapshot?.mode !== 'none') { + if (shouldIncludeMessage(this._context.config.console?.level, event.message.type)) text.push(`- ${trimMiddle(event.message.toString(), 100)}`); } else if (event.type === 'download-start') { text.push(`- Downloading file ${event.download.download.suggestedFilename()} ...`); diff --git a/packages/playwright-core/src/mcp/browser/sessionLog.ts b/packages/playwright-core/src/mcp/browser/sessionLog.ts index 8edae8fd02c89..8e213031d270b 100644 --- a/packages/playwright-core/src/mcp/browser/sessionLog.ts +++ b/packages/playwright-core/src/mcp/browser/sessionLog.ts @@ -17,11 +17,10 @@ import fs from 'fs'; import path from 'path'; -import { outputFile } from './config'; +import { outputFile } from './context'; import { parseResponse } from './response'; -import type { FullConfig } from './config'; -import type * as mcpServer from '../sdk/server'; +import type { ContextConfig } from './context'; export class SessionLog { private _folder: string; @@ -33,8 +32,8 @@ export class SessionLog { this._file = path.join(this._folder, 'session.md'); } - static async create(config: FullConfig, clientInfo: mcpServer.ClientInfo): Promise { - const sessionFolder = await outputFile(config, clientInfo, `session-${Date.now()}`, { origin: 'code' }); + static async create(config: ContextConfig, cwd: string): Promise { + const sessionFolder = await outputFile({ config, cwd }, `session-${Date.now()}`, { origin: 'code' }); await fs.promises.mkdir(sessionFolder, { recursive: true }); // eslint-disable-next-line no-console console.error(`Session: ${sessionFolder}`); diff --git a/packages/playwright-core/src/mcp/browser/tab.ts b/packages/playwright-core/src/mcp/browser/tab.ts index 427e159d6cc54..4a8cc2b72d83d 100644 --- a/packages/playwright-core/src/mcp/browser/tab.ts +++ b/packages/playwright-core/src/mcp/browser/tab.ts @@ -30,11 +30,10 @@ import { handleDialog } from './tools/dialogs'; import { uploadFile } from './tools/files'; import { disposeAll } from '../../client/disposable'; -import type { Context } from './context'; +import type { Disposable } from '../../client/disposable'; +import type { Context, ContextConfig } from './context'; import type { Page } from '../../client/page'; import type { Locator } from '../../client/locator'; -import type { FullConfig } from './config'; -import type { Disposable } from '../../client/disposable'; const TabEvents = { modalState: 'modalState' @@ -105,9 +104,9 @@ export class Tab extends EventEmitter { private _recentEventEntries: EventEntry[] = []; private _consoleLog: LogFile; private _disposables: Disposable[]; - readonly actionTimeoutOptions: { timeout: number; }; - readonly navigationTimeoutOptions: { timeout: number; }; - readonly expectTimeoutOptions: { timeout: number; }; + readonly actionTimeoutOptions: { timeout?: number; }; + readonly navigationTimeoutOptions: { timeout?: number; }; + readonly expectTimeoutOptions: { timeout?: number; }; constructor(context: Context, page: playwright.Page, onPageClose: (tab: Tab) => void) { super(); @@ -139,9 +138,9 @@ export class Tab extends EventEmitter { const wallTime = Date.now(); this._consoleLog = new LogFile(this.context, wallTime, 'console', 'Console'); this._initializedPromise = this._initialize(); - this.actionTimeoutOptions = { timeout: context.config.timeouts.action }; - this.navigationTimeoutOptions = { timeout: context.config.timeouts.navigation }; - this.expectTimeoutOptions = { timeout: context.config.timeouts.expect }; + this.actionTimeoutOptions = { timeout: context.config.timeouts?.action }; + this.navigationTimeoutOptions = { timeout: context.config.timeouts?.navigation }; + this.expectTimeoutOptions = { timeout: context.config.timeouts?.expect }; } async dispose() { @@ -170,7 +169,7 @@ export class Tab extends EventEmitter { const requests = await this.page.requests().catch(() => []); for (const request of requests.filter(r => r.existingResponse() || r.failure())) this._requests.push(request); - for (const initPage of this.context.config.browser.initPage || []) { + for (const initPage of this.context.config.browser?.initPage || []) { try { const { default: func } = await import(url.pathToFileURL(initPage).href); await func({ page: this.page }); @@ -496,7 +495,7 @@ function pageErrorToConsoleMessage(errorOrValue: Error | any): ConsoleMessage { }; } -export function renderModalStates(config: FullConfig, modalStates: ModalState[]): string[] { +export function renderModalStates(config: ContextConfig, modalStates: ModalState[]): string[] { const result: string[] = []; if (modalStates.length === 0) result.push('- There is no modal state present'); @@ -509,9 +508,9 @@ type ConsoleMessageType = ReturnType; type ConsoleMessageLevel = 'error' | 'warning' | 'info' | 'debug'; const consoleMessageLevels: ConsoleMessageLevel[] = ['error', 'warning', 'info', 'debug']; -export function shouldIncludeMessage(thresholdLevel: ConsoleMessageLevel, type: ConsoleMessageType): boolean { +export function shouldIncludeMessage(thresholdLevel: ConsoleMessageLevel | undefined, type: ConsoleMessageType): boolean { const messageLevel = consoleLevelForMessageType(type); - return consoleMessageLevels.indexOf(messageLevel) <= consoleMessageLevels.indexOf(thresholdLevel); + return consoleMessageLevels.indexOf(messageLevel) <= consoleMessageLevels.indexOf(thresholdLevel || 'info'); } function consoleLevelForMessageType(type: ConsoleMessageType): ConsoleMessageLevel { diff --git a/packages/playwright-core/src/mcp/browser/tools.ts b/packages/playwright-core/src/mcp/browser/tools.ts index cae0bf3267740..eea07dc6b5d72 100644 --- a/packages/playwright-core/src/mcp/browser/tools.ts +++ b/packages/playwright-core/src/mcp/browser/tools.ts @@ -23,7 +23,6 @@ import dialogs from './tools/dialogs'; import evaluate from './tools/evaluate'; import files from './tools/files'; import form from './tools/form'; -import install from './tools/install'; import keyboard from './tools/keyboard'; import mouse from './tools/mouse'; import navigate from './tools/navigate'; @@ -42,7 +41,7 @@ import wait from './tools/wait'; import webstorage from './tools/webstorage'; import type { Tool } from './tools/tool'; -import type { FullConfig } from './config'; +import type { ContextConfig } from './context'; export const browserTools: Tool[] = [ ...common, @@ -54,7 +53,6 @@ export const browserTools: Tool[] = [ ...evaluate, ...files, ...form, - ...install, ...keyboard, ...mouse, ...navigate, @@ -73,6 +71,6 @@ export const browserTools: Tool[] = [ ...webstorage, ]; -export function filteredTools(config: FullConfig) { +export function filteredTools(config: Pick) { return browserTools.filter(tool => tool.capability.startsWith('core') || config.capabilities?.includes(tool.capability)).filter(tool => !tool.skillOnly); } diff --git a/packages/playwright-core/src/mcp/browser/tools/install.ts b/packages/playwright-core/src/mcp/browser/tools/install.ts deleted file mode 100644 index 00a66635efe35..0000000000000 --- a/packages/playwright-core/src/mcp/browser/tools/install.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * 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 { fork } from 'child_process'; -import path from 'path'; - -import { z } from '../../../mcpBundle'; -import { defineTool } from './tool'; -import { renderTabsMarkdown } from '../response'; - -const install = defineTool({ - capability: 'core-install', - schema: { - name: 'browser_install', - title: 'Install the browser specified in the config', - description: 'Install the browser specified in the config. Call this if you get an error about the browser not being installed.', - inputSchema: z.object({}), - type: 'action', - }, - - handle: async (context, params, response) => { - const channel = context.config.browser?.launchOptions?.channel ?? context.config.browser?.browserName ?? 'chrome'; - const cliPath = path.join(require.resolve('playwright-core/package.json'), '../cli.js'); - const child = fork(cliPath, ['install', channel], { - stdio: 'pipe', - }); - const output: string[] = []; - child.stdout?.on('data', data => output.push(data.toString())); - child.stderr?.on('data', data => output.push(data.toString())); - await new Promise((resolve, reject) => { - child.on('close', code => { - if (code === 0) - resolve(); - else - reject(new Error(`Failed to install browser: ${output.join('')}`)); - }); - }); - response.addTextResult(`Browser ${channel} installed.`); - const tabHeaders = await Promise.all(context.tabs().map(tab => tab.headerSnapshot())); - const result = renderTabsMarkdown(tabHeaders); - response.addTextResult(result.join('\n')); - }, -}); - -export default [ - install, -]; diff --git a/packages/playwright-core/src/mcp/exports.ts b/packages/playwright-core/src/mcp/exports.ts index 1e9b6bb529a3a..16b84f6c6e273 100644 --- a/packages/playwright-core/src/mcp/exports.ts +++ b/packages/playwright-core/src/mcp/exports.ts @@ -17,19 +17,14 @@ // SDK export * from './sdk/server'; export * from './sdk/tool'; -export * from './sdk/http'; export { browserTools } from './browser/tools'; export { BrowserServerBackend } from './browser/browserServerBackend'; -export { contextFactory, identityBrowserContextFactory } from './browser/browserContextFactory'; -export { defaultConfig, resolveConfig } from './browser/config'; export { parseResponse } from './browser/response'; export { Tab } from './browser/tab'; export { setupExitWatchdog } from './browser/watchdog'; -export type { BrowserContextFactory } from './browser/browserContextFactory'; -export type { FullConfig } from './browser/config'; export type { Tool as BrowserTool } from './browser/tools/tool'; export { logUnhandledError } from './log'; -export type { Config, ToolCapability } from './config'; +export type { ContextConfig } from './browser/context'; export { startMcpDaemonServer } from '../cli/daemon/daemon'; export { sessionConfigFromArgs } from '../cli/client/program'; export { createClientInfo } from '../cli/client/registry'; diff --git a/packages/playwright-core/src/mcp/program.ts b/packages/playwright-core/src/mcp/program.ts index d043d50d005a4..1ec90c6653412 100644 --- a/packages/playwright-core/src/mcp/program.ts +++ b/packages/playwright-core/src/mcp/program.ts @@ -140,3 +140,19 @@ export function decorateMCPCommand(command: Command, version: string) { await mcpServer.start(factory, config.server); }); } + +export function decorateMCPInstallBrowserCommand(command: Command, version: string) { + command + .description('ensure browsers necessary for this version of Playwright are installed') + .option('--with-deps', 'install system dependencies for browsers') + .option('--dry-run', 'do not execute installation, only print information') + .option('--list', 'prints list of browsers from all playwright installations') + .option('--force', 'force reinstall of already installed browsers') + .option('--only-shell', 'only install headless shell when installing chromium') + .option('--no-shell', 'do not install chromium headless shell') + .action(async options => { + const { program } = require('../program'); + const argv = process.argv.map(arg => arg === 'install-browser' ? 'install' : arg); + program.parse(argv); + }); +} diff --git a/packages/playwright/src/mcp/test/browserBackend.ts b/packages/playwright/src/mcp/test/browserBackend.ts index 7368f493e41ed..12b698f274cd7 100644 --- a/packages/playwright/src/mcp/test/browserBackend.ts +++ b/packages/playwright/src/mcp/test/browserBackend.ts @@ -18,7 +18,7 @@ import path from 'path'; import fs from 'fs'; import { createGuid } from 'playwright-core/lib/utils'; import * as mcp from 'playwright-core/lib/mcp/exports'; -import { defaultConfig, BrowserServerBackend, Tab, identityBrowserContextFactory, startMcpDaemonServer, sessionConfigFromArgs, createClientInfo } from 'playwright-core/lib/mcp/exports'; +import { BrowserServerBackend } from 'playwright-core/lib/mcp/exports'; import { stripAnsiEscapes } from '../../util'; @@ -46,7 +46,7 @@ export function createCustomMessageHandler(testInfo: TestInfoImpl, context: play if (data.initialize) { if (backend) throw new Error('MCP backend is already initialized'); - const config: mcp.FullConfig = { ...defaultConfig, capabilities: ['testing'] }; + const config: mcp.ContextConfig = { capabilities: ['testing'] }; const tools = mcp.filteredTools(config); backend = new BrowserServerBackend(config, context, tools); await backend.initialize(data.initialize.clientInfo); @@ -97,7 +97,7 @@ async function generatePausedMessage(testInfo: TestInfoImpl, context: playwright `- Page Title: ${await page.title()}`.trim() ); // Only print console errors when pausing on error, not when everything works as expected. - let console = testInfo.errors.length ? await Tab.collectConsoleMessages(page) : []; + let console = testInfo.errors.length ? await mcp.Tab.collectConsoleMessages(page) : []; console = console.filter(msg => msg.type === 'error'); if (console.length) { lines.push('- Console Messages:'); @@ -125,17 +125,17 @@ export async function runDaemonForContext(testInfo: TestInfoImpl, context: playw const outputDir = path.join(testInfo.artifactsDir(), '.playwright-mcp'); const sessionName = `test-worker-${createGuid().slice(0, 6)}`; - const clientInfo = createClientInfo(); - const sessionConfig = sessionConfigFromArgs(clientInfo, sessionName, { _: [] }); + const clientInfo = mcp.createClientInfo(); + const sessionConfig = mcp.sessionConfigFromArgs(clientInfo, sessionName, { _: [] }); const sessionConfigFile = path.resolve(clientInfo.daemonProfilesDir, `${sessionName}.session`); await fs.promises.mkdir(path.dirname(sessionConfigFile), { recursive: true }); await fs.promises.writeFile(sessionConfigFile, JSON.stringify(sessionConfig, null, 2)); - await startMcpDaemonServer({ - ...defaultConfig, + + await mcp.startMcpDaemonServer({ outputMode: 'file', - snapshot: { mode: 'full', output: 'file' }, + snapshot: { mode: 'full' }, outputDir, - }, sessionConfig, identityBrowserContextFactory(context), true /* noShutdown */); + }, sessionConfig, context, true /* noShutdown */); const lines = ['']; if (testInfo.errors.length) { diff --git a/tests/mcp/capabilities.spec.ts b/tests/mcp/capabilities.spec.ts index b5272a0ea395a..2ab5c44af6123 100644 --- a/tests/mcp/capabilities.spec.ts +++ b/tests/mcp/capabilities.spec.ts @@ -30,7 +30,6 @@ test('test snapshot tool list', async ({ client }) => { 'browser_select_option', 'browser_type', 'browser_close', - 'browser_install', 'browser_navigate_back', 'browser_navigate', 'browser_network_requests', diff --git a/tests/mcp/generator.spec.ts b/tests/mcp/generator.spec.ts index 9e593fd0ff28e..81bac70222380 100644 --- a/tests/mcp/generator.spec.ts +++ b/tests/mcp/generator.spec.ts @@ -38,7 +38,6 @@ test('generator tools intent', async ({ startClient }) => { expect(toolsWithIntent).toContain('browser_fill_form'); expect(toolsWithIntent).toContain('browser_handle_dialog'); expect(toolsWithIntent).toContain('browser_hover'); - expect(toolsWithIntent).toContain('browser_install'); expect(toolsWithIntent).toContain('browser_mouse_click_xy'); expect(toolsWithIntent).toContain('browser_mouse_drag_xy'); expect(toolsWithIntent).toContain('browser_mouse_move_xy'); diff --git a/tests/mcp/install.spec.ts b/tests/mcp/install.spec.ts deleted file mode 100644 index feb8081225c05..0000000000000 --- a/tests/mcp/install.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 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, expect } from './fixtures'; - -test('browser_install', async ({ client, mcpBrowser }) => { - test.skip(mcpBrowser !== 'chromium', 'Test only chromium'); - expect(await client.callTool({ - name: 'browser_install', - })).toHaveResponse({ - result: expect.stringContaining(`No open tabs`), - }); -});