@ricsam/isolate-playwright 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -5
- package/dist/cjs/client.cjs +73 -6
- package/dist/cjs/client.cjs.map +3 -3
- package/dist/cjs/index.cjs +28 -14
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/client.mjs +73 -6
- package/dist/mjs/client.mjs.map +3 -3
- package/dist/mjs/index.mjs +28 -14
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/client.d.ts +0 -1
- package/dist/types/index.d.ts +0 -4
- package/dist/types/types.d.ts +0 -3
- package/package.json +1 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import ivm from \"isolated-vm\";\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n PlaywrightEvent,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export protocol types\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\nexport interface NetworkRequestInfo {\n url: string;\n method: string;\n headers: Record<string, string>;\n postData?: string;\n resourceType: string;\n timestamp: number;\n}\n\nexport interface NetworkResponseInfo {\n url: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n timestamp: number;\n}\n\n/**\n * Browser console log entry - logs from the page context (not sandbox).\n */\nexport interface BrowserConsoleLogEntry {\n level: string;\n stdout: string;\n timestamp: number;\n}\n\n/**\n * Callback type for handling playwright operations.\n * Used for remote execution where the page lives on the client.\n */\nexport type PlaywrightCallback = (\n op: PlaywrightOperation\n) => Promise<PlaywrightResult>;\n\n/**\n * Options for setting up playwright in an isolate.\n */\nexport interface PlaywrightSetupOptions {\n /** Direct page object (for local use) */\n page?: Page;\n /** Handler callback (for remote use - daemon invokes this) */\n handler?: PlaywrightCallback;\n /** Default timeout for operations */\n timeout?: number;\n /** Base URL for relative navigation */\n baseUrl?: string;\n /** If true, browser console logs are printed to stdout */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\n}\n\n/**\n * @deprecated Use PlaywrightSetupOptions instead\n */\nexport interface PlaywrightOptions {\n page: Page;\n timeout?: number;\n baseUrl?: string;\n onNetworkRequest?: (info: NetworkRequestInfo) => void;\n onNetworkResponse?: (info: NetworkResponseInfo) => void;\n}\n\nexport interface PlaywrightHandle {\n dispose(): void;\n /** Get browser console logs (from the page, not sandbox) */\n getBrowserConsoleLogs(): BrowserConsoleLogEntry[];\n getNetworkRequests(): NetworkRequestInfo[];\n getNetworkResponses(): NetworkResponseInfo[];\n clearCollected(): void;\n}\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n delete roleOptions.filter;\n // Deserialize regex name\n if (roleOptions.name && typeof roleOptions.name === 'object' && roleOptions.name.$regex) {\n roleOptions.name = new RegExp(roleOptions.name.$regex, roleOptions.name.$flags);\n }\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n // Apply filter if specified\n if (options?.filter) {\n const filterOpts = { ...options.filter };\n if (filterOpts.hasText && typeof filterOpts.hasText === 'object' && filterOpts.hasText.$regex) {\n filterOpts.hasText = new RegExp(filterOpts.hasText.$regex, filterOpts.hasText.$flags);\n }\n if (filterOpts.hasNotText && typeof filterOpts.hasNotText === 'object' && filterOpts.hasNotText.$regex) {\n filterOpts.hasNotText = new RegExp(filterOpts.hasNotText.$regex, filterOpts.hasNotText.$flags);\n }\n locator = locator.filter(filterOpts);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n case \"getAttribute\":\n return await locator.getAttribute(String(actionArg ?? \"\"), { timeout });\n case \"isDisabled\":\n return await locator.isDisabled();\n case \"isHidden\":\n return await locator.isHidden();\n case \"innerHTML\":\n return await locator.innerHTML({ timeout });\n case \"innerText\":\n return await locator.innerText({ timeout });\n case \"allTextContents\":\n return await locator.allTextContents();\n case \"allInnerTexts\":\n return await locator.allInnerTexts();\n case \"waitFor\": {\n const opts = actionArg && typeof actionArg === 'object' ? actionArg as Record<string, unknown> : {};\n await locator.waitFor({ state: opts.state as any, timeout: (opts.timeout as number) ?? timeout });\n return null;\n }\n case \"boundingBox\":\n return await locator.boundingBox({ timeout });\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n let matches: boolean;\n let expectedDisplay: string;\n if (expected && typeof expected === 'object' && (expected as any).$regex) {\n const regex = new RegExp((expected as any).$regex, (expected as any).$flags);\n matches = regex.test(text ?? '');\n expectedDisplay = String(regex);\n } else {\n matches = text?.includes(String(expected)) ?? false;\n expectedDisplay = String(expected);\n }\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain ${expectedDisplay}, but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain ${expectedDisplay}, but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n case \"toHaveAttribute\": {\n const { name, value } = expected as { name: string; value: unknown };\n const actual = await locator.getAttribute(name, { timeout });\n if (value instanceof RegExp || (value && typeof value === 'object' && (value as any).$regex)) {\n const regex = (value as any).$regex ? new RegExp((value as any).$regex, (value as any).$flags) : value as RegExp;\n const matches = regex.test(actual ?? '');\n if (negated) {\n if (matches) throw new Error(`Expected attribute \"${name}\" to not match ${regex}, but got \"${actual}\"`);\n } else {\n if (!matches) throw new Error(`Expected attribute \"${name}\" to match ${regex}, but got \"${actual}\"`);\n }\n } else {\n const matches = actual === String(value);\n if (negated) {\n if (matches) throw new Error(`Expected attribute \"${name}\" to not be \"${value}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected attribute \"${name}\" to be \"${value}\", but got \"${actual}\"`);\n }\n }\n break;\n }\n case \"toHaveText\": {\n const text = (await locator.textContent({ timeout })) ?? '';\n let matches: boolean;\n let expectedDisplay: string;\n if (expected && typeof expected === 'object' && (expected as any).$regex) {\n const regex = new RegExp((expected as any).$regex, (expected as any).$flags);\n matches = regex.test(text);\n expectedDisplay = String(regex);\n } else {\n matches = text === String(expected);\n expectedDisplay = JSON.stringify(expected);\n }\n if (negated) {\n if (matches) throw new Error(`Expected text to not be ${expectedDisplay}, but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to be ${expectedDisplay}, but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveCount\": {\n const count = await locator.count();\n const expectedCount = Number(expected);\n if (negated) {\n if (count === expectedCount) throw new Error(`Expected count to not be ${expectedCount}, but it was`);\n } else {\n if (count !== expectedCount) throw new Error(`Expected count to be ${expectedCount}, but got ${count}`);\n }\n break;\n }\n case \"toBeHidden\": {\n const isHidden = await locator.isHidden();\n if (negated) {\n if (isHidden) throw new Error(\"Expected element to not be hidden, but it was hidden\");\n } else {\n if (!isHidden) throw new Error(\"Expected element to be hidden, but it was not\");\n }\n break;\n }\n case \"toBeDisabled\": {\n const isDisabled = await locator.isDisabled();\n if (negated) {\n if (isDisabled) throw new Error(\"Expected element to not be disabled, but it was disabled\");\n } else {\n if (!isDisabled) throw new Error(\"Expected element to be disabled, but it was not\");\n }\n break;\n }\n case \"toBeFocused\": {\n const isFocused = await locator.evaluate((el) => document.activeElement === el).catch(() => false);\n if (negated) {\n if (isFocused) throw new Error(\"Expected element to not be focused, but it was focused\");\n } else {\n if (!isFocused) throw new Error(\"Expected element to be focused, but it was not\");\n }\n break;\n }\n case \"toBeEmpty\": {\n const text = await locator.textContent({ timeout });\n const value = await locator.inputValue({ timeout }).catch(() => null);\n const isEmpty = (value !== null ? value === '' : (text ?? '') === '');\n if (negated) {\n if (isEmpty) throw new Error(\"Expected element to not be empty, but it was\");\n } else {\n if (!isEmpty) throw new Error(\"Expected element to be empty, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number; baseUrl?: string }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n const baseUrl = options?.baseUrl;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n await page.goto(targetUrl, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script, arg] = op.args as [string, unknown];\n if (op.args.length > 1) {\n const fn = new Function('return (' + script + ')')();\n const result = await page.evaluate(fn, arg);\n return { ok: true, value: result };\n }\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(targetUrl, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n case \"goBack\": {\n const [waitUntil] = op.args as [string?];\n await page.goBack({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"goForward\": {\n const [waitUntil] = op.args as [string?];\n await page.goForward({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"waitForURL\": {\n const [url, customTimeout, waitUntil] = op.args as [string, number?, string?];\n await page.waitForURL(url, {\n timeout: customTimeout ?? timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? undefined,\n });\n return { ok: true };\n }\n case \"clearCookies\": {\n await page.context().clearCookies();\n return { ok: true };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n\n// ============================================================================\n// Setup Playwright\n// ============================================================================\n\n/**\n * Set up playwright in an isolate context.\n *\n * For local use: provide `page` option (direct page access)\n * For remote use: provide `handler` option (callback pattern)\n */\nexport async function setupPlaywright(\n context: ivm.Context,\n options: PlaywrightSetupOptions | PlaywrightOptions\n): Promise<PlaywrightHandle> {\n const timeout = options.timeout ?? 30000;\n const baseUrl = options.baseUrl;\n\n // Determine if we have a page or handler\n const page = \"page\" in options ? options.page : undefined;\n const handler = \"handler\" in options ? options.handler : undefined;\n\n // Create handler from page if needed\n const effectiveHandler = handler ?? (page ? createPlaywrightHandler(page, { timeout, baseUrl }) : undefined);\n\n if (!effectiveHandler) {\n throw new Error(\"Either page or handler must be provided to setupPlaywright\");\n }\n\n // State for collected data (only used when page is provided directly)\n const browserConsoleLogs: BrowserConsoleLogEntry[] = [];\n const networkRequests: NetworkRequestInfo[] = [];\n const networkResponses: NetworkResponseInfo[] = [];\n\n const global = context.global;\n\n // ========================================================================\n // Event Capture (only when page is provided directly)\n // ========================================================================\n\n let requestHandler: ((request: import(\"playwright\").Request) => void) | undefined;\n let responseHandler: ((response: import(\"playwright\").Response) => void) | undefined;\n let consoleHandler: ((msg: import(\"playwright\").ConsoleMessage) => void) | undefined;\n\n if (page) {\n // Get onEvent callback if provided\n const onEvent = \"onEvent\" in options ? options.onEvent : undefined;\n\n requestHandler = (request: import(\"playwright\").Request) => {\n const info: NetworkRequestInfo = {\n url: request.url(),\n method: request.method(),\n headers: request.headers(),\n postData: request.postData() ?? undefined,\n resourceType: request.resourceType(),\n timestamp: Date.now(),\n };\n networkRequests.push(info);\n\n if (onEvent) {\n onEvent({\n type: \"networkRequest\",\n url: info.url,\n method: info.method,\n headers: info.headers,\n postData: info.postData,\n resourceType: info.resourceType,\n timestamp: info.timestamp,\n });\n }\n };\n\n responseHandler = (response: import(\"playwright\").Response) => {\n const info: NetworkResponseInfo = {\n url: response.url(),\n status: response.status(),\n statusText: response.statusText(),\n headers: response.headers(),\n timestamp: Date.now(),\n };\n networkResponses.push(info);\n\n if (onEvent) {\n onEvent({\n type: \"networkResponse\",\n url: info.url,\n status: info.status,\n statusText: info.statusText,\n headers: info.headers,\n timestamp: info.timestamp,\n });\n }\n };\n\n consoleHandler = (msg: import(\"playwright\").ConsoleMessage) => {\n const args = msg.args().map((arg) => String(arg));\n const entry: BrowserConsoleLogEntry = {\n level: msg.type(),\n stdout: args.join(\" \"),\n timestamp: Date.now(),\n };\n browserConsoleLogs.push(entry);\n\n if (onEvent) {\n onEvent({\n type: \"browserConsoleLog\",\n level: entry.level,\n stdout: entry.stdout,\n timestamp: entry.timestamp,\n });\n }\n\n // Print to stdout if console option is true\n if (\"console\" in options && options.console) {\n const prefix = `[browser:${entry.level}]`;\n console.log(prefix, entry.stdout);\n }\n };\n\n page.on(\"request\", requestHandler);\n page.on(\"response\", responseHandler);\n page.on(\"console\", consoleHandler);\n }\n\n // ========================================================================\n // Unified Handler Reference\n // ========================================================================\n\n // Single handler reference that receives operation objects\n global.setSync(\n \"__Playwright_handler_ref\",\n new ivm.Reference(async (opJson: string): Promise<string> => {\n const op = JSON.parse(opJson) as PlaywrightOperation;\n const result = await effectiveHandler(op);\n return JSON.stringify(result);\n })\n );\n\n // ========================================================================\n // Injected JavaScript\n // ========================================================================\n\n // Helper function to invoke handler and handle errors\n context.evalSync(`\n(function() {\n globalThis.__pw_invoke = async function(type, args) {\n const op = JSON.stringify({ type, args });\n const resultJson = __Playwright_handler_ref.applySyncPromise(undefined, [op]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n})();\n`);\n\n // Page object\n context.evalSync(`\n(function() {\n let __pw_currentUrl = '';\n globalThis.page = {\n async goto(url, options) {\n const result = await __pw_invoke(\"goto\", [url, options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n __pw_currentUrl = resolvedUrl || url;\n return result;\n },\n async reload() {\n const result = await __pw_invoke(\"reload\", []);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n return result;\n },\n url() {\n return __pw_currentUrl;\n },\n async title() {\n return __pw_invoke(\"title\", []);\n },\n async content() {\n return __pw_invoke(\"content\", []);\n },\n async waitForSelector(selector, options) {\n return __pw_invoke(\"waitForSelector\", [selector, options ? JSON.stringify(options) : null]);\n },\n async waitForTimeout(ms) {\n return __pw_invoke(\"waitForTimeout\", [ms]);\n },\n async waitForLoadState(state) {\n return __pw_invoke(\"waitForLoadState\", [state || null]);\n },\n async evaluate(script, arg) {\n const hasArg = arguments.length > 1;\n if (hasArg) {\n const serialized = typeof script === \"function\" ? script.toString() : script;\n return __pw_invoke(\"evaluate\", [serialized, arg]);\n }\n const serialized = typeof script === \"function\" ? \"(\" + script.toString() + \")()\" : script;\n return __pw_invoke(\"evaluate\", [serialized]);\n },\n locator(selector) { return new Locator(\"css\", selector, null); },\n getByRole(role, options) {\n if (options) {\n const serialized = { ...options };\n if (options.name instanceof RegExp) {\n serialized.name = { $regex: options.name.source, $flags: options.name.flags };\n }\n return new Locator(\"role\", role, JSON.stringify(serialized));\n }\n return new Locator(\"role\", role, null);\n },\n getByText(text) { return new Locator(\"text\", text, null); },\n getByLabel(label) { return new Locator(\"label\", label, null); },\n getByPlaceholder(p) { return new Locator(\"placeholder\", p, null); },\n getByTestId(id) { return new Locator(\"testId\", id, null); },\n async goBack(options) {\n await __pw_invoke(\"goBack\", [options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n },\n async goForward(options) {\n await __pw_invoke(\"goForward\", [options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n },\n async waitForURL(url, options) {\n return __pw_invoke(\"waitForURL\", [url, options?.timeout || null, options?.waitUntil || null]);\n },\n context() {\n return {\n async clearCookies() {\n return __pw_invoke(\"clearCookies\", []);\n }\n };\n },\n async click(selector) { return this.locator(selector).click(); },\n async fill(selector, value) { return this.locator(selector).fill(value); },\n request: {\n async fetch(url, options) {\n const result = await __pw_invoke(\"request\", [url, options?.method || \"GET\", options?.data, options?.headers]);\n return {\n status: () => result.status,\n ok: () => result.ok,\n headers: () => result.headers,\n json: async () => result.json,\n text: async () => result.text,\n body: async () => result.body,\n };\n },\n async get(url, options) {\n return this.fetch(url, { ...options, method: \"GET\" });\n },\n async post(url, options) {\n return this.fetch(url, { ...options, method: \"POST\" });\n },\n async put(url, options) {\n return this.fetch(url, { ...options, method: \"PUT\" });\n },\n async delete(url, options) {\n return this.fetch(url, { ...options, method: \"DELETE\" });\n },\n },\n };\n})();\n`);\n\n // Locator class\n context.evalSync(`\n(function() {\n class Locator {\n #type; #value; #options;\n constructor(type, value, options) {\n this.#type = type;\n this.#value = value;\n this.#options = options;\n }\n\n _getInfo() { return [this.#type, this.#value, this.#options]; }\n\n async click() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"click\", null]);\n }\n async dblclick() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"dblclick\", null]);\n }\n async fill(text) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"fill\", text]);\n }\n async type(text) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"type\", text]);\n }\n async check() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"check\", null]);\n }\n async uncheck() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"uncheck\", null]);\n }\n async selectOption(value) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"selectOption\", value]);\n }\n async clear() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"clear\", null]);\n }\n async press(key) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"press\", key]);\n }\n async hover() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"hover\", null]);\n }\n async focus() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"focus\", null]);\n }\n async textContent() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getText\", null]);\n }\n async inputValue() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getValue\", null]);\n }\n async isVisible() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isVisible\", null]);\n }\n async isEnabled() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isEnabled\", null]);\n }\n async isChecked() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isChecked\", null]);\n }\n async count() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"count\", null]);\n }\n async getAttribute(name) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getAttribute\", name]);\n }\n async isDisabled() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isDisabled\", null]);\n }\n async isHidden() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isHidden\", null]);\n }\n async innerHTML() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"innerHTML\", null]);\n }\n async innerText() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"innerText\", null]);\n }\n async allTextContents() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"allTextContents\", null]);\n }\n async allInnerTexts() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"allInnerTexts\", null]);\n }\n async waitFor(options) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"waitFor\", options || {}]);\n }\n async boundingBox() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"boundingBox\", null]);\n }\n locator(selector) {\n const parentSelector = this.#type === 'css' ? this.#value : null;\n if (parentSelector) {\n return new Locator(\"css\", parentSelector + \" \" + selector, this.#options);\n }\n // For non-css locators, use css with the combined approach\n return new Locator(\"css\", selector, this.#options);\n }\n async all() {\n const n = await this.count();\n const result = [];\n for (let i = 0; i < n; i++) {\n result.push(this.nth(i));\n }\n return result;\n }\n nth(index) {\n const existingOpts = this.#options ? JSON.parse(this.#options) : {};\n return new Locator(this.#type, this.#value, JSON.stringify({ ...existingOpts, nth: index }));\n }\n first() {\n return this.nth(0);\n }\n last() {\n return this.nth(-1);\n }\n filter(options) {\n const existingOpts = this.#options ? JSON.parse(this.#options) : {};\n const serializedFilter = { ...options };\n if (options.hasText instanceof RegExp) {\n serializedFilter.hasText = { $regex: options.hasText.source, $flags: options.hasText.flags };\n }\n if (options.hasNotText instanceof RegExp) {\n serializedFilter.hasNotText = { $regex: options.hasNotText.source, $flags: options.hasNotText.flags };\n }\n return new Locator(this.#type, this.#value, JSON.stringify({ ...existingOpts, filter: serializedFilter }));\n }\n }\n globalThis.Locator = Locator;\n})();\n`);\n\n // Extend expect with locator matchers (only if test-environment already defined expect)\n context.evalSync(`\n(function() {\n // Helper to create locator matchers\n function createLocatorMatchers(locator, baseMatchers) {\n const info = locator._getInfo();\n\n const locatorMatchers = {\n async toBeVisible(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeVisible\", null, false, options?.timeout]);\n },\n async toContainText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toContainText\", serialized, false, options?.timeout]);\n },\n async toHaveValue(expected, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveValue\", expected, false, options?.timeout]);\n },\n async toBeEnabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEnabled\", null, false, options?.timeout]);\n },\n async toBeChecked(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeChecked\", null, false, options?.timeout]);\n },\n async toHaveAttribute(name, value, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveAttribute\", { name, value }, false, options?.timeout]);\n },\n async toHaveText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveText\", serialized, false, options?.timeout]);\n },\n async toHaveCount(count, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveCount\", count, false, options?.timeout]);\n },\n async toBeHidden(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeHidden\", null, false, options?.timeout]);\n },\n async toBeDisabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeDisabled\", null, false, options?.timeout]);\n },\n async toBeFocused(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeFocused\", null, false, options?.timeout]);\n },\n async toBeEmpty(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEmpty\", null, false, options?.timeout]);\n },\n not: {\n async toBeVisible(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeVisible\", null, true, options?.timeout]);\n },\n async toContainText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toContainText\", serialized, true, options?.timeout]);\n },\n async toHaveValue(expected, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveValue\", expected, true, options?.timeout]);\n },\n async toBeEnabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEnabled\", null, true, options?.timeout]);\n },\n async toBeChecked(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeChecked\", null, true, options?.timeout]);\n },\n async toHaveAttribute(name, value, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveAttribute\", { name, value }, true, options?.timeout]);\n },\n async toHaveText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveText\", serialized, true, options?.timeout]);\n },\n async toHaveCount(count, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveCount\", count, true, options?.timeout]);\n },\n async toBeHidden(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeHidden\", null, true, options?.timeout]);\n },\n async toBeDisabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeDisabled\", null, true, options?.timeout]);\n },\n async toBeFocused(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeFocused\", null, true, options?.timeout]);\n },\n async toBeEmpty(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEmpty\", null, true, options?.timeout]);\n },\n }\n };\n\n // Merge locator matchers with base matchers from test-environment\n if (baseMatchers) {\n return {\n ...baseMatchers,\n ...locatorMatchers,\n not: { ...baseMatchers.not, ...locatorMatchers.not }\n };\n }\n return locatorMatchers;\n }\n\n // Only extend expect if test-environment already defined it\n if (typeof globalThis.expect === 'function') {\n const originalExpect = globalThis.expect;\n globalThis.expect = function(actual) {\n const baseMatchers = originalExpect(actual);\n // If actual is a Locator, add locator-specific matchers\n if (actual && actual.constructor && actual.constructor.name === 'Locator') {\n return createLocatorMatchers(actual, baseMatchers);\n }\n return baseMatchers;\n };\n }\n // If test-environment not loaded, expect remains undefined\n})();\n`);\n\n // ========================================================================\n // Return Handle\n // ========================================================================\n\n return {\n dispose() {\n // Only remove listeners if page was provided directly\n if (page && requestHandler && responseHandler && consoleHandler) {\n page.off(\"request\", requestHandler);\n page.off(\"response\", responseHandler);\n page.off(\"console\", consoleHandler);\n }\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n getBrowserConsoleLogs() {\n return [...browserConsoleLogs];\n },\n getNetworkRequests() {\n return [...networkRequests];\n },\n getNetworkResponses() {\n return [...networkResponses];\n },\n clearCollected() {\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n };\n}\n"
|
|
5
|
+
"import ivm from \"isolated-vm\";\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n PlaywrightEvent,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export protocol types\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\nexport interface NetworkRequestInfo {\n url: string;\n method: string;\n headers: Record<string, string>;\n postData?: string;\n resourceType: string;\n timestamp: number;\n}\n\nexport interface NetworkResponseInfo {\n url: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n timestamp: number;\n}\n\n/**\n * Browser console log entry - logs from the page context (not sandbox).\n */\nexport interface BrowserConsoleLogEntry {\n level: string;\n stdout: string;\n timestamp: number;\n}\n\n/**\n * Callback type for handling playwright operations.\n * Used for remote execution where the page lives on the client.\n */\nexport type PlaywrightCallback = (\n op: PlaywrightOperation\n) => Promise<PlaywrightResult>;\n\n/**\n * Options for setting up playwright in an isolate.\n */\nexport interface PlaywrightSetupOptions {\n /** Direct page object (for local use) */\n page?: Page;\n /** Handler callback (for remote use - daemon invokes this) */\n handler?: PlaywrightCallback;\n /** Default timeout for operations */\n timeout?: number;\n /** If true, browser console logs are printed to stdout */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\n}\n\n/**\n * @deprecated Use PlaywrightSetupOptions instead\n */\nexport interface PlaywrightOptions {\n page: Page;\n timeout?: number;\n onNetworkRequest?: (info: NetworkRequestInfo) => void;\n onNetworkResponse?: (info: NetworkResponseInfo) => void;\n}\n\nexport interface PlaywrightHandle {\n dispose(): void;\n /** Get browser console logs (from the page, not sandbox) */\n getBrowserConsoleLogs(): BrowserConsoleLogEntry[];\n getNetworkRequests(): NetworkRequestInfo[];\n getNetworkResponses(): NetworkResponseInfo[];\n clearCollected(): void;\n}\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n delete roleOptions.filter;\n // Deserialize regex name\n if (roleOptions.name && typeof roleOptions.name === 'object' && roleOptions.name.$regex) {\n roleOptions.name = new RegExp(roleOptions.name.$regex, roleOptions.name.$flags);\n }\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n case \"or\": {\n // Composite locator: selectorValue is JSON array of [firstInfo, secondInfo]\n const [firstInfo, secondInfo] = JSON.parse(selectorValue) as [[string, string, string | null], [string, string, string | null]];\n const first = getLocator(page, firstInfo[0], firstInfo[1], firstInfo[2]);\n const second = getLocator(page, secondInfo[0], secondInfo[1], secondInfo[2]);\n locator = first.or(second);\n break;\n }\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n // Apply filter if specified\n if (options?.filter) {\n const filterOpts = { ...options.filter };\n if (filterOpts.hasText && typeof filterOpts.hasText === 'object' && filterOpts.hasText.$regex) {\n filterOpts.hasText = new RegExp(filterOpts.hasText.$regex, filterOpts.hasText.$flags);\n }\n if (filterOpts.hasNotText && typeof filterOpts.hasNotText === 'object' && filterOpts.hasNotText.$regex) {\n filterOpts.hasNotText = new RegExp(filterOpts.hasNotText.$regex, filterOpts.hasNotText.$flags);\n }\n locator = locator.filter(filterOpts);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n case \"getAttribute\":\n return await locator.getAttribute(String(actionArg ?? \"\"), { timeout });\n case \"isDisabled\":\n return await locator.isDisabled();\n case \"isHidden\":\n return await locator.isHidden();\n case \"innerHTML\":\n return await locator.innerHTML({ timeout });\n case \"innerText\":\n return await locator.innerText({ timeout });\n case \"allTextContents\":\n return await locator.allTextContents();\n case \"allInnerTexts\":\n return await locator.allInnerTexts();\n case \"waitFor\": {\n const opts = actionArg && typeof actionArg === 'object' ? actionArg as Record<string, unknown> : {};\n await locator.waitFor({ state: opts.state as any, timeout: (opts.timeout as number) ?? timeout });\n return null;\n }\n case \"boundingBox\":\n return await locator.boundingBox({ timeout });\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n let matches: boolean;\n let expectedDisplay: string;\n if (expected && typeof expected === 'object' && (expected as any).$regex) {\n const regex = new RegExp((expected as any).$regex, (expected as any).$flags);\n matches = regex.test(text ?? '');\n expectedDisplay = String(regex);\n } else {\n matches = text?.includes(String(expected)) ?? false;\n expectedDisplay = String(expected);\n }\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain ${expectedDisplay}, but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain ${expectedDisplay}, but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n case \"toHaveAttribute\": {\n const { name, value } = expected as { name: string; value: unknown };\n const actual = await locator.getAttribute(name, { timeout });\n if (value instanceof RegExp || (value && typeof value === 'object' && (value as any).$regex)) {\n const regex = (value as any).$regex ? new RegExp((value as any).$regex, (value as any).$flags) : value as RegExp;\n const matches = regex.test(actual ?? '');\n if (negated) {\n if (matches) throw new Error(`Expected attribute \"${name}\" to not match ${regex}, but got \"${actual}\"`);\n } else {\n if (!matches) throw new Error(`Expected attribute \"${name}\" to match ${regex}, but got \"${actual}\"`);\n }\n } else {\n const matches = actual === String(value);\n if (negated) {\n if (matches) throw new Error(`Expected attribute \"${name}\" to not be \"${value}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected attribute \"${name}\" to be \"${value}\", but got \"${actual}\"`);\n }\n }\n break;\n }\n case \"toHaveText\": {\n const text = (await locator.textContent({ timeout })) ?? '';\n let matches: boolean;\n let expectedDisplay: string;\n if (expected && typeof expected === 'object' && (expected as any).$regex) {\n const regex = new RegExp((expected as any).$regex, (expected as any).$flags);\n matches = regex.test(text);\n expectedDisplay = String(regex);\n } else {\n matches = text === String(expected);\n expectedDisplay = JSON.stringify(expected);\n }\n if (negated) {\n if (matches) throw new Error(`Expected text to not be ${expectedDisplay}, but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to be ${expectedDisplay}, but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveCount\": {\n const count = await locator.count();\n const expectedCount = Number(expected);\n if (negated) {\n if (count === expectedCount) throw new Error(`Expected count to not be ${expectedCount}, but it was`);\n } else {\n if (count !== expectedCount) throw new Error(`Expected count to be ${expectedCount}, but got ${count}`);\n }\n break;\n }\n case \"toBeHidden\": {\n const isHidden = await locator.isHidden();\n if (negated) {\n if (isHidden) throw new Error(\"Expected element to not be hidden, but it was hidden\");\n } else {\n if (!isHidden) throw new Error(\"Expected element to be hidden, but it was not\");\n }\n break;\n }\n case \"toBeDisabled\": {\n const isDisabled = await locator.isDisabled();\n if (negated) {\n if (isDisabled) throw new Error(\"Expected element to not be disabled, but it was disabled\");\n } else {\n if (!isDisabled) throw new Error(\"Expected element to be disabled, but it was not\");\n }\n break;\n }\n case \"toBeFocused\": {\n const isFocused = await locator.evaluate((el) => document.activeElement === el).catch(() => false);\n if (negated) {\n if (isFocused) throw new Error(\"Expected element to not be focused, but it was focused\");\n } else {\n if (!isFocused) throw new Error(\"Expected element to be focused, but it was not\");\n }\n break;\n }\n case \"toBeEmpty\": {\n const text = await locator.textContent({ timeout });\n const value = await locator.inputValue({ timeout }).catch(() => null);\n const isEmpty = (value !== null ? value === '' : (text ?? '') === '');\n if (negated) {\n if (isEmpty) throw new Error(\"Expected element to not be empty, but it was\");\n } else {\n if (!isEmpty) throw new Error(\"Expected element to be empty, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n await page.goto(url, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script, arg] = op.args as [string, unknown];\n if (op.args.length > 1) {\n const fn = new Function('return (' + script + ')')();\n const result = await page.evaluate(fn, arg);\n return { ok: true, value: result };\n }\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(url, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n case \"goBack\": {\n const [waitUntil] = op.args as [string?];\n await page.goBack({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"goForward\": {\n const [waitUntil] = op.args as [string?];\n await page.goForward({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"waitForURL\": {\n const [url, customTimeout, waitUntil] = op.args as [string, number?, string?];\n await page.waitForURL(url, {\n timeout: customTimeout ?? timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? undefined,\n });\n return { ok: true };\n }\n case \"clearCookies\": {\n await page.context().clearCookies();\n return { ok: true };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n\n// ============================================================================\n// Setup Playwright\n// ============================================================================\n\n/**\n * Set up playwright in an isolate context.\n *\n * For local use: provide `page` option (direct page access)\n * For remote use: provide `handler` option (callback pattern)\n */\nexport async function setupPlaywright(\n context: ivm.Context,\n options: PlaywrightSetupOptions | PlaywrightOptions\n): Promise<PlaywrightHandle> {\n const timeout = options.timeout ?? 30000;\n\n // Determine if we have a page or handler\n const page = \"page\" in options ? options.page : undefined;\n const handler = \"handler\" in options ? options.handler : undefined;\n\n // Create handler from page if needed\n const effectiveHandler = handler ?? (page ? createPlaywrightHandler(page, { timeout }) : undefined);\n\n if (!effectiveHandler) {\n throw new Error(\"Either page or handler must be provided to setupPlaywright\");\n }\n\n // State for collected data (only used when page is provided directly)\n const browserConsoleLogs: BrowserConsoleLogEntry[] = [];\n const networkRequests: NetworkRequestInfo[] = [];\n const networkResponses: NetworkResponseInfo[] = [];\n\n const global = context.global;\n\n // ========================================================================\n // Event Capture (only when page is provided directly)\n // ========================================================================\n\n let requestHandler: ((request: import(\"playwright\").Request) => void) | undefined;\n let responseHandler: ((response: import(\"playwright\").Response) => void) | undefined;\n let consoleHandler: ((msg: import(\"playwright\").ConsoleMessage) => void) | undefined;\n\n if (page) {\n // Get onEvent callback if provided\n const onEvent = \"onEvent\" in options ? options.onEvent : undefined;\n\n requestHandler = (request: import(\"playwright\").Request) => {\n const info: NetworkRequestInfo = {\n url: request.url(),\n method: request.method(),\n headers: request.headers(),\n postData: request.postData() ?? undefined,\n resourceType: request.resourceType(),\n timestamp: Date.now(),\n };\n networkRequests.push(info);\n\n if (onEvent) {\n onEvent({\n type: \"networkRequest\",\n url: info.url,\n method: info.method,\n headers: info.headers,\n postData: info.postData,\n resourceType: info.resourceType,\n timestamp: info.timestamp,\n });\n }\n };\n\n responseHandler = (response: import(\"playwright\").Response) => {\n const info: NetworkResponseInfo = {\n url: response.url(),\n status: response.status(),\n statusText: response.statusText(),\n headers: response.headers(),\n timestamp: Date.now(),\n };\n networkResponses.push(info);\n\n if (onEvent) {\n onEvent({\n type: \"networkResponse\",\n url: info.url,\n status: info.status,\n statusText: info.statusText,\n headers: info.headers,\n timestamp: info.timestamp,\n });\n }\n };\n\n consoleHandler = (msg: import(\"playwright\").ConsoleMessage) => {\n const args = msg.args().map((arg) => String(arg));\n const entry: BrowserConsoleLogEntry = {\n level: msg.type(),\n stdout: args.join(\" \"),\n timestamp: Date.now(),\n };\n browserConsoleLogs.push(entry);\n\n if (onEvent) {\n onEvent({\n type: \"browserConsoleLog\",\n level: entry.level,\n stdout: entry.stdout,\n timestamp: entry.timestamp,\n });\n }\n\n // Print to stdout if console option is true\n if (\"console\" in options && options.console) {\n const prefix = `[browser:${entry.level}]`;\n console.log(prefix, entry.stdout);\n }\n };\n\n page.on(\"request\", requestHandler);\n page.on(\"response\", responseHandler);\n page.on(\"console\", consoleHandler);\n }\n\n // ========================================================================\n // Unified Handler Reference\n // ========================================================================\n\n // Single handler reference that receives operation objects\n global.setSync(\n \"__Playwright_handler_ref\",\n new ivm.Reference(async (opJson: string): Promise<string> => {\n const op = JSON.parse(opJson) as PlaywrightOperation;\n const result = await effectiveHandler(op);\n return JSON.stringify(result);\n })\n );\n\n // ========================================================================\n // Injected JavaScript\n // ========================================================================\n\n // Helper function to invoke handler and handle errors\n context.evalSync(`\n(function() {\n globalThis.__pw_invoke = async function(type, args) {\n const op = JSON.stringify({ type, args });\n const resultJson = __Playwright_handler_ref.applySyncPromise(undefined, [op]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n})();\n`);\n\n // Page object\n context.evalSync(`\n(function() {\n let __pw_currentUrl = '';\n globalThis.page = {\n async goto(url, options) {\n const result = await __pw_invoke(\"goto\", [url, options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n __pw_currentUrl = resolvedUrl || url;\n return result;\n },\n async reload() {\n const result = await __pw_invoke(\"reload\", []);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n return result;\n },\n url() {\n return __pw_currentUrl;\n },\n async title() {\n return __pw_invoke(\"title\", []);\n },\n async content() {\n return __pw_invoke(\"content\", []);\n },\n async waitForSelector(selector, options) {\n return __pw_invoke(\"waitForSelector\", [selector, options ? JSON.stringify(options) : null]);\n },\n async waitForTimeout(ms) {\n return __pw_invoke(\"waitForTimeout\", [ms]);\n },\n async waitForLoadState(state) {\n return __pw_invoke(\"waitForLoadState\", [state || null]);\n },\n async evaluate(script, arg) {\n const hasArg = arguments.length > 1;\n if (hasArg) {\n const serialized = typeof script === \"function\" ? script.toString() : script;\n return __pw_invoke(\"evaluate\", [serialized, arg]);\n }\n const serialized = typeof script === \"function\" ? \"(\" + script.toString() + \")()\" : script;\n return __pw_invoke(\"evaluate\", [serialized]);\n },\n locator(selector) { return new Locator(\"css\", selector, null); },\n getByRole(role, options) {\n if (options) {\n const serialized = { ...options };\n // Use duck-typing RegExp detection (instanceof fails across isolated-vm boundary)\n const name = options.name;\n if (name && typeof name === 'object' && typeof name.source === 'string' && typeof name.flags === 'string') {\n serialized.name = { $regex: name.source, $flags: name.flags };\n }\n return new Locator(\"role\", role, JSON.stringify(serialized));\n }\n return new Locator(\"role\", role, null);\n },\n getByText(text) { return new Locator(\"text\", text, null); },\n getByLabel(label) { return new Locator(\"label\", label, null); },\n getByPlaceholder(p) { return new Locator(\"placeholder\", p, null); },\n getByTestId(id) { return new Locator(\"testId\", id, null); },\n async goBack(options) {\n await __pw_invoke(\"goBack\", [options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n },\n async goForward(options) {\n await __pw_invoke(\"goForward\", [options?.waitUntil || null]);\n const resolvedUrl = await __pw_invoke(\"url\", []);\n if (resolvedUrl) __pw_currentUrl = resolvedUrl;\n },\n async waitForURL(url, options) {\n return __pw_invoke(\"waitForURL\", [url, options?.timeout || null, options?.waitUntil || null]);\n },\n context() {\n return {\n async clearCookies() {\n return __pw_invoke(\"clearCookies\", []);\n }\n };\n },\n async click(selector) { return this.locator(selector).click(); },\n async fill(selector, value) { return this.locator(selector).fill(value); },\n request: {\n async fetch(url, options) {\n const result = await __pw_invoke(\"request\", [url, options?.method || \"GET\", options?.data, options?.headers]);\n return {\n status: () => result.status,\n ok: () => result.ok,\n headers: () => result.headers,\n json: async () => result.json,\n text: async () => result.text,\n body: async () => result.body,\n };\n },\n async get(url, options) {\n return this.fetch(url, { ...options, method: \"GET\" });\n },\n async post(url, options) {\n return this.fetch(url, { ...options, method: \"POST\" });\n },\n async put(url, options) {\n return this.fetch(url, { ...options, method: \"PUT\" });\n },\n async delete(url, options) {\n return this.fetch(url, { ...options, method: \"DELETE\" });\n },\n },\n };\n})();\n`);\n\n // Locator class\n context.evalSync(`\n(function() {\n class Locator {\n #type; #value; #options;\n constructor(type, value, options) {\n this.#type = type;\n this.#value = value;\n this.#options = options;\n }\n\n _getInfo() { return [this.#type, this.#value, this.#options]; }\n\n async click() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"click\", null]);\n }\n async dblclick() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"dblclick\", null]);\n }\n async fill(text) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"fill\", text]);\n }\n async type(text) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"type\", text]);\n }\n async check() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"check\", null]);\n }\n async uncheck() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"uncheck\", null]);\n }\n async selectOption(value) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"selectOption\", value]);\n }\n async clear() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"clear\", null]);\n }\n async press(key) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"press\", key]);\n }\n async hover() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"hover\", null]);\n }\n async focus() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"focus\", null]);\n }\n async textContent() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getText\", null]);\n }\n async inputValue() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getValue\", null]);\n }\n async isVisible() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isVisible\", null]);\n }\n async isEnabled() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isEnabled\", null]);\n }\n async isChecked() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isChecked\", null]);\n }\n async count() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"count\", null]);\n }\n async getAttribute(name) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"getAttribute\", name]);\n }\n async isDisabled() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isDisabled\", null]);\n }\n async isHidden() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"isHidden\", null]);\n }\n async innerHTML() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"innerHTML\", null]);\n }\n async innerText() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"innerText\", null]);\n }\n async allTextContents() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"allTextContents\", null]);\n }\n async allInnerTexts() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"allInnerTexts\", null]);\n }\n async waitFor(options) {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"waitFor\", options || {}]);\n }\n async boundingBox() {\n return __pw_invoke(\"locatorAction\", [...this._getInfo(), \"boundingBox\", null]);\n }\n locator(selector) {\n const parentSelector = this.#type === 'css' ? this.#value : null;\n if (parentSelector) {\n return new Locator(\"css\", parentSelector + \" \" + selector, this.#options);\n }\n // For non-css locators, use css with the combined approach\n return new Locator(\"css\", selector, this.#options);\n }\n async all() {\n const n = await this.count();\n const result = [];\n for (let i = 0; i < n; i++) {\n result.push(this.nth(i));\n }\n return result;\n }\n nth(index) {\n const existingOpts = this.#options ? JSON.parse(this.#options) : {};\n return new Locator(this.#type, this.#value, JSON.stringify({ ...existingOpts, nth: index }));\n }\n first() {\n return this.nth(0);\n }\n last() {\n return this.nth(-1);\n }\n filter(options) {\n const existingOpts = this.#options ? JSON.parse(this.#options) : {};\n const serializedFilter = { ...options };\n // Use duck-typing RegExp detection (instanceof fails across isolated-vm boundary)\n const hasText = options.hasText;\n if (hasText && typeof hasText === 'object' && typeof hasText.source === 'string' && typeof hasText.flags === 'string') {\n serializedFilter.hasText = { $regex: hasText.source, $flags: hasText.flags };\n }\n const hasNotText = options.hasNotText;\n if (hasNotText && typeof hasNotText === 'object' && typeof hasNotText.source === 'string' && typeof hasNotText.flags === 'string') {\n serializedFilter.hasNotText = { $regex: hasNotText.source, $flags: hasNotText.flags };\n }\n return new Locator(this.#type, this.#value, JSON.stringify({ ...existingOpts, filter: serializedFilter }));\n }\n or(other) {\n // Create a composite locator that matches either this or other\n const thisInfo = this._getInfo();\n const otherInfo = other._getInfo();\n return new Locator(\"or\", JSON.stringify([thisInfo, otherInfo]), null);\n }\n }\n globalThis.Locator = Locator;\n})();\n`);\n\n // Extend expect with locator matchers (only if test-environment already defined expect)\n context.evalSync(`\n(function() {\n // Helper to create locator matchers\n function createLocatorMatchers(locator, baseMatchers) {\n const info = locator._getInfo();\n\n const locatorMatchers = {\n async toBeVisible(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeVisible\", null, false, options?.timeout]);\n },\n async toContainText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toContainText\", serialized, false, options?.timeout]);\n },\n async toHaveValue(expected, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveValue\", expected, false, options?.timeout]);\n },\n async toBeEnabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEnabled\", null, false, options?.timeout]);\n },\n async toBeChecked(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeChecked\", null, false, options?.timeout]);\n },\n async toHaveAttribute(name, value, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveAttribute\", { name, value }, false, options?.timeout]);\n },\n async toHaveText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveText\", serialized, false, options?.timeout]);\n },\n async toHaveCount(count, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveCount\", count, false, options?.timeout]);\n },\n async toBeHidden(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeHidden\", null, false, options?.timeout]);\n },\n async toBeDisabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeDisabled\", null, false, options?.timeout]);\n },\n async toBeFocused(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeFocused\", null, false, options?.timeout]);\n },\n async toBeEmpty(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEmpty\", null, false, options?.timeout]);\n },\n not: {\n async toBeVisible(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeVisible\", null, true, options?.timeout]);\n },\n async toContainText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toContainText\", serialized, true, options?.timeout]);\n },\n async toHaveValue(expected, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveValue\", expected, true, options?.timeout]);\n },\n async toBeEnabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEnabled\", null, true, options?.timeout]);\n },\n async toBeChecked(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeChecked\", null, true, options?.timeout]);\n },\n async toHaveAttribute(name, value, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveAttribute\", { name, value }, true, options?.timeout]);\n },\n async toHaveText(expected, options) {\n const serialized = expected instanceof RegExp ? { $regex: expected.source, $flags: expected.flags } : expected;\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveText\", serialized, true, options?.timeout]);\n },\n async toHaveCount(count, options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toHaveCount\", count, true, options?.timeout]);\n },\n async toBeHidden(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeHidden\", null, true, options?.timeout]);\n },\n async toBeDisabled(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeDisabled\", null, true, options?.timeout]);\n },\n async toBeFocused(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeFocused\", null, true, options?.timeout]);\n },\n async toBeEmpty(options) {\n return __pw_invoke(\"expectLocator\", [...info, \"toBeEmpty\", null, true, options?.timeout]);\n },\n }\n };\n\n // Merge locator matchers with base matchers from test-environment\n if (baseMatchers) {\n return {\n ...baseMatchers,\n ...locatorMatchers,\n not: { ...baseMatchers.not, ...locatorMatchers.not }\n };\n }\n return locatorMatchers;\n }\n\n // Only extend expect if test-environment already defined it\n if (typeof globalThis.expect === 'function') {\n const originalExpect = globalThis.expect;\n globalThis.expect = function(actual) {\n const baseMatchers = originalExpect(actual);\n // If actual is a Locator, add locator-specific matchers\n if (actual && actual.constructor && actual.constructor.name === 'Locator') {\n return createLocatorMatchers(actual, baseMatchers);\n }\n return baseMatchers;\n };\n }\n // If test-environment not loaded, expect remains undefined\n})();\n`);\n\n // ========================================================================\n // Return Handle\n // ========================================================================\n\n return {\n dispose() {\n // Only remove listeners if page was provided directly\n if (page && requestHandler && responseHandler && consoleHandler) {\n page.off(\"request\", requestHandler);\n page.off(\"response\", responseHandler);\n page.off(\"console\", consoleHandler);\n }\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n getBrowserConsoleLogs() {\n return [...browserConsoleLogs];\n },\n getNetworkRequests() {\n return [...networkRequests];\n },\n getNetworkResponses() {\n return [...networkResponses];\n },\n clearCollected() {\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA2GlB;AAAA,EAGC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAkIlB;AAAA,EAGC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgHlB;AAAA,EAMC,OAAO;AAAA,IACL,OAAO,GAAG;AAAA,MAER,IAAI,QAAQ,kBAAkB,mBAAmB,gBAAgB;AAAA,QAC/D,KAAK,IAAI,WAAW,cAAc;AAAA,QAClC,KAAK,IAAI,YAAY,eAAe;AAAA,QACpC,KAAK,IAAI,WAAW,cAAc;AAAA,MACpC;AAAA,MACA,mBAAmB,SAAS;AAAA,MAC5B,gBAAgB,SAAS;AAAA,MACzB,iBAAiB,SAAS;AAAA;AAAA,IAE5B,qBAAqB,GAAG;AAAA,MACtB,OAAO,CAAC,GAAG,kBAAkB;AAAA;AAAA,IAE/B,kBAAkB,GAAG;AAAA,MACnB,OAAO,CAAC,GAAG,eAAe;AAAA;AAAA,IAE5B,mBAAmB,GAAG;AAAA,MACpB,OAAO,CAAC,GAAG,gBAAgB;AAAA;AAAA,IAE7B,cAAc,GAAG;AAAA,MACf,mBAAmB,SAAS;AAAA,MAC5B,gBAAgB,SAAS;AAAA,MACzB,iBAAiB,SAAS;AAAA;AAAA,EAE9B;AAAA;",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAgB,IAAhB;AAwFA,SAAS,UAAU,CACjB,MACA,cACA,eACA,aACmB;AAAA,EAEnB,MAAM,UAAU,cAAc,KAAK,MAAM,WAAW,IAAI;AAAA,EACxD,MAAM,WAAW,SAAS;AAAA,EAG1B,MAAM,cAAc,UAAU,KAAK,QAAQ,IAAI;AAAA,EAC/C,IAAI,aAAa;AAAA,IACf,OAAO,YAAY;AAAA,IACnB,OAAO,YAAY;AAAA,IAEnB,IAAI,YAAY,QAAQ,OAAO,YAAY,SAAS,YAAY,YAAY,KAAK,QAAQ;AAAA,MACvF,YAAY,OAAO,IAAI,OAAO,YAAY,KAAK,QAAQ,YAAY,KAAK,MAAM;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,EACJ,QAAQ;AAAA,SACD;AAAA,MACH,UAAU,KAAK,QAAQ,aAAa;AAAA,MACpC;AAAA,SACG;AAAA,MACH,UAAU,KAAK,UACb,eACA,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,cAAc,SACrE;AAAA,MACA;AAAA,SACG;AAAA,MACH,UAAU,KAAK,UAAU,aAAa;AAAA,MACtC;AAAA,SACG;AAAA,MACH,UAAU,KAAK,WAAW,aAAa;AAAA,MACvC;AAAA,SACG;AAAA,MACH,UAAU,KAAK,iBAAiB,aAAa;AAAA,MAC7C;AAAA,SACG;AAAA,MACH,UAAU,KAAK,YAAY,aAAa;AAAA,MACxC;AAAA,SACG,MAAM;AAAA,MAET,OAAO,WAAW,cAAc,KAAK,MAAM,aAAa;AAAA,MACxD,MAAM,QAAQ,WAAW,MAAM,UAAU,IAAI,UAAU,IAAI,UAAU,EAAE;AAAA,MACvE,MAAM,SAAS,WAAW,MAAM,WAAW,IAAI,WAAW,IAAI,WAAW,EAAE;AAAA,MAC3E,UAAU,MAAM,GAAG,MAAM;AAAA,MACzB;AAAA,IACF;AAAA;AAAA,MAEE,UAAU,KAAK,QAAQ,aAAa;AAAA;AAAA,EAIxC,IAAI,aAAa,WAAW;AAAA,IAC1B,UAAU,QAAQ,IAAI,QAAQ;AAAA,EAChC;AAAA,EAGA,IAAI,SAAS,QAAQ;AAAA,IACnB,MAAM,aAAa,KAAK,QAAQ,OAAO;AAAA,IACvC,IAAI,WAAW,WAAW,OAAO,WAAW,YAAY,YAAY,WAAW,QAAQ,QAAQ;AAAA,MAC7F,WAAW,UAAU,IAAI,OAAO,WAAW,QAAQ,QAAQ,WAAW,QAAQ,MAAM;AAAA,IACtF;AAAA,IACA,IAAI,WAAW,cAAc,OAAO,WAAW,eAAe,YAAY,WAAW,WAAW,QAAQ;AAAA,MACtG,WAAW,aAAa,IAAI,OAAO,WAAW,WAAW,QAAQ,WAAW,WAAW,MAAM;AAAA,IAC/F;AAAA,IACA,UAAU,QAAQ,OAAO,UAAU;AAAA,EACrC;AAAA,EAEA,OAAO;AAAA;AAOT,eAAe,oBAAoB,CACjC,SACA,QACA,WACA,SACkB;AAAA,EAClB,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,SAAS,EAAE,QAAQ,CAAC;AAAA,MAClC,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,KAAK,OAAO,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,MACvD,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,kBAAkB,OAAO,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,MACpE,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,QAAQ,EAAE,QAAQ,CAAC;AAAA,MACjC,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,aAAa,OAAO,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,MAC/D,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,MAAM,OAAO,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,MACxD,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAAA,SACJ;AAAA,MACH,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAAA,SACJ;AAAA,MACH,OAAO,MAAM,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,SACzC;AAAA,MACH,OAAO,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,SACxC;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU;AAAA,SAC5B;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU;AAAA,SAC5B;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU;AAAA,SAC5B;AAAA,MACH,OAAO,MAAM,QAAQ,MAAM;AAAA,SACxB;AAAA,MACH,OAAO,MAAM,QAAQ,aAAa,OAAO,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,SACnE;AAAA,MACH,OAAO,MAAM,QAAQ,WAAW;AAAA,SAC7B;AAAA,MACH,OAAO,MAAM,QAAQ,SAAS;AAAA,SAC3B;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU,EAAE,QAAQ,CAAC;AAAA,SACvC;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU,EAAE,QAAQ,CAAC;AAAA,SACvC;AAAA,MACH,OAAO,MAAM,QAAQ,gBAAgB;AAAA,SAClC;AAAA,MACH,OAAO,MAAM,QAAQ,cAAc;AAAA,SAChC,WAAW;AAAA,MACd,MAAM,OAAO,aAAa,OAAO,cAAc,WAAW,YAAuC,CAAC;AAAA,MAClG,MAAM,QAAQ,QAAQ,EAAE,OAAO,KAAK,OAAc,SAAU,KAAK,WAAsB,QAAQ,CAAC;AAAA,MAChG,OAAO;AAAA,IACT;AAAA,SACK;AAAA,MACH,OAAO,MAAM,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA;AAAA,MAE5C,MAAM,IAAI,MAAM,mBAAmB,QAAQ;AAAA;AAAA;AAQjD,eAAe,sBAAsB,CACnC,SACA,SACA,UACA,SACA,SACe;AAAA,EACf,QAAQ;AAAA,SACD,eAAe;AAAA,MAClB,MAAM,YAAY,MAAM,QAAQ,UAAU;AAAA,MAC1C,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAW,MAAM,IAAI,MAAM,wDAAwD;AAAA,MACzF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,gDAAgD;AAAA;AAAA,MAElF;AAAA,IACF;AAAA,SACK,iBAAiB;AAAA,MACpB,MAAM,OAAO,MAAM,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,MAClD,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,YAAY,OAAO,aAAa,YAAa,SAAiB,QAAQ;AAAA,QACxE,MAAM,QAAQ,IAAI,OAAQ,SAAiB,QAAS,SAAiB,MAAM;AAAA,QAC3E,UAAU,MAAM,KAAK,QAAQ,EAAE;AAAA,QAC/B,kBAAkB,OAAO,KAAK;AAAA,MAChC,EAAO;AAAA,QACL,UAAU,MAAM,SAAS,OAAO,QAAQ,CAAC,KAAK;AAAA,QAC9C,kBAAkB,OAAO,QAAQ;AAAA;AAAA,MAEnC,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAS,MAAM,IAAI,MAAM,gCAAgC,6BAA6B,OAAO;AAAA,MACnG,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAS,MAAM,IAAI,MAAM,4BAA4B,6BAA6B,OAAO;AAAA;AAAA,MAEhG;AAAA,IACF;AAAA,SACK,eAAe;AAAA,MAClB,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,MAClD,MAAM,UAAU,UAAU,OAAO,QAAQ;AAAA,MACzC,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAS,MAAM,IAAI,MAAM,6BAA6B,uBAAuB;AAAA,MACnF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAS,MAAM,IAAI,MAAM,yBAAyB,uBAAuB,QAAQ;AAAA;AAAA,MAExF;AAAA,IACF;AAAA,SACK,eAAe;AAAA,MAClB,MAAM,YAAY,MAAM,QAAQ,UAAU;AAAA,MAC1C,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAW,MAAM,IAAI,MAAM,qDAAqD;AAAA,MACtF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,qDAAqD;AAAA;AAAA,MAEvF;AAAA,IACF;AAAA,SACK,eAAe;AAAA,MAClB,MAAM,YAAY,MAAM,QAAQ,UAAU;AAAA,MAC1C,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAW,MAAM,IAAI,MAAM,wDAAwD;AAAA,MACzF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,gDAAgD;AAAA;AAAA,MAElF;AAAA,IACF;AAAA,SACK,mBAAmB;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,MAAM,SAAS,MAAM,QAAQ,aAAa,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC3D,IAAI,iBAAiB,UAAW,SAAS,OAAO,UAAU,YAAa,MAAc,QAAS;AAAA,QAC5F,MAAM,QAAS,MAAc,SAAS,IAAI,OAAQ,MAAc,QAAS,MAAc,MAAM,IAAI;AAAA,QACjG,MAAM,UAAU,MAAM,KAAK,UAAU,EAAE;AAAA,QACvC,IAAI,SAAS;AAAA,UACX,IAAI;AAAA,YAAS,MAAM,IAAI,MAAM,uBAAuB,sBAAsB,mBAAmB,SAAS;AAAA,QACxG,EAAO;AAAA,UACL,IAAI,CAAC;AAAA,YAAS,MAAM,IAAI,MAAM,uBAAuB,kBAAkB,mBAAmB,SAAS;AAAA;AAAA,MAEvG,EAAO;AAAA,QACL,MAAM,UAAU,WAAW,OAAO,KAAK;AAAA,QACvC,IAAI,SAAS;AAAA,UACX,IAAI;AAAA,YAAS,MAAM,IAAI,MAAM,uBAAuB,oBAAoB,oBAAoB;AAAA,QAC9F,EAAO;AAAA,UACL,IAAI,CAAC;AAAA,YAAS,MAAM,IAAI,MAAM,uBAAuB,gBAAgB,oBAAoB,SAAS;AAAA;AAAA;AAAA,MAGtG;AAAA,IACF;AAAA,SACK,cAAc;AAAA,MACjB,MAAM,OAAQ,MAAM,QAAQ,YAAY,EAAE,QAAQ,CAAC,KAAM;AAAA,MACzD,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,YAAY,OAAO,aAAa,YAAa,SAAiB,QAAQ;AAAA,QACxE,MAAM,QAAQ,IAAI,OAAQ,SAAiB,QAAS,SAAiB,MAAM;AAAA,QAC3E,UAAU,MAAM,KAAK,IAAI;AAAA,QACzB,kBAAkB,OAAO,KAAK;AAAA,MAChC,EAAO;AAAA,QACL,UAAU,SAAS,OAAO,QAAQ;AAAA,QAClC,kBAAkB,KAAK,UAAU,QAAQ;AAAA;AAAA,MAE3C,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAS,MAAM,IAAI,MAAM,2BAA2B,6BAA6B,OAAO;AAAA,MAC9F,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAS,MAAM,IAAI,MAAM,uBAAuB,6BAA6B,OAAO;AAAA;AAAA,MAE3F;AAAA,IACF;AAAA,SACK,eAAe;AAAA,MAClB,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,MAClC,MAAM,gBAAgB,OAAO,QAAQ;AAAA,MACrC,IAAI,SAAS;AAAA,QACX,IAAI,UAAU;AAAA,UAAe,MAAM,IAAI,MAAM,4BAA4B,2BAA2B;AAAA,MACtG,EAAO;AAAA,QACL,IAAI,UAAU;AAAA,UAAe,MAAM,IAAI,MAAM,wBAAwB,0BAA0B,OAAO;AAAA;AAAA,MAExG;AAAA,IACF;AAAA,SACK,cAAc;AAAA,MACjB,MAAM,WAAW,MAAM,QAAQ,SAAS;AAAA,MACxC,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAU,MAAM,IAAI,MAAM,sDAAsD;AAAA,MACtF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAU,MAAM,IAAI,MAAM,+CAA+C;AAAA;AAAA,MAEhF;AAAA,IACF;AAAA,SACK,gBAAgB;AAAA,MACnB,MAAM,aAAa,MAAM,QAAQ,WAAW;AAAA,MAC5C,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAY,MAAM,IAAI,MAAM,0DAA0D;AAAA,MAC5F,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAY,MAAM,IAAI,MAAM,iDAAiD;AAAA;AAAA,MAEpF;AAAA,IACF;AAAA,SACK,eAAe;AAAA,MAClB,MAAM,YAAY,MAAM,QAAQ,SAAS,CAAC,OAAO,SAAS,kBAAkB,EAAE,EAAE,MAAM,MAAM,KAAK;AAAA,MACjG,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAW,MAAM,IAAI,MAAM,wDAAwD;AAAA,MACzF,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,gDAAgD;AAAA;AAAA,MAElF;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MAChB,MAAM,OAAO,MAAM,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,MAClD,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,MACpE,MAAM,UAAW,UAAU,OAAO,UAAU,MAAM,QAAQ,QAAQ;AAAA,MAClE,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UAAS,MAAM,IAAI,MAAM,8CAA8C;AAAA,MAC7E,EAAO;AAAA,QACL,IAAI,CAAC;AAAA,UAAS,MAAM,IAAI,MAAM,8CAA8C;AAAA;AAAA,MAE9E;AAAA,IACF;AAAA;AAAA,MAEE,MAAM,IAAI,MAAM,oBAAoB,SAAS;AAAA;AAAA;AAa5C,SAAS,uBAAuB,CACrC,MACA,SACoB;AAAA,EACpB,MAAM,UAAU,SAAS,WAAW;AAAA,EAEpC,OAAO,OAAO,OAAuD;AAAA,IACnE,IAAI;AAAA,MACF,QAAQ,GAAG;AAAA,aACJ,QAAQ;AAAA,UACX,OAAO,KAAK,aAAa,GAAG;AAAA,UAC5B,MAAM,KAAK,KAAK,KAAK;AAAA,YACnB;AAAA,YACA,WAAY,aAA6D;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK;AAAA,UACH,MAAM,KAAK,OAAO,EAAE,QAAQ,CAAC;AAAA,UAC7B,OAAO,EAAE,IAAI,KAAK;AAAA,aACf;AAAA,UACH,OAAO,EAAE,IAAI,MAAM,OAAO,KAAK,IAAI,EAAE;AAAA,aAClC;AAAA,UACH,OAAO,EAAE,IAAI,MAAM,OAAO,MAAM,KAAK,MAAM,EAAE;AAAA,aAC1C;AAAA,UACH,OAAO,EAAE,IAAI,MAAM,OAAO,MAAM,KAAK,QAAQ,EAAE;AAAA,aAC5C,mBAAmB;AAAA,UACtB,OAAO,UAAU,eAAe,GAAG;AAAA,UACnC,MAAM,OAAO,cAAc,KAAK,MAAM,WAAW,IAAI,CAAC;AAAA,UACtD,MAAM,KAAK,gBAAgB,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,UACzD,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,kBAAkB;AAAA,UACrB,OAAO,MAAM,GAAG;AAAA,UAChB,MAAM,KAAK,eAAe,EAAE;AAAA,UAC5B,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,oBAAoB;AAAA,UACvB,OAAO,SAAS,GAAG;AAAA,UACnB,MAAM,KAAK,iBACR,SAAyD,QAC1D,EAAE,QAAQ,CACZ;AAAA,UACA,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,YAAY;AAAA,UACf,OAAO,QAAQ,OAAO,GAAG;AAAA,UACzB,IAAI,GAAG,KAAK,SAAS,GAAG;AAAA,YACtB,MAAM,KAAK,IAAI,SAAS,aAAa,SAAS,GAAG,EAAE;AAAA,YACnD,MAAM,UAAS,MAAM,KAAK,SAAS,IAAI,GAAG;AAAA,YAC1C,OAAO,EAAE,IAAI,MAAM,OAAO,QAAO;AAAA,UACnC;AAAA,UACA,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,UACzC,OAAO,EAAE,IAAI,MAAM,OAAO,OAAO;AAAA,QACnC;AAAA,aACK,iBAAiB;AAAA,UACpB,OAAO,cAAc,eAAe,aAAa,QAAQ,aAAa,GAAG;AAAA,UAOzE,MAAM,UAAU,WAAW,MAAM,cAAc,eAAe,WAAW;AAAA,UACzE,MAAM,SAAS,MAAM,qBAAqB,SAAS,QAAQ,WAAW,OAAO;AAAA,UAC7E,OAAO,EAAE,IAAI,MAAM,OAAO,OAAO;AAAA,QACnC;AAAA,aACK,iBAAiB;AAAA,UACpB,OAAO,cAAc,eAAe,aAAa,SAAS,UAAU,SAAS,iBAAiB,GAAG;AAAA,UASjG,MAAM,UAAU,WAAW,MAAM,cAAc,eAAe,WAAW;AAAA,UACzE,MAAM,mBAAmB,iBAAiB;AAAA,UAC1C,MAAM,uBAAuB,SAAS,SAAS,UAAU,WAAW,OAAO,gBAAgB;AAAA,UAC3F,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,WAAW;AAAA,UACd,OAAO,KAAK,QAAQ,MAAM,WAAW,GAAG;AAAA,UAMxC,MAAM,iBAKF;AAAA,YACF;AAAA,UACF;AAAA,UACA,IAAI,SAAS;AAAA,YACX,eAAe,UAAU;AAAA,UAC3B;AAAA,UACA,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,YACvC,eAAe,OAAO;AAAA,UACxB;AAAA,UAEA,MAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK;AAAA,YAC7C;AAAA,eACG;AAAA,UACL,CAAC;AAAA,UAGD,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,UACjC,IAAI,OAAgB;AAAA,UACpB,IAAI;AAAA,YACF,OAAO,KAAK,MAAM,IAAI;AAAA,YACtB,MAAM;AAAA,UAIR,OAAO;AAAA,YACL,IAAI;AAAA,YACJ,OAAO;AAAA,cACL,QAAQ,SAAS,OAAO;AAAA,cACxB,IAAI,SAAS,GAAG;AAAA,cAChB,SAAS,SAAS,QAAQ;AAAA,cAC1B;AAAA,cACA;AAAA,cACA,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,aACK,UAAU;AAAA,UACb,OAAO,aAAa,GAAG;AAAA,UACvB,MAAM,KAAK,OAAO;AAAA,YAChB;AAAA,YACA,WAAY,aAA6D;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,aAAa;AAAA,UAChB,OAAO,aAAa,GAAG;AAAA,UACvB,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA,WAAY,aAA6D;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,cAAc;AAAA,UACjB,OAAO,KAAK,eAAe,aAAa,GAAG;AAAA,UAC3C,MAAM,KAAK,WAAW,KAAK;AAAA,YACzB,SAAS,iBAAiB;AAAA,YAC1B,WAAY,aAA6D;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA,aACK,gBAAgB;AAAA,UACnB,MAAM,KAAK,QAAQ,EAAE,aAAa;AAAA,UAClC,OAAO,EAAE,IAAI,KAAK;AAAA,QACpB;AAAA;AAAA,UAEE,OAAO,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,SAAS,SAAS,sBAAuB,GAA2B,OAAO,EAAE;AAAA;AAAA,MAEpH,OAAO,KAAK;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,OAAO,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,EAAE;AAAA;AAAA;AAAA;AAe9E,eAAsB,eAAe,CACnC,SACA,SAC2B;AAAA,EAC3B,MAAM,UAAU,QAAQ,WAAW;AAAA,EAGnC,MAAM,OAAO,UAAU,UAAU,QAAQ,OAAO;AAAA,EAChD,MAAM,UAAU,aAAa,UAAU,QAAQ,UAAU;AAAA,EAGzD,MAAM,mBAAmB,YAAY,OAAO,wBAAwB,MAAM,EAAE,QAAQ,CAAC,IAAI;AAAA,EAEzF,IAAI,CAAC,kBAAkB;AAAA,IACrB,MAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAAA,EAGA,MAAM,qBAA+C,CAAC;AAAA,EACtD,MAAM,kBAAwC,CAAC;AAAA,EAC/C,MAAM,mBAA0C,CAAC;AAAA,EAEjD,MAAM,SAAS,QAAQ;AAAA,EAMvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,MAAM;AAAA,IAER,MAAM,UAAU,aAAa,UAAU,QAAQ,UAAU;AAAA,IAEzD,iBAAiB,CAAC,YAA0C;AAAA,MAC1D,MAAM,OAA2B;AAAA,QAC/B,KAAK,QAAQ,IAAI;AAAA,QACjB,QAAQ,QAAQ,OAAO;AAAA,QACvB,SAAS,QAAQ,QAAQ;AAAA,QACzB,UAAU,QAAQ,SAAS,KAAK;AAAA,QAChC,cAAc,QAAQ,aAAa;AAAA,QACnC,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA,gBAAgB,KAAK,IAAI;AAAA,MAEzB,IAAI,SAAS;AAAA,QACX,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,KAAK,KAAK;AAAA,UACV,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,UACd,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA;AAAA,IAGF,kBAAkB,CAAC,aAA4C;AAAA,MAC7D,MAAM,OAA4B;AAAA,QAChC,KAAK,SAAS,IAAI;AAAA,QAClB,QAAQ,SAAS,OAAO;AAAA,QACxB,YAAY,SAAS,WAAW;AAAA,QAChC,SAAS,SAAS,QAAQ;AAAA,QAC1B,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA,iBAAiB,KAAK,IAAI;AAAA,MAE1B,IAAI,SAAS;AAAA,QACX,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,KAAK,KAAK;AAAA,UACV,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,SAAS,KAAK;AAAA,UACd,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA;AAAA,IAGF,iBAAiB,CAAC,QAA6C;AAAA,MAC7D,MAAM,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAC;AAAA,MAChD,MAAM,QAAgC;AAAA,QACpC,OAAO,IAAI,KAAK;AAAA,QAChB,QAAQ,KAAK,KAAK,GAAG;AAAA,QACrB,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA,mBAAmB,KAAK,KAAK;AAAA,MAE7B,IAAI,SAAS;AAAA,QACX,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,MAGA,IAAI,aAAa,WAAW,QAAQ,SAAS;AAAA,QAC3C,MAAM,SAAS,YAAY,MAAM;AAAA,QACjC,QAAQ,IAAI,QAAQ,MAAM,MAAM;AAAA,MAClC;AAAA;AAAA,IAGF,KAAK,GAAG,WAAW,cAAc;AAAA,IACjC,KAAK,GAAG,YAAY,eAAe;AAAA,IACnC,KAAK,GAAG,WAAW,cAAc;AAAA,EACnC;AAAA,EAOA,OAAO,QACL,4BACA,IAAI,2BAAI,UAAU,OAAO,WAAoC;AAAA,IAC3D,MAAM,KAAK,KAAK,MAAM,MAAM;AAAA,IAC5B,MAAM,SAAS,MAAM,iBAAiB,EAAE;AAAA,IACxC,OAAO,KAAK,UAAU,MAAM;AAAA,GAC7B,CACH;AAAA,EAOA,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAelB;AAAA,EAGC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA6GlB;AAAA,EAGC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA2IlB;AAAA,EAGC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgHlB;AAAA,EAMC,OAAO;AAAA,IACL,OAAO,GAAG;AAAA,MAER,IAAI,QAAQ,kBAAkB,mBAAmB,gBAAgB;AAAA,QAC/D,KAAK,IAAI,WAAW,cAAc;AAAA,QAClC,KAAK,IAAI,YAAY,eAAe;AAAA,QACpC,KAAK,IAAI,WAAW,cAAc;AAAA,MACpC;AAAA,MACA,mBAAmB,SAAS;AAAA,MAC5B,gBAAgB,SAAS;AAAA,MACzB,iBAAiB,SAAS;AAAA;AAAA,IAE5B,qBAAqB,GAAG;AAAA,MACtB,OAAO,CAAC,GAAG,kBAAkB;AAAA;AAAA,IAE/B,kBAAkB,GAAG;AAAA,MACnB,OAAO,CAAC,GAAG,eAAe;AAAA;AAAA,IAE5B,mBAAmB,GAAG;AAAA,MACpB,OAAO,CAAC,GAAG,gBAAgB;AAAA;AAAA,IAE7B,cAAc,GAAG;AAAA,MACf,mBAAmB,SAAS;AAAA,MAC5B,gBAAgB,SAAS;AAAA,MACzB,iBAAiB,SAAS;AAAA;AAAA,EAE9B;AAAA;",
|
|
8
|
+
"debugId": "6C45722AECDACEA764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
package/dist/mjs/client.mjs
CHANGED
|
@@ -5,6 +5,10 @@ function getLocator(page, selectorType, selectorValue, optionsJson) {
|
|
|
5
5
|
const roleOptions = options ? { ...options } : undefined;
|
|
6
6
|
if (roleOptions) {
|
|
7
7
|
delete roleOptions.nth;
|
|
8
|
+
delete roleOptions.filter;
|
|
9
|
+
if (roleOptions.name && typeof roleOptions.name === "object" && roleOptions.name.$regex) {
|
|
10
|
+
roleOptions.name = new RegExp(roleOptions.name.$regex, roleOptions.name.$flags);
|
|
11
|
+
}
|
|
8
12
|
}
|
|
9
13
|
let locator;
|
|
10
14
|
switch (selectorType) {
|
|
@@ -26,12 +30,29 @@ function getLocator(page, selectorType, selectorValue, optionsJson) {
|
|
|
26
30
|
case "testId":
|
|
27
31
|
locator = page.getByTestId(selectorValue);
|
|
28
32
|
break;
|
|
33
|
+
case "or": {
|
|
34
|
+
const [firstInfo, secondInfo] = JSON.parse(selectorValue);
|
|
35
|
+
const first = getLocator(page, firstInfo[0], firstInfo[1], firstInfo[2]);
|
|
36
|
+
const second = getLocator(page, secondInfo[0], secondInfo[1], secondInfo[2]);
|
|
37
|
+
locator = first.or(second);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
29
40
|
default:
|
|
30
41
|
locator = page.locator(selectorValue);
|
|
31
42
|
}
|
|
32
43
|
if (nthIndex !== undefined) {
|
|
33
44
|
locator = locator.nth(nthIndex);
|
|
34
45
|
}
|
|
46
|
+
if (options?.filter) {
|
|
47
|
+
const filterOpts = { ...options.filter };
|
|
48
|
+
if (filterOpts.hasText && typeof filterOpts.hasText === "object" && filterOpts.hasText.$regex) {
|
|
49
|
+
filterOpts.hasText = new RegExp(filterOpts.hasText.$regex, filterOpts.hasText.$flags);
|
|
50
|
+
}
|
|
51
|
+
if (filterOpts.hasNotText && typeof filterOpts.hasNotText === "object" && filterOpts.hasNotText.$regex) {
|
|
52
|
+
filterOpts.hasNotText = new RegExp(filterOpts.hasNotText.$regex, filterOpts.hasNotText.$flags);
|
|
53
|
+
}
|
|
54
|
+
locator = locator.filter(filterOpts);
|
|
55
|
+
}
|
|
35
56
|
return locator;
|
|
36
57
|
}
|
|
37
58
|
async function executeLocatorAction(locator, action, actionArg, timeout) {
|
|
@@ -81,6 +102,27 @@ async function executeLocatorAction(locator, action, actionArg, timeout) {
|
|
|
81
102
|
return await locator.isChecked();
|
|
82
103
|
case "count":
|
|
83
104
|
return await locator.count();
|
|
105
|
+
case "getAttribute":
|
|
106
|
+
return await locator.getAttribute(String(actionArg ?? ""), { timeout });
|
|
107
|
+
case "isDisabled":
|
|
108
|
+
return await locator.isDisabled();
|
|
109
|
+
case "isHidden":
|
|
110
|
+
return await locator.isHidden();
|
|
111
|
+
case "innerHTML":
|
|
112
|
+
return await locator.innerHTML({ timeout });
|
|
113
|
+
case "innerText":
|
|
114
|
+
return await locator.innerText({ timeout });
|
|
115
|
+
case "allTextContents":
|
|
116
|
+
return await locator.allTextContents();
|
|
117
|
+
case "allInnerTexts":
|
|
118
|
+
return await locator.allInnerTexts();
|
|
119
|
+
case "waitFor": {
|
|
120
|
+
const opts = actionArg && typeof actionArg === "object" ? actionArg : {};
|
|
121
|
+
await locator.waitFor({ state: opts.state, timeout: opts.timeout ?? timeout });
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
case "boundingBox":
|
|
125
|
+
return await locator.boundingBox({ timeout });
|
|
84
126
|
default:
|
|
85
127
|
throw new Error(`Unknown action: ${action}`);
|
|
86
128
|
}
|
|
@@ -150,14 +192,12 @@ async function executeExpectAssertion(locator, matcher, expected, negated, timeo
|
|
|
150
192
|
}
|
|
151
193
|
function createPlaywrightHandler(page, options) {
|
|
152
194
|
const timeout = options?.timeout ?? 30000;
|
|
153
|
-
const baseUrl = options?.baseUrl;
|
|
154
195
|
return async (op) => {
|
|
155
196
|
try {
|
|
156
197
|
switch (op.type) {
|
|
157
198
|
case "goto": {
|
|
158
199
|
const [url, waitUntil] = op.args;
|
|
159
|
-
|
|
160
|
-
await page.goto(targetUrl, {
|
|
200
|
+
await page.goto(url, {
|
|
161
201
|
timeout,
|
|
162
202
|
waitUntil: waitUntil ?? "load"
|
|
163
203
|
});
|
|
@@ -208,7 +248,6 @@ function createPlaywrightHandler(page, options) {
|
|
|
208
248
|
}
|
|
209
249
|
case "request": {
|
|
210
250
|
const [url, method, data, headers] = op.args;
|
|
211
|
-
const targetUrl = baseUrl && !url.startsWith("http") ? `${baseUrl}${url}` : url;
|
|
212
251
|
const requestOptions = {
|
|
213
252
|
timeout
|
|
214
253
|
};
|
|
@@ -218,7 +257,7 @@ function createPlaywrightHandler(page, options) {
|
|
|
218
257
|
if (data !== undefined && data !== null) {
|
|
219
258
|
requestOptions.data = data;
|
|
220
259
|
}
|
|
221
|
-
const response = await page.request.fetch(
|
|
260
|
+
const response = await page.request.fetch(url, {
|
|
222
261
|
method,
|
|
223
262
|
...requestOptions
|
|
224
263
|
});
|
|
@@ -239,6 +278,34 @@ function createPlaywrightHandler(page, options) {
|
|
|
239
278
|
}
|
|
240
279
|
};
|
|
241
280
|
}
|
|
281
|
+
case "goBack": {
|
|
282
|
+
const [waitUntil] = op.args;
|
|
283
|
+
await page.goBack({
|
|
284
|
+
timeout,
|
|
285
|
+
waitUntil: waitUntil ?? "load"
|
|
286
|
+
});
|
|
287
|
+
return { ok: true };
|
|
288
|
+
}
|
|
289
|
+
case "goForward": {
|
|
290
|
+
const [waitUntil] = op.args;
|
|
291
|
+
await page.goForward({
|
|
292
|
+
timeout,
|
|
293
|
+
waitUntil: waitUntil ?? "load"
|
|
294
|
+
});
|
|
295
|
+
return { ok: true };
|
|
296
|
+
}
|
|
297
|
+
case "waitForURL": {
|
|
298
|
+
const [url, customTimeout, waitUntil] = op.args;
|
|
299
|
+
await page.waitForURL(url, {
|
|
300
|
+
timeout: customTimeout ?? timeout,
|
|
301
|
+
waitUntil: waitUntil ?? undefined
|
|
302
|
+
});
|
|
303
|
+
return { ok: true };
|
|
304
|
+
}
|
|
305
|
+
case "clearCookies": {
|
|
306
|
+
await page.context().clearCookies();
|
|
307
|
+
return { ok: true };
|
|
308
|
+
}
|
|
242
309
|
default:
|
|
243
310
|
return { ok: false, error: { name: "Error", message: `Unknown operation: ${op.type}` } };
|
|
244
311
|
}
|
|
@@ -252,4 +319,4 @@ export {
|
|
|
252
319
|
createPlaywrightHandler
|
|
253
320
|
};
|
|
254
321
|
|
|
255
|
-
//# debugId=
|
|
322
|
+
//# debugId=4CDDB895D0100C1364756E2164756E21
|
package/dist/mjs/client.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/client.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Client-safe exports for @ricsam/isolate-playwright\n * This module can be imported without loading isolated-vm\n */\n\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export types\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightSetupOptions,\n PlaywrightOptions,\n PlaywrightHandle,\n} from \"./types.mjs\";\n\n// Import PlaywrightCallback for use in function return type\nimport type { PlaywrightCallback } from \"./types.mjs\";\nexport type { PlaywrightCallback };\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n const matches = text?.includes(String(expected)) ?? false;\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain \"${expected}\", but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain \"${expected}\", but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number; baseUrl?: string }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n const baseUrl = options?.baseUrl;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n await page.goto(targetUrl, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script] = op.args as [string];\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(targetUrl, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n"
|
|
5
|
+
"/**\n * Client-safe exports for @ricsam/isolate-playwright\n * This module can be imported without loading isolated-vm\n */\n\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export types\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightSetupOptions,\n PlaywrightOptions,\n PlaywrightHandle,\n} from \"./types.mjs\";\n\n// Import PlaywrightCallback for use in function return type\nimport type { PlaywrightCallback } from \"./types.mjs\";\nexport type { PlaywrightCallback };\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n delete roleOptions.filter;\n // Deserialize regex name\n if (roleOptions.name && typeof roleOptions.name === 'object' && roleOptions.name.$regex) {\n roleOptions.name = new RegExp(roleOptions.name.$regex, roleOptions.name.$flags);\n }\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n case \"or\": {\n // Composite locator: selectorValue is JSON array of [firstInfo, secondInfo]\n const [firstInfo, secondInfo] = JSON.parse(selectorValue) as [[string, string, string | null], [string, string, string | null]];\n const first = getLocator(page, firstInfo[0], firstInfo[1], firstInfo[2]);\n const second = getLocator(page, secondInfo[0], secondInfo[1], secondInfo[2]);\n locator = first.or(second);\n break;\n }\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n // Apply filter if specified\n if (options?.filter) {\n const filterOpts = { ...options.filter };\n if (filterOpts.hasText && typeof filterOpts.hasText === 'object' && filterOpts.hasText.$regex) {\n filterOpts.hasText = new RegExp(filterOpts.hasText.$regex, filterOpts.hasText.$flags);\n }\n if (filterOpts.hasNotText && typeof filterOpts.hasNotText === 'object' && filterOpts.hasNotText.$regex) {\n filterOpts.hasNotText = new RegExp(filterOpts.hasNotText.$regex, filterOpts.hasNotText.$flags);\n }\n locator = locator.filter(filterOpts);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n case \"getAttribute\":\n return await locator.getAttribute(String(actionArg ?? \"\"), { timeout });\n case \"isDisabled\":\n return await locator.isDisabled();\n case \"isHidden\":\n return await locator.isHidden();\n case \"innerHTML\":\n return await locator.innerHTML({ timeout });\n case \"innerText\":\n return await locator.innerText({ timeout });\n case \"allTextContents\":\n return await locator.allTextContents();\n case \"allInnerTexts\":\n return await locator.allInnerTexts();\n case \"waitFor\": {\n const opts = actionArg && typeof actionArg === 'object' ? actionArg as Record<string, unknown> : {};\n await locator.waitFor({ state: opts.state as any, timeout: (opts.timeout as number) ?? timeout });\n return null;\n }\n case \"boundingBox\":\n return await locator.boundingBox({ timeout });\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n const matches = text?.includes(String(expected)) ?? false;\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain \"${expected}\", but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain \"${expected}\", but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n await page.goto(url, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script] = op.args as [string];\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(url, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n case \"goBack\": {\n const [waitUntil] = op.args as [string?];\n await page.goBack({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"goForward\": {\n const [waitUntil] = op.args as [string?];\n await page.goForward({\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"waitForURL\": {\n const [url, customTimeout, waitUntil] = op.args as [string, number?, string?];\n await page.waitForURL(url, {\n timeout: customTimeout ?? timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? undefined,\n });\n return { ok: true };\n }\n case \"clearCookies\": {\n await page.context().clearCookies();\n return { ok: true };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AA+BA,SAAS,UAAU,CACjB,MACA,cACA,eACA,aACmB;AAAA,EAEnB,MAAM,UAAU,cAAc,KAAK,MAAM,WAAW,IAAI;AAAA,EACxD,MAAM,WAAW,SAAS;AAAA,EAG1B,MAAM,cAAc,UAAU,KAAK,QAAQ,IAAI;AAAA,EAC/C,IAAI,aAAa;AAAA,IACf,OAAO,YAAY;AAAA,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "4CDDB895D0100C1364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|