Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Cannot run Playwright UI after npm init playwright@latest on WSL2 #34187

Open
RERepos opened this issue Jan 1, 2025 · 7 comments · May be fixed by #34203
Open

[Bug]: Cannot run Playwright UI after npm init playwright@latest on WSL2 #34187

RERepos opened this issue Jan 1, 2025 · 7 comments · May be fixed by #34203
Assignees
Labels

Comments

@RERepos
Copy link

RERepos commented Jan 1, 2025

Version

1.49.1

Steps to reproduce

Follow steps on https://playwright.dev/docs/intro

  1. npm init playwright@latest
  2. npx playwright test - works fine
  3. npx playwright show-report - works fine
  4. npx playwright test --ui - does not work

Expected behavior

Expected to see the Playwright UI screen.

Actual behavior

Errors:
ProtocolError: Protocol error (Page.navigate): Cannot navigate to invalid URL
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:135:16
at new Promise ()
at CRSession.send (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:131:12)
at FrameSession._navigate (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:506:41)
at CRPage.navigateFrame (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:166:41)
at Frame._gotoAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:540:55)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:74
at Frame.raceNavigationAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:496:95)
at Frame._goto (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:17)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:521:44 {
type: 'error',
method: 'Page.navigate',
logs: undefined
}

Additional context

I left comments on another thread, but I see it was already closed and they were using Mac anyhow.

I'm just trying to get started with Playwright, so I'm simply starting from the installation/intro page.

I've tried clean installs of both the JS and TS versions.

I've tried restarting the computers.

I know WSL is kind of in it's own world, so are there any special steps needed for this environ?

Environment

Computer 1: Desktop running Windows 11
  System:
    OS: Linux 5.15 Ubuntu 20.04.6 LTS (Focal Fossa)
    CPU: (16) x64 Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
    Memory: 14.87 GB / 15.50 GB
    Container: Yes
  Binaries:
    Node: 18.0.0 - ~/.nvm/versions/node/v18.0.0/bin/node
    npm: 8.6.0 - ~/.nvm/versions/node/v18.0.0/bin/npm
  IDEs:
    VSCode: 1.96.2 - /mnt/c/Users/rober/AppData/Local/Programs/Microsoft VS Code/bin/code
  Languages:
    Bash: 5.0.17 - /usr/bin/bash
  npmPackages:
    @playwright/test: ^1.49.1 => 1.49.1


Computer 2: Laptop running Windows 11

  System:
    OS: Linux 5.15 Ubuntu 22.04.5 LTS 22.04.5 LTS (Jammy Jellyfish)
    CPU: (12) x64 12th Gen Intel(R) Core(TM) i5-1235U
    Memory: 14.66 GB / 15.47 GB
    Container: Yes
  Binaries:
    Node: 18.0.0 - ~/.nvm/versions/node/v18.0.0/bin/node
    npm: 8.6.0 - ~/.nvm/versions/node/v18.0.0/bin/npm
  IDEs:
    VSCode: 1.96.2 - /mnt/c/Users/rober/AppData/Local/Programs/Microsoft VS Code/bin/code
  Languages:
    Bash: 5.1.16 - /usr/bin/bash
  npmPackages:
    @playwright/test: ^1.49.1 => 1.49.1


Addl info:
I don't know if this is relevant. But, in the Turn On/Off Windows Features box, Virtual Machine Platform is checked, and Windows Hypervisor Platform is not checked.
@dgozman
Copy link
Contributor

dgozman commented Jan 2, 2025

@RERepos This is unexpected, not sure what's happening. The error message is "Cannot navigate to invalid URL" - I wonder what's the URL? If you could run with DEBUG=pw:protocol,pw:browser npx playwright test --ui and copy logs here, that would probably be helpful.

@RERepos
Copy link
Author

RERepos commented Jan 2, 2025

@dgozman Thank you for your reply! I ran it on both computers. The outputs look very similar, but maybe have slight differences. I'll post the first computer here, then add another post with the second computer.

This is the output from the Desktop:

~:pls-playwright-fromScratch$ DEBUG=pw:protocol,pw:browser npx playwright test --ui
pw:browser /home/rerozak/.cache/ms-playwright/chromium-1148/chrome-linux/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=ImprovedCookieControls,LazyFrameLoading,GlobalMediaControls,DestroyProfileOnBrowserClose,MediaRouter,DialMediaRouteProvider,AcceptCHFrame,AutoExpandDetailsElement,CertificateTransparencyComponentUpdater,AvoidUnnecessaryBeforeUnloadCheckSync,Translate,HttpsUpgrades,PaintHolding,ThirdPartyStoragePartitioning,LensOverlay,PlzDedicatedWorker --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --no-sandbox --app=data:text/html, --window-size=1280,800 --test-type= --user-data-dir=/tmp/playwright_chromiumdev_profile-FzrubO --remote-debugging-pipe about:blank +0ms
pw:browser pid=11551 +5ms
pw:protocol SEND ► {"id":1,"method":"Browser.getVersion"} +0ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.176520:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +326ms
pw:browser [pid=11551][err] [11551:11569:0102/081824.301735:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +122ms
pw:browser [pid=11551][err] [11551:11569:0102/081824.302275:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +1ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.326959:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +25ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.327562:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.327592:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.327603:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +1ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.327608:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.398804:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +71ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.566809:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +168ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.566947:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11563:0102/081824.892143:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +325ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.998557:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +106ms
pw:browser [pid=11551][err] [11551:11566:0102/081824.998591:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.117915:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+120ms
pw:protocol ◀ RECV {"id":1,"result":{"protocolVersion":"1.3","product":"Chrome/131.0.6778.33","revision":"@99e6d712212c16b4aaf9747203cd21f893692475","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36","jsVersion":"13.1.201.7"}} +1s
pw:protocol SEND ► {"id":2,"method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":true,"flatten":true}} +2ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.131760:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+17ms
pw:browser [pid=11551][err] [11551:11563:0102/081825.131947:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11623:0102/081825.165610:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +30ms
pw:browser [pid=11551][err] [11551:11623:0102/081825.165697:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +1ms
pw:browser [pid=11551][err] [11551:11623:0102/081825.165731:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +0ms
pw:browser [pid=11551][err] [11551:11623:0102/081825.165760:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +0ms
pw:browser [pid=11551][err] [11551:11623:0102/081825.165783:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory +0ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.176004:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+10ms
pw:browser [pid=11551][err] [11551:11571:0102/081825.176104:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:protocol ◀ RECV {"method":"Target.attachedToTarget","params":{"sessionId":"3043CA00BA6E854AD14B2026BE700713","targetInfo":{"targetId":"ABB45EB2B2D9E833D4BD75294981294B","type":"page","title":"","url":"data:text/html,","attached":true,"canAccessOpener":false,"browserContextId":"9184169C832DE863BFBBCDF0F9F2EFCD"},"waitingForDebugger":false}} +65ms
pw:protocol SEND ► {"id":3,"method":"Page.enable","sessionId":"3043CA00BA6E854AD14B2026BE700713"} +4ms
pw:protocol SEND ► {"id":4,"method":"Page.getFrameTree","sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":5,"method":"Log.enable","params":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol SEND ► {"id":6,"method":"Page.setLifecycleEventsEnabled","params":{"enabled":true},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":7,"method":"Runtime.enable","params":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":8,"method":"Runtime.addBinding","params":{"name":"playwright__binding"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":9,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"","worldName":"playwright_utility_world"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":10,"method":"Network.enable","sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol SEND ► {"id":11,"method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":true,"flatten":true},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":12,"method":"Emulation.setFocusEmulationEnabled","params":{"enabled":true},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":13,"method":"Emulation.setEmulatedMedia","params":{"media":"","features":[{"name":"prefers-color-scheme","value":""},{"name":"prefers-reduced-motion","value":"no-preference"},{"name":"forced-colors","value":"none"}]},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol SEND ► {"id":14,"method":"Runtime.runIfWaitingForDebugger","sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":2,"result":{}} +1ms
pw:protocol SEND ► {"id":15,"method":"Target.getTargetInfo"} +0ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.249309:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+73ms
pw:browser [pid=11551][err] [11551:11571:0102/081825.249431:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:protocol ◀ RECV {"id":15,"result":{"targetInfo":{"targetId":"83102ffe-08cb-4b0b-868b-ec2088c96ae5","type":"browser","title":"","url":"","attached":true,"canAccessOpener":false}}} +111ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.333072:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+84ms
pw:browser [pid=11551][err] [11551:11562:0102/081825.333150:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") +0ms
pw:browser [pid=11551][err] [11551:11551:0102/081825.340014:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
+7ms
pw:protocol ◀ RECV {"method":"Network.policyUpdated","params":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +98ms
pw:protocol ◀ RECV {"id":3,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1s
pw:protocol ◀ RECV {"id":4,"result":{"frameTree":{"frame":{"id":"ABB45EB2B2D9E833D4BD75294981294B","loaderId":"55EF2F17EF2AE48ECC217B3B480938BA","url":"data:text/html,","domainAndRegistry":"","securityOrigin":"://","mimeType":"text/html","adFrameStatus":{"adFrameType":"none"},"secureContextType":"InsecureScheme","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":[]}}},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol SEND ► {"id":16,"method":"Page.createIsolatedWorld","params":{"frameId":"ABB45EB2B2D9E833D4BD75294981294B","grantUniveralAccess":true,"worldName":"playwright_utility_world"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +2ms
pw:protocol ◀ RECV {"id":5,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":6,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"://","name":"","uniqueId":"3626840885222360178.-756023263136753383","auxData":{"isDefault":true,"type":"default","frameId":"ABB45EB2B2D9E833D4BD75294981294B"}}},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +2ms
pw:protocol ◀ RECV {"id":7,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":8,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":9,"result":{"identifier":"1"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":10,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":11,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":12,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":13,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":14,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"method":"Network.loadingFinished","params":{"requestId":"55EF2F17EF2AE48ECC217B3B480938BA","timestamp":49590.016835,"encodedDataLength":0},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +2ms
pw:protocol ◀ RECV {"method":"Page.domContentEventFired","params":{"timestamp":49591.256344},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"ABB45EB2B2D9E833D4BD75294981294B","loaderId":"55EF2F17EF2AE48ECC217B3B480938BA","name":"DOMContentLoaded","timestamp":49591.256344},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"method":"Page.loadEventFired","params":{"timestamp":49591.256711},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"ABB45EB2B2D9E833D4BD75294981294B","loaderId":"55EF2F17EF2AE48ECC217B3B480938BA","name":"load","timestamp":49591.256711},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":17,"method":"Browser.setDockTile","params":{"image":"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"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +2ms
pw:protocol ◀ RECV {"method":"Page.frameStoppedLoading","params":{"frameId":"ABB45EB2B2D9E833D4BD75294981294B"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":17,"result":{},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":18,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["7804493a117dbefbd6f483534304e6d9"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["7804493a117dbefbd6f483534304e6d9"] = true;\n (function addPageBinding(playwrightBinding, bindingName, needsHandle, utilityScriptSerializers) {\n const binding = globalThis[playwrightBinding];\n globalThis[bindingName] = (...args) => {\n const me = globalThis[bindingName];\n if (needsHandle && args.slice(1).some(arg => arg !== undefined)) throw new Error(exposeBindingHandle supports a single argument, ${args.length} received);\n let callbacks = me['callbacks'];\n if (!callbacks) {\n callbacks = new Map();\n me['callbacks'] = callbacks;\n }\n const seq = (me['lastSeq'] || 0) + 1;\n me['lastSeq'] = seq;\n let handles = me['handles'];\n if (!handles) {\n handles = new Map();\n me['handles'] = handles;\n }\n const promise = new Promise((resolve, reject) => callbacks.set(seq, {\n resolve,\n reject\n }));\n let payload;\n if (needsHandle) {\n handles.set(seq, args[0]);\n payload = {\n name: bindingName,\n seq\n };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = utilityScriptSerializers.serializeAsCallArgument(args[i], v => {\n return {\n fallThrough: v\n
};\n });\n }\n payload = {\n name: bindingName,\n seq,\n serializedArgs\n };\n }\n binding(JSON.stringify(payload));\n return promise;\n };\n globalThis[bindingName].__installed = true;\n})("playwright__binding", "_saveSerializedSettings", false, (function source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === '[object RegExp]';\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === '[object Date]';\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === '[object URL]';\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n try {\n var _Object$getPrototypeO;\n return obj instanceof Error || obj && ((_Object$getPrototypeO = Object.getPrototypeOf(obj)) === null || _Object$getPrototypeO === void 0 ? void 0 : _Object$getPrototypeO.name) === 'Error';\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue(value, handles = [], refs = new Map()) {\n if (Object.is(value, undefined)) return undefined;\n if (typeof value === 'object' && value) {\n if ('ref' in value) return refs.get(value.ref);\n if ('v' in value) {\n if (value.v === 'undefined') return undefined;\n if (value.v === 'null') return null;\n if (value.v === 'NaN') return NaN;\n if (value.v === 'Infinity') return Infinity;\n if (value.v === '-Infinity') return -Infinity;\n if (value.v === '-0') return -0;\n return undefined;\n }\n if ('d' in value) return new Date(value.d);\n if ('u' in value) return new URL(value.u);\n if ('bi' in value) return BigInt(value.bi);\n if ('e' in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ('r' in value) return new RegExp(value.r.p, value.r.f);\n if ('a' in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a) result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ('o' in value) {\n const result = {};\n refs.set(value.id, result);\n for (const {\n k,\n v\n } of value.o) result[k] = parseEvaluationResultValue(v, handles, refs);\n return result;\n }\n if ('h' in value) return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, {\n visited: new Map(),\n lastId: 0\n });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === 'object') {\n if (typeof globalThis.Window === 'function' && value instanceof globalThis.Window) return 'ref: ';\n if (typeof globalThis.Document === 'function' && value instanceof globalThis.Document) return 'ref: ';\n if (typeof globalThis.Node === 'function' && value instanceof globalThis.Node) return 'ref: ';\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n const result = handleSerializer(value);\n if ('fallThrough' in result) value = result.fallThrough;else return result;\n if (typeof value === 'symbol') return {\n v: 'undefined'\n };\n if (Object.is(value, undefined)) return {\n v: 'undefined'\n };\n if (Object.is(value, null)) return {\n v: 'null'\n };\n if (Object.is(value, NaN)) return {\n v: 'NaN'\n };\n if (Object.is(value, Infinity)) return {\n v: 'Infinity'\n };\n if (Object.is(value, -Infinity)) return {\n v: '-Infinity'\n };\n if (Object.is(value, -0)) return {\n v: '-0'\n };\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'bigint') return {\n bi: value.toString()\n };\n if (isError(value)) {\n var _value$stack;\n let stack;\n if ((_value$stack = value.stack) !== null && _value$stack !== void 0 && _value$stack.startsWith(value.name + ': ' + value.message)) {\n // v8\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\\n${value.stack};\n }\n return {\n e: {\n n: value.name,\n m: value.message,\n s: stack\n }\n };\n }\n if (isDate(value)) return {\n d: value.toJSON()\n };\n if (isURL(value)) return {\n u: value.toJSON()\n };\n if (isRegExp(value)) return {\n r: {\n p: value.source,\n f: value.flags\n }\n };\n const id = visitorInfo.visited.get(value);\n if (id) return {\n ref: id\n };\n if (Array.isArray(value)) {\n const a = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (let i = 0; i < value.length; ++i) a.push(serialize(value[i], handleSerializer, visitorInfo));\n return {\n a,\n id\n };\n }\n if (typeof value === 'object') {\n const o = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue; // native bindings will throw sometimes\n }\n if (name === 'toJSON' && typeof item === 'function') o.push({\n k: name,\n v: {\n o: [],\n id: 0\n }\n });else o.push({\n k: name,\n v: serialize(item, handleSerializer, visitorInfo)\n });\n }\n let jsonWrapper;\n try {\n // If Object.keys().length === 0 we fall back to toJSON if it exists\n if (o.length === 0 && value.toJSON && typeof value.toJSON === 'function') jsonWrapper = {\n value: value.toJSON()\n };\n } catch (e) {}\n if (jsonWrapper) return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return {\n o,\n id\n };\n }\n }\n return {\n parseEvaluationResultValue,\n serializeAsCallArgument\n };\n})())\n })();"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextCreated","params":{"context":{"id":2,"origin":"","name":"playwright_utility_world","uniqueId":"-5344611566369209186.4585345114865465595","auxData":{"isDefault":false,"type":"isolated","frameId":"ABB45EB2B2D9E833D4BD75294981294B"}}},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +4ms
pw:protocol ◀ RECV {"id":16,"result":{"executionContextId":2},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol ◀ RECV {"id":18,"result":{"identifier":"2"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":19,"method":"Runtime.evaluate","params":{"expression":"\n (() => {\n const module = {};\n \nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, 'default': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/playwright-core/src/server/injected/utilityScript.ts\nvar utilityScript_exports = {};\n__export(utilityScript_exports, {\n UtilityScript: () => UtilityScript\n});\nmodule.exports = __toCommonJS(utilityScript_exports);\n\n// packages/playwright-core/src/server/isomorphic/utilityScriptSerializers.ts\nfunction source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue2(value, handles = [], refs = /* @PURE / new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value)\n return new Date(value.d);\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result2 = [];\n refs.set(value.id, result2);\n for (const a of value.a)\n result2.push(parseEvaluationResultValue2(a, handles, refs));\n return result2;\n }\n if ("o" in value) {\n const result2 = {};\n refs.set(value.id, result2);\n for (const { k, v } of value.o)\n result2[k] = parseEvaluationResultValue2(v, handles, refs);\n return result2;\n }\n if ("h" in value)\n return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument2(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: / @PURE */ new Map(), lastId: 0 });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result2 = handleSerializer(value);\n if ("fallThrough" in result2)\n value = result2.fallThrough;\n else\n return result2;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\n${value.stack};\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n
o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n }\n return { parseEvaluationResultValue: parseEvaluationResultValue2, serializeAsCallArgument: serializeAsCallArgument2 };\n}\nvar result = source();\nvar parseEvaluationResultValue = result.parseEvaluationResultValue;\nvar serializeAsCallArgument = result.serializeAsCallArgument;\n\n// packages/playwright-core/src/server/injected/utilityScript.ts\nvar UtilityScript = class {\n constructor(isUnderTest) {\n this.serializeAsCallArgument = serializeAsCallArgument;\n this.parseEvaluationResultValue = parseEvaluationResultValue;\n if (isUnderTest)\n this._setBuiltins();\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = this.parseEvaluationResultValue(args[i], handles);\n let result2 = globalThis.eval(expression);\n if (isFunction === true) {\n result2 = result2(...parameters);\n } else if (isFunction === false) {\n result2 = result2;\n } else {\n if (typeof result2 === "function")\n result2 = result2(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result2) : result2;\n }\n jsonValue(returnByValue, value) {\n if (Object.is(value, void 0))\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n _setBuiltins() {\n var _a, _b;\n const window = globalThis;\n window.builtinSetTimeout = (callback, timeout) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.setTimeout(callback, timeout);\n return setTimeout(callback, timeout);\n };\n window.builtinClearTimeout = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.clearTimeout(id);\n return clearTimeout(id);\n };\n window.builtinSetInterval = (callback, timeout) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.setInterval(callback, timeout);\n return setInterval(callback, timeout);\n };\n window.builtinClearInterval = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.clearInterval(id);\n return clearInterval(id);\n };\n window.builtinRequestAnimationFrame = (callback) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.requestAnimationFrame(callback);\n return requestAnimationFrame(callback);\n };\n window.builtinCancelAnimationFrame = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.cancelAnimationFrame(id);\n return cancelAnimationFrame(id);\n };\n window.builtinDate = ((_a = window.__pwClock) == null ? void 0 : _a.builtin.Date) || Date;\n window.builtinPerformance = ((_b = window.__pwClock) == null ? void 0 : _b.builtin.performance) || performance;\n }\n};\n\n return new (module.exports.UtilityScript())(false);\n })();","contextId":1},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":19,"result":{"result":{"type":"object","className":"UtilityScript","description":"UtilityScript","objectId":"6829339992217980169.1.1"}},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +3ms
pw:protocol SEND ► {"id":20,"method":"Runtime.callFunctionOn","params":{"functionDeclaration":"(utilityScript, ...args) => utilityScript.evaluate(...args)","objectId":"6829339992217980169.1.1","arguments":[{"objectId":"6829339992217980169.1.1"},{},{"value":true},{"value":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["7804493a117dbefbd6f483534304e6d9"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["7804493a117dbefbd6f483534304e6d9"] = true;\n (function addPageBinding(playwrightBinding, bindingName, needsHandle, utilityScriptSerializers) {\n const binding = globalThis[playwrightBinding];\n globalThis[bindingName] = (...args) => {\n const me = globalThis[bindingName];\n if (needsHandle && args.slice(1).some(arg => arg !== undefined)) throw new Error(exposeBindingHandle supports a single argument, ${args.length} received);\n let callbacks = me['callbacks'];\n if (!callbacks) {\n callbacks = new Map();\n me['callbacks'] = callbacks;\n }\n const seq = (me['lastSeq'] || 0) + 1;\n me['lastSeq'] = seq;\n let handles = me['handles'];\n if (!handles) {\n handles = new Map();\n me['handles'] = handles;\n }\n const promise = new Promise((resolve, reject) => callbacks.set(seq, {\n resolve,\n reject\n }));\n let payload;\n if (needsHandle) {\n handles.set(seq, args[0]);\n payload = {\n name: bindingName,\n seq\n };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = utilityScriptSerializers.serializeAsCallArgument(args[i], v => {\n return {\n fallThrough: v\n };\n });\n }\n payload = {\n name: bindingName,\n seq,\n serializedArgs\n };\n }\n binding(JSON.stringify(payload));\n return promise;\n };\n globalThis[bindingName].__installed = true;\n})("playwright__binding", "_saveSerializedSettings", false, (function source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === '[object RegExp]';\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === '[object Date]';\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === '[object URL]';\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n try {\n var _Object$getPrototypeO;\n return obj instanceof Error || obj && ((_Object$getPrototypeO = Object.getPrototypeOf(obj)) === null || _Object$getPrototypeO === void 0 ? void 0 : _Object$getPrototypeO.name) === 'Error';\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue(value, handles = [], refs = new Map()) {\n if (Object.is(value, undefined)) return undefined;\n if (typeof value === 'object' && value) {\n if ('ref' in value) return refs.get(value.ref);\n if ('v' in value) {\n if (value.v === 'undefined') return undefined;\n if (value.v === 'null') return null;\n if (value.v === 'NaN') return NaN;\n if (value.v === 'Infinity') return Infinity;\n if (value.v === '-Infinity') return -Infinity;\n if (value.v === '-0') return -0;\n return undefined;\n }\n if ('d' in value) return new Date(value.d);\n if ('u' in value) return new URL(value.u);\n if ('bi' in value) return BigInt(value.bi);\n if ('e' in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ('r' in value) return new RegExp(value.r.p, value.r.f);\n if ('a' in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a) result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ('o' in value) {\n const result = {};\n refs.set(value.id, result);\n for (const {\n k,\n v\n } of value.o) result[k] = parseEvaluationResultValue(v, handles, refs);\n return result;\n }\n if ('h' in value) return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, {\n visited: new Map(),\n lastId: 0\n });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === 'object') {\n if (typeof globalThis.Window === 'function' && value instanceof globalThis.Window) return 'ref: ';\n if (typeof globalThis.Document === 'function' && value instanceof globalThis.Document) return 'ref: ';\n if (typeof globalThis.Node === 'function' && value instanceof globalThis.Node) return 'ref: ';\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n const result = handleSerializer(value);\n if ('fallThrough' in result) value = result.fallThrough;else return result;\n if (typeof value === 'symbol') return {\n v: 'undefined'\n };\n if (Object.is(value, undefined)) return {\n v: 'undefined'\n };\n if (Object.is(value, null)) return {\n v: 'null'\n };\n if (Object.is(value, NaN)) return {\n v: 'NaN'\n };\n if (Object.is(value, Infinity)) return {\n v: 'Infinity'\n };\n if (Object.is(value, -Infinity)) return {\n v: '-Infinity'\n };\n if (Object.is(value, -0)) return {\n v: '-0'\n };\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'bigint') return {\n bi: value.toString()\n };\n if (isError(value)) {\n var _value$stack;\n let stack;\n if ((_value$stack = value.stack) !== null && _value$stack !== void 0 && _value$stack.startsWith(value.name + ': ' + value.message)) {\n // v8\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\\n${value.stack};\n }\n return {\n e: {\n n: value.name,\n m: value.message,\n s: stack\n }\n };\n }\n if (isDate(value)) return {\n d: value.toJSON()\n };\n if (isURL(value)) return {\n u: value.toJSON()\n };\n if (isRegExp(value)) return {\n r: {\n p: value.source,\n f: value.flags\n }\n };\n const id = visitorInfo.visited.get(value);\n if (id) return {\n ref: id\n };\n if (Array.isArray(value)) {\n const a = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (let i = 0; i < value.length; ++i) a.push(serialize(value[i], handleSerializer, visitorInfo));\n return {\n a,\n id\n };\n }\n if (typeof value === 'object') {\n const o = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue; // native bindings will throw sometimes\n }\n if (name === 'toJSON' && typeof item === 'function') o.push({\n k: name,\n v: {\n o: [],\n id: 0\n }\n });else o.push({\n k: name,\n v: serialize(item, handleSerializer, visitorInfo)\n });\n }\n let jsonWrapper;\n try {\n // If Object.keys().length === 0 we fall back to toJSON if it exists\n if (o.length === 0 && value.toJSON && typeof value.toJSON === 'function') jsonWrapper = {\n value: value.toJSON()\n };\n } catch (e) {}\n if (jsonWrapper) return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return {\n o,\n id\n };\n }\n }\n return {\n parseEvaluationResultValue,\n serializeAsCallArgument\n };\n})())\n })();"},{"value":1},{"value":{"v":"undefined"}}],"returnByValue":true,"awaitPromise":true,"userGesture":true},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":20,"result":{"result":{"type":"undefined"}},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +4ms
pw:protocol SEND ► {"id":21,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["32065c9356dcc95650ed8c4495e7686e"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["32065c9356dcc95650ed8c4495e7686e"] = true;\n (settings => {\n // iframes w/ snapshots, etc.\n if (location && location.protocol === 'data:') return;\n if (window.top !== window) return;\n Object.entries(settings).map(([k, v]) => localStorage[k] = v);\n window.saveSettings = () => {\n window._saveSerializedSettings(JSON.stringify({\n ...localStorage\n }));\n };\n })({});\n \n })();"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":21,"result":{"identifier":"3"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
pw:protocol SEND ► {"id":22,"method":"Page.navigate","params":{"url":"http://[127.0.0.1]:33097","frameId":"ABB45EB2B2D9E833D4BD75294981294B","referrerPolicy":"unsafeUrl"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +1ms
pw:protocol ◀ RECV {"id":22,"error":{"code":-32000,"message":"Cannot navigate to invalid URL"},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +0ms
ProtocolError: Protocol error (Page.navigate): Cannot navigate to invalid URL
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:135:16
at new Promise ()
at CRSession.send (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:131:12)
at FrameSession._navigate (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:506:41)
at CRPage.navigateFrame (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:166:41)
at Frame._gotoAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:540:55)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:74
at Frame.raceNavigationAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:496:95)
at Frame._goto (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:17)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:521:44 {
type: 'error',
method: 'Page.navigate',
logs: undefined
}
pw:browser [pid=11551] +1s
pw:protocol ◀ RECV {"id":-9999,"result":{}} +4ms
pw:protocol ◀ RECV {"method":"Inspector.detached","params":{"reason":"Render process gone."},"sessionId":"3043CA00BA6E854AD14B2026BE700713"} +3ms
pw:protocol ◀ RECV {"method":"Target.detachedFromTarget","params":{"sessionId":"3043CA00BA6E854AD14B2026BE700713","targetId":"ABB45EB2B2D9E833D4BD75294981294B"}} +3ms
pw:browser [pid=11551] +292ms
pw:browser [pid=11551] starting temporary directories cleanup +1ms
pw:browser [pid=11551] finished temporary directories cleanup +

@RERepos
Copy link
Author

RERepos commented Jan 2, 2025

This is the output from the laptop:

~:pls-playwright-fromScratch$ DEBUG=pw:protocol,pw:browser npx playwright test --ui
pw:browser /home/rerozak/.cache/ms-playwright/chromium-1148/chrome-linux/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=ImprovedCookieControls,LazyFrameLoading,GlobalMediaControls,DestroyProfileOnBrowserClose,MediaRouter,DialMediaRouteProvider,AcceptCHFrame,AutoExpandDetailsElement,CertificateTransparencyComponentUpdater,AvoidUnnecessaryBeforeUnloadCheckSync,Translate,HttpsUpgrades,PaintHolding,ThirdPartyStoragePartitioning,LensOverlay,PlzDedicatedWorker --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --no-sandbox --app=data:text/html, --window-size=1280,800 --test-type= --user-data-dir=/tmp/playwright_chromiumdev_profile-vvJTZF --remote-debugging-pipe about:blank +0ms
pw:browser pid=2036 +6ms
pw:protocol SEND ► {"id":1,"method":"Browser.getVersion"} +0ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.738012:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +322ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.740795:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.740819:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.741227:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.741239:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.782999:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +42ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.836110:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +53ms
pw:browser [pid=2036][err] [2036:2051:0102/081930.836210:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2049:0102/081930.999185:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +163ms
pw:browser [pid=2036][err] [2036:2051:0102/081931.054411:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +55ms
pw:browser [pid=2036][err] [2036:2051:0102/081931.054442:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.129549:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +75ms
pw:protocol ◀ RECV {"id":1,"result":{"protocolVersion":"1.3","product":"Chrome/131.0.6778.33","revision":"@99e6d712212c16b4aaf9747203cd21f893692475","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36","jsVersion":"13.1.201.7"}} +719ms
pw:protocol SEND ► {"id":2,"method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":true,"flatten":true}} +1ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.138138:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +12ms
pw:browser [pid=2036][err] [2036:2056:0102/081931.138304:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2104:0102/081931.152869:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files +12ms
pw:browser [pid=2036][err] [2036:2104:0102/081931.153153:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files +0ms
pw:browser [pid=2036][err] [2036:2104:0102/081931.153474:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files +1ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.154569:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +0ms
pw:browser [pid=2036][err] [2036:2056:0102/081931.154766:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +1ms
pw:protocol ◀ RECV {"method":"Target.attachedToTarget","params":{"sessionId":"D84A74456861C53D789B2EF6251C4047","targetInfo":{"targetId":"08B20619474BA7690133055F6E634C93","type":"page","title":"","url":"data:text/html,","attached":true,"canAccessOpener":false,"browserContextId":"69BB28B65B40F6CFA6053A1C0788938E"},"waitingForDebugger":false}} +21ms
pw:protocol SEND ► {"id":3,"method":"Page.enable","sessionId":"D84A74456861C53D789B2EF6251C4047"} +2ms
pw:protocol SEND ► {"id":4,"method":"Page.getFrameTree","sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":5,"method":"Log.enable","params":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":6,"method":"Page.setLifecycleEventsEnabled","params":{"enabled":true},"sessionId":"D84A74456861C53D789B2EF6251C4047"}
+0ms
pw:protocol SEND ► {"id":7,"method":"Runtime.enable","params":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":8,"method":"Runtime.addBinding","params":{"name":"playwright__binding"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":9,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"","worldName":"playwright_utility_world"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":10,"method":"Network.enable","sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":11,"method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":true,"flatten":true},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":12,"method":"Emulation.setFocusEmulationEnabled","params":{"enabled":true},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":13,"method":"Emulation.setEmulatedMedia","params":{"media":"","features":[{"name":"prefers-color-scheme","value":""},{"name":"prefers-reduced-motion","value":"no-preference"},{"name":"forced-colors","value":"none"}]},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":14,"method":"Runtime.runIfWaitingForDebugger","sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":2,"result":{}} +1ms
pw:protocol SEND ► {"id":15,"method":"Target.getTargetInfo"} +0ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.179006:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +24ms
pw:browser [pid=2036][err] [2036:2056:0102/081931.179220:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:protocol ◀ RECV {"id":15,"result":{"targetInfo":{"targetId":"404ba595-4351-4c07-b221-e0f90421dddd","type":"browser","title":"","url":"","attached":true,"canAccessOpener":false}}} +56ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.226332:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +47ms
pw:browser [pid=2036][err] [2036:2048:0102/081931.226660:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/user/1000/bus: No such file or directory +0ms
pw:browser [pid=2036][err] [2036:2036:0102/081931.232773:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type: +6ms
pw:protocol ◀ RECV {"id":3,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +427ms
pw:protocol ◀ RECV {"id":4,"result":{"frameTree":{"frame":{"id":"08B20619474BA7690133055F6E634C93","loaderId":"75D44E816017A83BDAE4022521055746","url":":","domainAndRegistry":"","securityOrigin":"://","mimeType":"text/html","adFrameStatus":{"adFrameType":"none"},"secureContextType":"InsecureScheme","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":[]}}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol SEND ► {"id":16,"method":"Page.createIsolatedWorld","params":{"frameId":"08B20619474BA7690133055F6E634C93","grantUniveralAccess":true,"worldName":"playwright_utility_world"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":5,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"75D44E816017A83BDAE4022521055746","name":"commit","timestamp":3162.211213},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +2ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"75D44E816017A83BDAE4022521055746","name":"DOMContentLoaded","timestamp":3162.215888},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"75D44E816017A83BDAE4022521055746","name":"networkAlmostIdle","timestamp":3162.215997},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"75D44E816017A83BDAE4022521055746","name":"networkIdle","timestamp":3162.215997},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":6,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"://","name":"","uniqueId":"-7962824016340079106.4187186511907901831","auxData":{"isDefault":true,"type":"default","frameId":"08B20619474BA7690133055F6E634C93"}}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +12ms
pw:protocol ◀ RECV {"id":7,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":8,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":9,"result":{"identifier":"1"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":10,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":11,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":12,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":13,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":14,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"9C3899189339FF53E2E72C2D3CC90AAD","name":"init","timestamp":3162.697339},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextsCleared","params":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +3ms
pw:protocol ◀ RECV {"method":"Page.frameNavigated","params":{"frame":{"id":"08B20619474BA7690133055F6E634C93","loaderId":"9C3899189339FF53E2E72C2D3CC90AAD","url":"data:text/html,","domainAndRegistry":"","securityOrigin":"://","mimeType":"text/html","adFrameStatus":{"adFrameType":"none"},"secureContextType":"InsecureScheme","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":[]},"type":"Navigation"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Network.policyUpdated","params":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +2ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextCreated","params":{"context":{"id":2,"origin":"://","name":"","uniqueId":"7340563518598605931.-4090355712574919171","auxData":{"isDefault":true,"type":"default","frameId":"08B20619474BA7690133055F6E634C93"}}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +4ms
pw:protocol ◀ RECV {"method":"Runtime.executionContextCreated","params":{"context":{"id":3,"origin":"","name":"playwright_utility_world","uniqueId":"-5165999913473498817.-2346520544244464247","auxData":{"isDefault":false,"type":"isolated","frameId":"08B20619474BA7690133055F6E634C93"}}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":16,"result":{"executionContextId":3},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +3ms
pw:protocol ◀ RECV {"method":"Network.loadingFinished","params":{"requestId":"9C3899189339FF53E2E72C2D3CC90AAD","timestamp":3162.1938,"encodedDataLength":0},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"method":"Page.domContentEventFired","params":{"timestamp":3162.709798},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"9C3899189339FF53E2E72C2D3CC90AAD","name":"DOMContentLoaded","timestamp":3162.709798},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.loadEventFired","params":{"timestamp":3162.7105},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"method":"Page.lifecycleEvent","params":{"frameId":"08B20619474BA7690133055F6E634C93","loaderId":"9C3899189339FF53E2E72C2D3CC90AAD","name":"load","timestamp":3162.7105},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"method":"Page.frameStoppedLoading","params":{"frameId":"08B20619474BA7690133055F6E634C93"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":17,"method":"Browser.setDockTile","params":{"image":"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"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":17,"result":{},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":18,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["8e652006878a88c366f2ea06875662ef"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["8e652006878a88c366f2ea06875662ef"] = true;\n (function addPageBinding(playwrightBinding, bindingName, needsHandle, utilityScriptSerializers) {\n const binding = globalThis[playwrightBinding];\n globalThis[bindingName] = (...args) => {\n const me = globalThis[bindingName];\n if (needsHandle && args.slice(1).some(arg => arg !== undefined)) throw new Error(exposeBindingHandle supports a single argument, ${args.length} received);\n let callbacks = me['callbacks'];\n if (!callbacks) {\n callbacks = new Map();\n me['callbacks'] = callbacks;\n }\n const seq = (me['lastSeq'] || 0) + 1;\n me['lastSeq'] = seq;\n let handles = me['handles'];\n if (!handles) {\n handles = new Map();\n me['handles'] = handles;\n }\n const promise = new Promise((resolve, reject) => callbacks.set(seq, {\n resolve,\n reject\n }));\n let payload;\n if (needsHandle) {\n handles.set(seq, args[0]);\n payload = {\n name: bindingName,\n seq\n };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = utilityScriptSerializers.serializeAsCallArgument(args[i], v => {\n
return {\n fallThrough: v\n };\n });\n }\n payload = {\n name: bindingName,\n seq,\n serializedArgs\n };\n }\n binding(JSON.stringify(payload));\n return promise;\n };\n globalThis[bindingName].__installed = true;\n})("playwright__binding", "_saveSerializedSettings", false, (function source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === '[object RegExp]';\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === '[object Date]';\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === '[object URL]';\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n try {\n var _Object$getPrototypeO;\n return obj instanceof Error || obj && ((_Object$getPrototypeO = Object.getPrototypeOf(obj)) === null || _Object$getPrototypeO === void 0 ? void 0 : _Object$getPrototypeO.name) === 'Error';\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue(value, handles = [], refs = new Map()) {\n if (Object.is(value, undefined)) return undefined;\n if (typeof value === 'object' && value) {\n if ('ref' in value) return refs.get(value.ref);\n if ('v' in value) {\n if (value.v === 'undefined') return undefined;\n if (value.v === 'null') return null;\n if (value.v === 'NaN') return NaN;\n if (value.v === 'Infinity') return Infinity;\n if (value.v === '-Infinity') return -Infinity;\n if (value.v === '-0') return -0;\n return undefined;\n }\n if ('d' in value) return new Date(value.d);\n if ('u' in value) return new URL(value.u);\n if ('bi' in value) return BigInt(value.bi);\n if ('e' in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ('r' in value) return new RegExp(value.r.p, value.r.f);\n if ('a' in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a) result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ('o' in value) {\n const result = {};\n refs.set(value.id, result);\n for (const {\n k,\n v\n } of value.o) result[k] = parseEvaluationResultValue(v, handles, refs);\n return result;\n }\n if ('h' in value) return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, {\n visited: new Map(),\n lastId: 0\n });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === 'object') {\n if (typeof globalThis.Window === 'function' && value instanceof globalThis.Window) return 'ref: ';\n if (typeof globalThis.Document === 'function' && value instanceof globalThis.Document) return 'ref: ';\n if (typeof globalThis.Node === 'function' && value instanceof globalThis.Node) return 'ref: ';\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n const result = handleSerializer(value);\n if ('fallThrough' in result) value = result.fallThrough;else return result;\n if (typeof value === 'symbol') return {\n v: 'undefined'\n };\n if (Object.is(value, undefined)) return {\n v: 'undefined'\n };\n if (Object.is(value, null)) return {\n v: 'null'\n };\n if (Object.is(value, NaN)) return {\n v: 'NaN'\n };\n if (Object.is(value, Infinity)) return {\n v: 'Infinity'\n };\n if (Object.is(value, -Infinity)) return {\n v: '-Infinity'\n };\n if (Object.is(value, -0)) return {\n v: '-0'\n };\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'bigint') return {\n bi: value.toString()\n };\n if (isError(value)) {\n var _value$stack;\n let stack;\n if ((_value$stack = value.stack) !== null && _value$stack !== void 0 && _value$stack.startsWith(value.name + ': ' + value.message)) {\n // v8\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\\n${value.stack};\n }\n return {\n e: {\n n: value.name,\n m: value.message,\n s: stack\n }\n };\n }\n if (isDate(value)) return {\n d: value.toJSON()\n };\n if (isURL(value)) return {\n u: value.toJSON()\n };\n if (isRegExp(value)) return {\n r: {\n p: value.source,\n f: value.flags\n }\n };\n const id = visitorInfo.visited.get(value);\n if (id) return {\n ref: id\n };\n if (Array.isArray(value)) {\n const a = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (let i = 0; i < value.length; ++i) a.push(serialize(value[i], handleSerializer, visitorInfo));\n return {\n a,\n id\n };\n }\n if (typeof value === 'object') {\n const o = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue; // native bindings will throw sometimes\n }\n if (name === 'toJSON' && typeof item === 'function') o.push({\n k: name,\n v: {\n o: [],\n id: 0\n }\n });else o.push({\n k: name,\n v: serialize(item, handleSerializer, visitorInfo)\n });\n }\n let jsonWrapper;\n try {\n // If Object.keys().length === 0 we fall back to toJSON if it exists\n if (o.length === 0 && value.toJSON && typeof value.toJSON === 'function') jsonWrapper = {\n value: value.toJSON()\n };\n } catch (e) {}\n if (jsonWrapper) return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return {\n o,\n id\n };\n }\n }\n return {\n parseEvaluationResultValue,\n serializeAsCallArgument\n };\n})())\n })();"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":18,"result":{"identifier":"2"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +3ms
pw:protocol SEND ► {"id":19,"method":"Runtime.evaluate","params":{"expression":"\n (() => {\n const module = {};\n \nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, 'default': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/playwright-core/src/server/injected/utilityScript.ts\nvar utilityScript_exports = {};\n__export(utilityScript_exports, {\n UtilityScript: () => UtilityScript\n});\nmodule.exports = __toCommonJS(utilityScript_exports);\n\n// packages/playwright-core/src/server/isomorphic/utilityScriptSerializers.ts\nfunction source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue2(value, handles = [], refs = /* @PURE / new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value)\n return new Date(value.d);\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result2 = [];\n refs.set(value.id, result2);\n for (const a of value.a)\n result2.push(parseEvaluationResultValue2(a, handles, refs));\n return result2;\n }\n if ("o" in value) {\n const result2 = {};\n refs.set(value.id, result2);\n for (const { k, v } of value.o)\n result2[k] = parseEvaluationResultValue2(v, handles, refs);\n return result2;\n }\n if ("h" in value)\n return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument2(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: / @PURE */ new Map(), lastId: 0 });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result2 = handleSerializer(value);\n if ("fallThrough" in result2)\n value = result2.fallThrough;\n else\n return result2;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\n${value.stack};\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n }\n return { parseEvaluationResultValue: parseEvaluationResultValue2, serializeAsCallArgument: serializeAsCallArgument2 };\n}\nvar result = source();\nvar parseEvaluationResultValue = result.parseEvaluationResultValue;\nvar serializeAsCallArgument = result.serializeAsCallArgument;\n\n// packages/playwright-core/src/server/injected/utilityScript.ts\nvar UtilityScript = class {\n constructor(isUnderTest) {\n this.serializeAsCallArgument = serializeAsCallArgument;\n this.parseEvaluationResultValue = parseEvaluationResultValue;\n if (isUnderTest)\n this._setBuiltins();\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = this.parseEvaluationResultValue(args[i], handles);\n let result2 = globalThis.eval(expression);\n if (isFunction === true) {\n result2 = result2(...parameters);\n } else if (isFunction === false) {\n result2 = result2;\n } else {\n if (typeof result2 === "function")\n result2 = result2(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result2) : result2;\n }\n jsonValue(returnByValue, value) {\n if (Object.is(value, void 0))\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n _setBuiltins() {\n var _a, _b;\n const window = globalThis;\n window.builtinSetTimeout = (callback, timeout) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.setTimeout(callback, timeout);\n return setTimeout(callback, timeout);\n };\n window.builtinClearTimeout = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.clearTimeout(id);\n return clearTimeout(id);\n };\n window.builtinSetInterval = (callback, timeout) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.setInterval(callback, timeout);\n return setInterval(callback, timeout);\n };\n window.builtinClearInterval = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.clearInterval(id);\n return clearInterval(id);\n };\n window.builtinRequestAnimationFrame = (callback) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.requestAnimationFrame(callback);\n return requestAnimationFrame(callback);\n };\n window.builtinCancelAnimationFrame = (id) => {\n var _a2;\n if ((_a2 = window.__pwClock) == null ? void 0 : _a2.builtin)\n return window.__pwClock.builtin.cancelAnimationFrame(id);\n return cancelAnimationFrame(id);\n };\n window.builtinDate = ((_a = window.__pwClock) == null ? void 0 : _a.builtin.Date) || Date;\n window.builtinPerformance = ((_b = window.__pwClock) == null ? void 0 : _b.builtin.performance) || performance;\n }\n};\n\n return new (module.exports.UtilityScript())(false);\n })();","contextId":2},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +0ms
pw:protocol ◀ RECV {"id":19,"result":{"result":{"type":"object","className":"UtilityScript","description":"UtilityScript","objectId":"-501141567713386757.2.1"}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +4ms
pw:protocol SEND ► {"id":20,"method":"Runtime.callFunctionOn","params":{"functionDeclaration":"(utilityScript, ...args) => utilityScript.evaluate(...args)","objectId":"-501141567713386757.2.1","arguments":[{"objectId":"-501141567713386757.2.1"},{},{"value":true},{"value":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["8e652006878a88c366f2ea06875662ef"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["8e652006878a88c366f2ea06875662ef"] = true;\n (function addPageBinding(playwrightBinding, bindingName, needsHandle, utilityScriptSerializers) {\n const binding = globalThis[playwrightBinding];\n globalThis[bindingName] = (...args) => {\n const me = globalThis[bindingName];\n if (needsHandle && args.slice(1).some(arg => arg !== undefined)) throw new Error(exposeBindingHandle supports a single argument, ${args.length} received);\n let callbacks = me['callbacks'];\n if (!callbacks) {\n callbacks = new Map();\n me['callbacks'] = callbacks;\n }\n const seq = (me['lastSeq'] || 0) + 1;\n me['lastSeq'] = seq;\n let handles = me['handles'];\n if (!handles) {\n handles = new Map();\n me['handles'] = handles;\n }\n const promise = new Promise((resolve, reject) => callbacks.set(seq, {\n resolve,\n reject\n }));\n let payload;\n if (needsHandle) {\n handles.set(seq, args[0]);\n payload = {\n name: bindingName,\n seq\n };\n } else {\n const serializedArgs = [];\n for (let i = 0; i < args.length; i++) {\n serializedArgs[i] = utilityScriptSerializers.serializeAsCallArgument(args[i], v => {\n return {\n fallThrough: v\n };\n });\n }\n payload = {\n name: bindingName,\n seq,\n serializedArgs\n };\n }\n binding(JSON.stringify(payload));\n return promise;\n };\n globalThis[bindingName].__installed = true;\n})("playwright__binding", "_saveSerializedSettings", false, (function source() {\n function isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === '[object RegExp]';\n } catch (error) {\n return false;\n }\n }\n function isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === '[object Date]';\n } catch (error) {\n return false;\n }\n }\n function isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === '[object URL]';\n } catch (error) {\n return false;\n }\n }\n function isError(obj) {\n try {\n var _Object$getPrototypeO;\n return obj instanceof Error || obj && ((_Object$getPrototypeO = Object.getPrototypeOf(obj)) === null || _Object$getPrototypeO === void 0 ? void 0 : _Object$getPrototypeO.name) === 'Error';\n } catch (error) {\n return false;\n }\n }\n function parseEvaluationResultValue(value, handles = [], refs = new Map()) {\n if (Object.is(value, undefined)) return undefined;\n if (typeof value === 'object' && value) {\n if ('ref' in value) return refs.get(value.ref);\n if ('v' in value) {\n if (value.v === 'undefined') return undefined;\n if (value.v === 'null') return null;\n if (value.v === 'NaN') return NaN;\n if (value.v === 'Infinity') return Infinity;\n if (value.v === '-Infinity') return -Infinity;\n if (value.v === '-0') return -0;\n return undefined;\n }\n if ('d' in value) return new Date(value.d);\n if ('u' in value) return new URL(value.u);\n if ('bi' in value) return BigInt(value.bi);\n if ('e' in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ('r' in value) return new RegExp(value.r.p, value.r.f);\n if ('a' in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a) result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ('o' in value) {\n const result = {};\n refs.set(value.id, result);\n for (const {\n k,\n v\n } of value.o) result[k] = parseEvaluationResultValue(v, handles, refs);\n return result;\n }\n if ('h' in value) return handles[value.h];\n }\n return value;\n }\n function serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, {\n visited: new Map(),\n lastId: 0\n });\n }\n function serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === 'object') {\n if (typeof globalThis.Window === 'function' && value instanceof globalThis.Window) return 'ref: ';\n if (typeof globalThis.Document === 'function' && value instanceof globalThis.Document) return 'ref: ';\n if (typeof globalThis.Node === 'function' && value instanceof globalThis.Node) return 'ref: ';\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n }\n function innerSerialize(value, handleSerializer, visitorInfo) {\n const result = handleSerializer(value);\n if ('fallThrough' in result) value = result.fallThrough;else return result;\n if (typeof value === 'symbol') return {\n v: 'undefined'\n };\n if (Object.is(value, undefined)) return {\n v: 'undefined'\n };\n if (Object.is(value, null)) return {\n v: 'null'\n };\n if (Object.is(value, NaN)) return {\n v: 'NaN'\n };\n if (Object.is(value, Infinity)) return {\n v: 'Infinity'\n };\n if (Object.is(value, -Infinity)) return {\n v: '-Infinity'\n };\n if (Object.is(value, -0)) return {\n v: '-0'\n };\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return value;\n if (typeof value === 'bigint') return {\n bi: value.toString()\n };\n if (isError(value)) {\n var _value$stack;\n let stack;\n if ((_value$stack = value.stack) !== null && _value$stack !== void 0 && _value$stack.startsWith(value.name + ': ' + value.message)) {\n // v8\n stack = value.stack;\n } else {\n stack = ${value.name}: ${value.message}\\n${value.stack};\n }\n return {\n e: {\n n: value.name,\n m: value.message,\n s: stack\n }\n };\n }\n if (isDate(value)) return {\n d: value.toJSON()\n };\n if (isURL(value)) return {\n u: value.toJSON()\n };\n if (isRegExp(value)) return {\n r: {\n p: value.source,\n f: value.flags\n }\n };\n const id = visitorInfo.visited.get(value);\n if (id) return {\n ref: id\n };\n if (Array.isArray(value)) {\n const a = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (let i = 0; i < value.length; ++i) a.push(serialize(value[i], handleSerializer, visitorInfo));\n return {\n a,\n id\n };\n }\n if (typeof value === 'object') {\n const o = [];\n const id = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue; // native bindings will throw sometimes\n }\n if (name === 'toJSON' && typeof item === 'function') o.push({\n k: name,\n v: {\n o: [],\n id: 0\n }\n });else o.push({\n k: name,\n v: serialize(item, handleSerializer, visitorInfo)\n });\n }\n let jsonWrapper;\n try {\n // If Object.keys().length === 0 we fall back to toJSON if it exists\n if (o.length === 0 && value.toJSON && typeof value.toJSON === 'function') jsonWrapper = {\n value: value.toJSON()\n };\n } catch (e) {}\n if (jsonWrapper) return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return {\n o,\n id\n };\n }\n }\n return {\n parseEvaluationResultValue,\n serializeAsCallArgument\n };\n})())\n })();"},{"value":1},{"value":{"v":"undefined"}}],"returnByValue":true,"awaitPromise":true,"userGesture":true},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":20,"result":{"result":{"type":"undefined"}},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +6ms
pw:protocol SEND ► {"id":21,"method":"Page.addScriptToEvaluateOnNewDocument","params":{"source":"(() => {\n globalThis.__pwInitScripts = globalThis.__pwInitScripts || {};\n const hasInitScript = globalThis.__pwInitScripts["05cf644c6a63d6424b7229e07757def7"];\n if (hasInitScript)\n return;\n globalThis.__pwInitScripts["05cf644c6a63d6424b7229e07757def7"] = true;\n (settings => {\n // iframes w/ snapshots, etc.\n if (location && location.protocol === 'data:') return;\n if (window.top !== window) return;\n Object.entries(settings).map(([k, v]) => localStorage[k] = v);\n window.saveSettings = () => {\n window._saveSerializedSettings(JSON.stringify({\n ...localStorage\n }));\n };\n })({});\n \n })();"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":21,"result":{"identifier":"3"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol SEND ► {"id":22,"method":"Page.navigate","params":{"url":"http://[127.0.0.1]:39515","frameId":"08B20619474BA7690133055F6E634C93","referrerPolicy":"unsafeUrl"},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +1ms
pw:protocol ◀ RECV {"id":22,"error":{"code":-32000,"message":"Cannot navigate to invalid URL"},"sessionId":"D84A74456861C53D789B2EF6251C4047"}
+1ms
ProtocolError: Protocol error (Page.navigate): Cannot navigate to invalid URL
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:135:16
at new Promise ()
at CRSession.send (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crConnection.js:131:12)
at FrameSession._navigate (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:506:41)
at CRPage.navigateFrame (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/chromium/crPage.js:166:41)
at Frame._gotoAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:540:55)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:74
at Frame.raceNavigationAction (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:496:95)
at Frame._goto (/home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:524:17)
at /home/rerozak/rozak_app_foundry/pls-playwright-fromScratch/node_modules/playwright-core/lib/server/frames.js:521:44 {
type: 'error',
method: 'Page.navigate',
logs: undefined
}
pw:browser [pid=2036] +475ms
pw:protocol ◀ RECV {"id":-9999,"result":{}} +3ms
pw:protocol ◀ RECV {"method":"Inspector.detached","params":{"reason":"Render process gone."},"sessionId":"D84A74456861C53D789B2EF6251C4047"} +5ms
pw:protocol ◀ RECV {"method":"Target.detachedFromTarget","params":{"sessionId":"D84A74456861C53D789B2EF6251C4047","targetId":"08B20619474BA7690133055F6E634C93"}} +3ms
pw:browser [pid=2036] +156ms
pw:browser [pid=2036] starting temporary directories cleanup +2ms
pw:browser [pid=2036] finished temporary directories cleanup +11ms
pw:browser [pid=2036]

@Skn0tt
Copy link
Member

Skn0tt commented Jan 3, 2025

Thanks! {"id":22,"method":"Page.navigate","params":{"url":"http://[127.0.0.1]:39515" ... seems to be the culprit. The bracket notation is meant to denote ipv6 addresses, but 127.0.0.1 is ipv4. Seems like there's something off in WSL2 and we need to change something around this line:

const resolvedHost = address.family === 'IPv4' ? address.address : `[${address.address}]`;

@Skn0tt
Copy link
Member

Skn0tt commented Jan 3, 2025

Looks like Node.js 18 returns a number instead of a string
:D

Image Image

Working on a fix!

@Skn0tt Skn0tt linked a pull request Jan 3, 2025 that will close this issue
@Skn0tt Skn0tt self-assigned this Jan 3, 2025
@Skn0tt Skn0tt added the v1.50 label Jan 3, 2025
@Skn0tt
Copy link
Member

Skn0tt commented Jan 3, 2025

I'm not sure if we'll land the fix, given that this can also be worked around by updating Node.js to the latest v18 release. So if you need a fix now, update Node.js! See #34203 (comment)

@RERepos
Copy link
Author

RERepos commented Jan 3, 2025

I upgraded to node v20.18.1, and npx playwright test --ui works on both computers now.

Thanks for your helpl!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants