@midscene/web 1.15.3 → 1.15.4-beta-20261013083552.0

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.
Files changed (135) hide show
  1. package/dist/es/agent-tools-puppeteer.mjs +3 -2
  2. package/dist/es/agent-tools-puppeteer.mjs.map +1 -1
  3. package/dist/es/bridge-mode/io-client.mjs +1 -1
  4. package/dist/es/bridge-mode/io-server.mjs +2 -2
  5. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  6. package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
  7. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  8. package/dist/es/cli.mjs +1 -1
  9. package/dist/es/common/persistent-puppeteer-viewport.mjs +27 -0
  10. package/dist/es/common/persistent-puppeteer-viewport.mjs.map +1 -0
  11. package/dist/es/{playwright → common}/test-runner/cookies.mjs +56 -79
  12. package/dist/es/common/test-runner/cookies.mjs.map +1 -0
  13. package/dist/es/common/test-runner/driver.mjs +0 -0
  14. package/dist/es/common/test-runner/nodes.mjs +139 -0
  15. package/dist/es/common/test-runner/nodes.mjs.map +1 -0
  16. package/dist/es/common/test-runner/utils.mjs +24 -0
  17. package/dist/es/common/test-runner/utils.mjs.map +1 -0
  18. package/dist/es/playwright/test-runner/agent-nodes.mjs +3 -10
  19. package/dist/es/playwright/test-runner/agent-nodes.mjs.map +1 -1
  20. package/dist/es/playwright/test-runner/driver.mjs +42 -0
  21. package/dist/es/playwright/test-runner/driver.mjs.map +1 -0
  22. package/dist/es/playwright/test-runner/index.mjs +1 -4
  23. package/dist/es/playwright/test-runner/utils.mjs +1 -21
  24. package/dist/es/playwright/test-runner/utils.mjs.map +1 -1
  25. package/dist/es/puppeteer/browser-agent.mjs +9 -1
  26. package/dist/es/puppeteer/browser-agent.mjs.map +1 -1
  27. package/dist/es/puppeteer/page-agent.mjs +19 -1
  28. package/dist/es/puppeteer/page-agent.mjs.map +1 -1
  29. package/dist/es/puppeteer/test-runner/agent-nodes.mjs +6 -0
  30. package/dist/es/puppeteer/test-runner/agent-nodes.mjs.map +1 -0
  31. package/dist/es/puppeteer/test-runner/driver.mjs +44 -0
  32. package/dist/es/puppeteer/test-runner/driver.mjs.map +1 -0
  33. package/dist/es/puppeteer/test-runner/index.mjs +3 -0
  34. package/dist/es/puppeteer/test-runner/types.mjs +0 -0
  35. package/dist/es/puppeteer/test-runner/utils.mjs +8 -0
  36. package/dist/es/puppeteer/test-runner/utils.mjs.map +1 -0
  37. package/dist/lib/agent-tools-puppeteer.js +3 -2
  38. package/dist/lib/agent-tools-puppeteer.js.map +1 -1
  39. package/dist/lib/bridge-mode/io-client.js +1 -1
  40. package/dist/lib/bridge-mode/io-server.js +2 -2
  41. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  42. package/dist/lib/bridge-mode/page-browser-side.js +1 -1
  43. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  44. package/dist/lib/cli.js +1 -1
  45. package/dist/lib/common/persistent-puppeteer-viewport.js +61 -0
  46. package/dist/lib/common/persistent-puppeteer-viewport.js.map +1 -0
  47. package/dist/lib/{playwright → common}/test-runner/cookies.js +58 -81
  48. package/dist/lib/common/test-runner/cookies.js.map +1 -0
  49. package/dist/lib/common/test-runner/driver.js +20 -0
  50. package/dist/lib/common/test-runner/driver.js.map +1 -0
  51. package/dist/lib/common/test-runner/nodes.js +185 -0
  52. package/dist/lib/common/test-runner/nodes.js.map +1 -0
  53. package/dist/lib/common/test-runner/utils.js +61 -0
  54. package/dist/lib/common/test-runner/utils.js.map +1 -0
  55. package/dist/lib/playwright/test-runner/agent-nodes.js +3 -10
  56. package/dist/lib/playwright/test-runner/agent-nodes.js.map +1 -1
  57. package/dist/lib/playwright/test-runner/driver.js +76 -0
  58. package/dist/lib/playwright/test-runner/driver.js.map +1 -0
  59. package/dist/lib/playwright/test-runner/index.js +5 -8
  60. package/dist/lib/playwright/test-runner/utils.js +4 -24
  61. package/dist/lib/playwright/test-runner/utils.js.map +1 -1
  62. package/dist/lib/puppeteer/browser-agent.js +9 -1
  63. package/dist/lib/puppeteer/browser-agent.js.map +1 -1
  64. package/dist/lib/puppeteer/page-agent.js +19 -1
  65. package/dist/lib/puppeteer/page-agent.js.map +1 -1
  66. package/dist/lib/puppeteer/test-runner/agent-nodes.js +40 -0
  67. package/dist/lib/puppeteer/test-runner/agent-nodes.js.map +1 -0
  68. package/dist/lib/puppeteer/test-runner/driver.js +78 -0
  69. package/dist/lib/puppeteer/test-runner/driver.js.map +1 -0
  70. package/dist/lib/puppeteer/test-runner/index.js +51 -0
  71. package/dist/lib/puppeteer/test-runner/index.js.map +1 -0
  72. package/dist/lib/puppeteer/test-runner/types.js +20 -0
  73. package/dist/lib/puppeteer/test-runner/types.js.map +1 -0
  74. package/dist/lib/puppeteer/test-runner/utils.js +48 -0
  75. package/dist/lib/puppeteer/test-runner/utils.js.map +1 -0
  76. package/dist/types/agent-tools-puppeteer.d.ts.map +1 -1
  77. package/dist/types/common/persistent-puppeteer-viewport.d.ts +5 -0
  78. package/dist/types/common/persistent-puppeteer-viewport.d.ts.map +1 -0
  79. package/dist/types/common/test-runner/cookies.d.ts +52 -0
  80. package/dist/types/common/test-runner/cookies.d.ts.map +1 -0
  81. package/dist/types/common/test-runner/driver.d.ts +38 -0
  82. package/dist/types/common/test-runner/driver.d.ts.map +1 -0
  83. package/dist/types/common/test-runner/nodes.d.ts +38 -0
  84. package/dist/types/common/test-runner/nodes.d.ts.map +1 -0
  85. package/dist/types/common/test-runner/utils.d.ts +3 -0
  86. package/dist/types/common/test-runner/utils.d.ts.map +1 -0
  87. package/dist/types/playwright/test-runner/agent-nodes.d.ts +1 -2
  88. package/dist/types/playwright/test-runner/agent-nodes.d.ts.map +1 -1
  89. package/dist/types/playwright/test-runner/driver.d.ts +4 -0
  90. package/dist/types/playwright/test-runner/driver.d.ts.map +1 -0
  91. package/dist/types/playwright/test-runner/index.d.ts +2 -8
  92. package/dist/types/playwright/test-runner/index.d.ts.map +1 -1
  93. package/dist/types/playwright/test-runner/types.d.ts +5 -14
  94. package/dist/types/playwright/test-runner/types.d.ts.map +1 -1
  95. package/dist/types/playwright/test-runner/utils.d.ts +1 -2
  96. package/dist/types/playwright/test-runner/utils.d.ts.map +1 -1
  97. package/dist/types/puppeteer/browser-agent.d.ts +5 -0
  98. package/dist/types/puppeteer/browser-agent.d.ts.map +1 -1
  99. package/dist/types/puppeteer/index.d.ts +1 -1
  100. package/dist/types/puppeteer/index.d.ts.map +1 -1
  101. package/dist/types/puppeteer/page-agent.d.ts +8 -1
  102. package/dist/types/puppeteer/page-agent.d.ts.map +1 -1
  103. package/dist/types/puppeteer/test-runner/agent-nodes.d.ts +2 -0
  104. package/dist/types/puppeteer/test-runner/agent-nodes.d.ts.map +1 -0
  105. package/dist/types/puppeteer/test-runner/driver.d.ts +4 -0
  106. package/dist/types/puppeteer/test-runner/driver.d.ts.map +1 -0
  107. package/dist/types/puppeteer/test-runner/index.d.ts +5 -0
  108. package/dist/types/puppeteer/test-runner/index.d.ts.map +1 -0
  109. package/dist/types/puppeteer/test-runner/types.d.ts +18 -0
  110. package/dist/types/puppeteer/test-runner/types.d.ts.map +1 -0
  111. package/dist/types/puppeteer/test-runner/utils.d.ts +4 -0
  112. package/dist/types/puppeteer/test-runner/utils.d.ts.map +1 -0
  113. package/package.json +9 -4
  114. package/dist/es/playwright/test-runner/clear-cookies.mjs +0 -45
  115. package/dist/es/playwright/test-runner/clear-cookies.mjs.map +0 -1
  116. package/dist/es/playwright/test-runner/cookies.mjs.map +0 -1
  117. package/dist/es/playwright/test-runner/goto-url.mjs +0 -60
  118. package/dist/es/playwright/test-runner/goto-url.mjs.map +0 -1
  119. package/dist/es/playwright/test-runner/viewport.mjs +0 -35
  120. package/dist/es/playwright/test-runner/viewport.mjs.map +0 -1
  121. package/dist/lib/playwright/test-runner/clear-cookies.js +0 -82
  122. package/dist/lib/playwright/test-runner/clear-cookies.js.map +0 -1
  123. package/dist/lib/playwright/test-runner/cookies.js.map +0 -1
  124. package/dist/lib/playwright/test-runner/goto-url.js +0 -97
  125. package/dist/lib/playwright/test-runner/goto-url.js.map +0 -1
  126. package/dist/lib/playwright/test-runner/viewport.js +0 -72
  127. package/dist/lib/playwright/test-runner/viewport.js.map +0 -1
  128. package/dist/types/playwright/test-runner/clear-cookies.d.ts +0 -17
  129. package/dist/types/playwright/test-runner/clear-cookies.d.ts.map +0 -1
  130. package/dist/types/playwright/test-runner/cookies.d.ts +0 -33
  131. package/dist/types/playwright/test-runner/cookies.d.ts.map +0 -1
  132. package/dist/types/playwright/test-runner/goto-url.d.ts +0 -26
  133. package/dist/types/playwright/test-runner/goto-url.d.ts.map +0 -1
  134. package/dist/types/playwright/test-runner/viewport.d.ts +0 -14
  135. package/dist/types/playwright/test-runner/viewport.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common/test-runner/cookies.mjs","sources":["../../../../src/common/test-runner/cookies.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { z } from 'zod/v4';\nimport { resolveWebUrl } from './utils';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport type CookieSourceReference =\n | { kind: 'env'; name: string }\n | { kind: 'profile'; name: string }\n | { kind: 'storage-state'; name: string };\n\nexport interface WebNodeContext<TContext> {\n input: unknown;\n context: TContext;\n signal: AbortSignal;\n}\n\nexport interface CookieProfileContext<TContext> {\n profile: string;\n context: TContext;\n signal: AbortSignal;\n}\n\nexport interface WebCookieSourceOptions<TAgent> {\n getEnv?(\n ctx: WebNodeContext<TAgent>,\n ): Awaitable<Readonly<Record<string, string | undefined>>>;\n getCookieProfile?(input: CookieProfileContext<TAgent>): Awaitable<unknown>;\n resolveStorageStatePath?(\n path: string,\n ctx: WebNodeContext<TAgent>,\n ): Awaitable<string>;\n}\n\nexport interface PortableWebCookie extends Record<string, unknown> {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n}\n\nexport const setCookiesInputSchema = z\n .strictObject({\n cookiesEnv: z\n .string()\n .regex(/^[A-Za-z_][A-Za-z0-9_]*$/)\n .optional()\n .describe(\n 'The environment variable containing a Cookie header, cookie array JSON, or browser storage-state JSON.',\n ),\n profile: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A cookie profile resolved by getCookieProfile().'),\n storageStatePath: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A path to a browser storage-state JSON file.'),\n url: z\n .string()\n .url()\n .optional()\n .describe(\n 'The HTTP(S) URL used to scope Cookie-header values or cookies without domain/path.',\n ),\n })\n .superRefine((input, ctx) => {\n const sourceCount = [\n input.cookiesEnv,\n input.profile,\n input.storageStatePath,\n ].filter((value) => value !== undefined).length;\n if (sourceCount !== 1) {\n ctx.addIssue({\n code: 'custom',\n message:\n 'exactly one of cookiesEnv, profile, and storageStatePath is required',\n });\n }\n });\n\nexport type SetCookiesNodeInput = z.infer<typeof setCookiesInputSchema>;\n\nexport interface SetCookiesNodeResult {\n source: CookieSourceReference['kind'];\n sourceName: string;\n count: number;\n}\n\nconst toCookieSourceReference = (\n input: SetCookiesNodeInput,\n): CookieSourceReference => {\n if (input.cookiesEnv !== undefined) {\n return { kind: 'env', name: input.cookiesEnv };\n }\n if (input.profile !== undefined) {\n return { kind: 'profile', name: input.profile };\n }\n if (input.storageStatePath !== undefined) {\n return { kind: 'storage-state', name: input.storageStatePath };\n }\n throw new TypeError('setCookies requires one cookie source.');\n};\n\nconst parseCookieHeader = (raw: string, url: string | undefined) => {\n if (url === undefined) {\n throw new TypeError(\n 'setCookies.url is required when cookiesEnv contains a Cookie header.',\n );\n }\n const segments = raw\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n if (segments.length === 0) {\n throw new TypeError('setCookies Cookie header contains no cookies.');\n }\n return segments.map((segment) => {\n const separator = segment.indexOf('=');\n if (separator <= 0) {\n throw new TypeError(\n 'setCookies Cookie header contains an invalid name/value pair.',\n );\n }\n const name = segment.slice(0, separator).trim();\n const value = segment.slice(separator + 1).trim();\n if (!name) {\n throw new TypeError('setCookies Cookie header contains an empty name.');\n }\n return { name, value, url } satisfies PortableWebCookie;\n });\n};\n\nconst parseCookieJson = (raw: string): unknown => {\n try {\n return JSON.parse(raw);\n } catch {\n throw new TypeError(\n 'setCookies source must contain valid JSON or a Cookie header.',\n );\n }\n};\n\nconst normalizeCookie = (\n candidate: unknown,\n defaultUrl: string | undefined,\n index: number,\n): PortableWebCookie => {\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new TypeError(\n `setCookies cookie at index ${index} must be an object.`,\n );\n }\n const cookie = candidate as Record<string, unknown>;\n if (typeof cookie.name !== 'string' || !cookie.name.trim()) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a non-blank name.`,\n );\n }\n if (typeof cookie.value !== 'string') {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a string value.`,\n );\n }\n\n const normalized = { ...cookie } as PortableWebCookie;\n const hasUrl = typeof cookie.url === 'string' && cookie.url.length > 0;\n const hasDomain =\n typeof cookie.domain === 'string' && cookie.domain.length > 0;\n if (!hasUrl && !hasDomain) {\n if (defaultUrl === undefined) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires url or domain, or setCookies.url must be provided.`,\n );\n }\n normalized.url = defaultUrl;\n }\n if (hasDomain && typeof cookie.path !== 'string') normalized.path = '/';\n return normalized;\n};\n\nconst normalizeCookies = (\n source: unknown,\n defaultUrl: string | undefined,\n): PortableWebCookie[] => {\n const candidates = Array.isArray(source)\n ? source\n : source &&\n typeof source === 'object' &&\n Array.isArray((source as { cookies?: unknown }).cookies)\n ? (source as { cookies: unknown[] }).cookies\n : undefined;\n if (!candidates) {\n throw new TypeError(\n 'setCookies JSON must be a cookie array or an object with a cookies array.',\n );\n }\n if (candidates.length === 0) {\n throw new TypeError('setCookies source contains no cookies.');\n }\n return candidates.map((cookie, index) =>\n normalizeCookie(cookie, defaultUrl, index),\n );\n};\n\nexport const resolveCookieInput = async <TAgent>(\n input: SetCookiesNodeInput,\n ctx: WebNodeContext<TAgent>,\n options: WebCookieSourceOptions<TAgent>,\n): Promise<{\n cookies: PortableWebCookie[];\n result: SetCookiesNodeResult;\n}> => {\n const defaultUrl =\n input.url === undefined\n ? undefined\n : resolveWebUrl(input.url, undefined, 'setCookies.url');\n const reference = toCookieSourceReference(input);\n let source: unknown;\n switch (reference.kind) {\n case 'env': {\n let env: Readonly<Record<string, string | undefined>>;\n try {\n env = (await options.getEnv?.(ctx)) ?? process.env;\n } catch {\n throw new Error(\n `Failed to resolve cookie environment ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n const raw = env[reference.name];\n if (!raw?.trim()) {\n throw new Error(\n `Environment variable ${reference.name} is missing or blank.`,\n );\n }\n const trimmed = raw.trim();\n source = /^[\\[{]/.test(trimmed)\n ? parseCookieJson(trimmed)\n : parseCookieHeader(trimmed, defaultUrl);\n break;\n }\n case 'profile': {\n if (!options.getCookieProfile) {\n throw new Error(\n 'setCookies.profile requires a configured getCookieProfile callback.',\n );\n }\n try {\n source = await options.getCookieProfile({\n profile: reference.name,\n context: ctx.context,\n signal: ctx.signal,\n });\n } catch {\n throw new Error(\n `Failed to resolve cookie profile ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n break;\n }\n case 'storage-state': {\n let contents: string;\n try {\n const path = options.resolveStorageStatePath\n ? await options.resolveStorageStatePath(reference.name, ctx)\n : resolve(process.cwd(), reference.name);\n contents = await readFile(path, 'utf8');\n } catch {\n throw new Error(\n `Failed to read cookie storage state ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n source = parseCookieJson(contents);\n break;\n }\n }\n const cookies = normalizeCookies(source, defaultUrl);\n return {\n cookies,\n result: {\n source: reference.kind,\n sourceName: reference.name,\n count: cookies.length,\n },\n };\n};\n"],"names":["setCookiesInputSchema","z","input","ctx","sourceCount","value","undefined","toCookieSourceReference","TypeError","parseCookieHeader","raw","url","segments","segment","Boolean","separator","name","parseCookieJson","JSON","normalizeCookie","candidate","defaultUrl","index","Array","cookie","normalized","hasUrl","hasDomain","normalizeCookies","source","candidates","resolveCookieInput","options","resolveWebUrl","reference","env","process","Error","trimmed","contents","path","resolve","readFile","cookies"],"mappings":"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"}
File without changes
@@ -0,0 +1,139 @@
1
+ import { z } from "zod/v4";
2
+ import { resolveCookieInput, setCookiesInputSchema } from "./cookies.mjs";
3
+ import { resolveWebUrl, throwIfAborted } from "./utils.mjs";
4
+ const DEFAULT_NAVIGATION_TIMEOUT_MS = 60000;
5
+ const DEFAULT_WAIT_UNTIL = 'domcontentloaded';
6
+ const gotoUrlInputSchema = z.strictObject({
7
+ url: z.string().min(1).describe('An absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.'),
8
+ waitUntil: z["enum"]([
9
+ 'commit',
10
+ 'domcontentloaded',
11
+ 'load',
12
+ 'networkidle',
13
+ 'networkidle0',
14
+ 'networkidle2'
15
+ ]).default(DEFAULT_WAIT_UNTIL).describe('The navigation lifecycle event. domcontentloaded, load, and networkidle are portable across browser drivers.'),
16
+ timeoutMs: z.number().positive().max(600000).default(DEFAULT_NAVIGATION_TIMEOUT_MS).describe('The navigation timeout in milliseconds.')
17
+ });
18
+ const clearCookiesInputSchema = z.strictObject({
19
+ name: z.string().regex(/\S/).optional().describe('Cookie name to clear.'),
20
+ domain: z.string().regex(/\S/).optional().describe('Cookie domain to clear.'),
21
+ path: z.string().regex(/\S/).optional().describe('Cookie path to clear.')
22
+ });
23
+ const setViewportSizeInputSchema = z.strictObject({
24
+ width: z.number().int().positive().describe('Viewport width in CSS pixels.'),
25
+ height: z.number().int().positive().describe('Viewport height in CSS pixels.')
26
+ });
27
+ const resolveNavigationUrl = (target, currentUrl, configuredBase)=>{
28
+ const trimmed = target.trim();
29
+ if (!trimmed) throw new TypeError('gotoUrl.url must not be blank.');
30
+ if (/^[a-z][a-z\d+.-]*:/i.test(trimmed)) return resolveWebUrl(trimmed, void 0, 'gotoUrl.url');
31
+ if (void 0 !== configuredBase) return resolveWebUrl(trimmed, configuredBase, 'gotoUrl.url');
32
+ if (!/^https?:\/\//i.test(currentUrl)) throw new TypeError(`gotoUrl.url cannot resolve a relative URL from ${JSON.stringify(currentUrl)}. Use an absolute HTTP(S) URL for the first navigation or configure testRunner.baseURL.`);
33
+ return resolveWebUrl(trimmed, currentUrl, 'gotoUrl.url');
34
+ };
35
+ const createWebTestRunnerNodeDefinitions = (adapter)=>{
36
+ const gotoUrlNode = {
37
+ name: 'gotoUrl',
38
+ title: 'Open a Web URL',
39
+ description: 'Navigate the current browser Page to an absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.',
40
+ stringInputKey: 'url',
41
+ inputSchema: gotoUrlInputSchema,
42
+ async execute (agent, input, executionContext) {
43
+ const runtimeAgent = adapter.requireAgent(agent);
44
+ const driver = adapter.createDriver(runtimeAgent);
45
+ throwIfAborted(executionContext.signal, 'gotoUrl');
46
+ const url = resolveNavigationUrl(input.url, driver.currentUrl(), adapter.getOptions(runtimeAgent)?.baseURL ?? driver.baseUrl());
47
+ const response = await driver.goto(url, {
48
+ waitUntil: input.waitUntil,
49
+ timeoutMs: input.timeoutMs
50
+ });
51
+ throwIfAborted(executionContext.signal, 'gotoUrl');
52
+ const result = {
53
+ url: driver.currentUrl(),
54
+ status: response.status,
55
+ title: await driver.title()
56
+ };
57
+ return {
58
+ summary: `Navigated to ${result.url}`,
59
+ data: result
60
+ };
61
+ }
62
+ };
63
+ const setCookiesNode = {
64
+ name: 'setCookies',
65
+ title: 'Set browser cookies',
66
+ description: 'Load cookies from an environment variable, configured profile, or browser storage-state file without persisting cookie values in workflow input or output.',
67
+ stringInputKey: false,
68
+ inputSchema: setCookiesInputSchema,
69
+ async execute (agent, input, executionContext) {
70
+ const runtimeAgent = adapter.requireAgent(agent);
71
+ const driver = adapter.createDriver(runtimeAgent);
72
+ throwIfAborted(executionContext.signal, 'setCookies');
73
+ const { cookies, result } = await resolveCookieInput(input, {
74
+ ...executionContext,
75
+ input,
76
+ context: runtimeAgent
77
+ }, adapter.getOptions(runtimeAgent) ?? {});
78
+ throwIfAborted(executionContext.signal, 'setCookies');
79
+ try {
80
+ await driver.setCookies(cookies);
81
+ } catch {
82
+ throw new Error(`Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`);
83
+ }
84
+ return {
85
+ summary: `Set ${result.count} browser cookie(s) from ${result.source} ${result.sourceName}`,
86
+ data: result
87
+ };
88
+ }
89
+ };
90
+ const clearCookiesNode = {
91
+ name: 'clearCookies',
92
+ title: 'Clear browser cookies',
93
+ description: 'Clear all cookies from the current browser context, or only cookies matching name, domain, or path.',
94
+ stringInputKey: false,
95
+ inputSchema: clearCookiesInputSchema,
96
+ async execute (agent, input, executionContext) {
97
+ const runtimeAgent = adapter.requireAgent(agent);
98
+ const driver = adapter.createDriver(runtimeAgent);
99
+ throwIfAborted(executionContext.signal, 'clearCookies');
100
+ const filters = {
101
+ ...input
102
+ };
103
+ await driver.clearCookies(filters);
104
+ const filterNames = Object.keys(filters);
105
+ return {
106
+ summary: 0 === filterNames.length ? 'Cleared all browser cookies' : `Cleared browser cookies matching ${filterNames.join(', ')}`,
107
+ data: {
108
+ filters
109
+ }
110
+ };
111
+ }
112
+ };
113
+ const setViewportSizeNode = {
114
+ name: 'setViewportSize',
115
+ title: 'Set the browser viewport size',
116
+ description: 'Set the current browser Page viewport size in CSS pixels and return the effective size.',
117
+ stringInputKey: false,
118
+ inputSchema: setViewportSizeInputSchema,
119
+ async execute (agent, input, executionContext) {
120
+ const runtimeAgent = adapter.requireAgent(agent);
121
+ const driver = adapter.createDriver(runtimeAgent);
122
+ throwIfAborted(executionContext.signal, 'setViewportSize');
123
+ const viewport = await driver.setViewportSize(input);
124
+ return {
125
+ summary: `Set viewport to ${viewport.width}x${viewport.height}`,
126
+ data: viewport
127
+ };
128
+ }
129
+ };
130
+ return [
131
+ gotoUrlNode,
132
+ setCookiesNode,
133
+ clearCookiesNode,
134
+ setViewportSizeNode
135
+ ];
136
+ };
137
+ export { clearCookiesInputSchema, createWebTestRunnerNodeDefinitions, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema };
138
+
139
+ //# sourceMappingURL=nodes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common/test-runner/nodes.mjs","sources":["../../../../src/common/test-runner/nodes.ts"],"sourcesContent":["import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { z } from 'zod/v4';\nimport {\n type SetCookiesNodeResult,\n resolveCookieInput,\n setCookiesInputSchema,\n} from './cookies';\nimport type {\n WebCookieFilters,\n WebTestDriverAdapter,\n WebTestRunnerOptions,\n WebViewportSize,\n} from './driver';\nimport { resolveWebUrl, throwIfAborted } from './utils';\n\nconst DEFAULT_NAVIGATION_TIMEOUT_MS = 60_000;\nconst DEFAULT_WAIT_UNTIL = 'domcontentloaded' as const;\n\nexport const gotoUrlInputSchema = z.strictObject({\n url: z\n .string()\n .min(1)\n .describe(\n 'An absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.',\n ),\n waitUntil: z\n .enum([\n 'commit',\n 'domcontentloaded',\n 'load',\n 'networkidle',\n 'networkidle0',\n 'networkidle2',\n ])\n .default(DEFAULT_WAIT_UNTIL)\n .describe(\n 'The navigation lifecycle event. domcontentloaded, load, and networkidle are portable across browser drivers.',\n ),\n timeoutMs: z\n .number()\n .positive()\n .max(10 * 60_000)\n .default(DEFAULT_NAVIGATION_TIMEOUT_MS)\n .describe('The navigation timeout in milliseconds.'),\n});\n\nexport type GotoUrlNodeInput = z.infer<typeof gotoUrlInputSchema>;\n\nexport interface GotoUrlNodeResult {\n url: string;\n status: number | null;\n title: string;\n}\n\nexport const clearCookiesInputSchema = z.strictObject({\n name: z.string().regex(/\\S/).optional().describe('Cookie name to clear.'),\n domain: z.string().regex(/\\S/).optional().describe('Cookie domain to clear.'),\n path: z.string().regex(/\\S/).optional().describe('Cookie path to clear.'),\n});\n\nexport type ClearCookiesNodeInput = z.infer<typeof clearCookiesInputSchema>;\n\nexport const setViewportSizeInputSchema = z.strictObject({\n width: z.number().int().positive().describe('Viewport width in CSS pixels.'),\n height: z\n .number()\n .int()\n .positive()\n .describe('Viewport height in CSS pixels.'),\n});\n\nexport type SetViewportSizeNodeInput = z.infer<\n typeof setViewportSizeInputSchema\n>;\n\nconst resolveNavigationUrl = (\n target: string,\n currentUrl: string,\n configuredBase: string | undefined,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError('gotoUrl.url must not be blank.');\n if (/^[a-z][a-z\\d+.-]*:/i.test(trimmed)) {\n return resolveWebUrl(trimmed, undefined, 'gotoUrl.url');\n }\n if (configuredBase !== undefined) {\n return resolveWebUrl(trimmed, configuredBase, 'gotoUrl.url');\n }\n if (!/^https?:\\/\\//i.test(currentUrl)) {\n throw new TypeError(\n `gotoUrl.url cannot resolve a relative URL from ${JSON.stringify(currentUrl)}. Use an absolute HTTP(S) URL for the first navigation or configure testRunner.baseURL.`,\n );\n }\n return resolveWebUrl(trimmed, currentUrl, 'gotoUrl.url');\n};\n\n/** Create the browser-neutral built-in Web Nodes for one browser adapter. */\nexport const createWebTestRunnerNodeDefinitions = <\n TAgent,\n TOptions extends WebTestRunnerOptions<TAgent>,\n>(\n adapter: WebTestDriverAdapter<TAgent, TOptions>,\n): readonly AgentTestRunnerNodeDefinition[] => {\n const gotoUrlNode: AgentTestRunnerNodeDefinition<\n z.output<typeof gotoUrlInputSchema>,\n GotoUrlNodeResult\n > = {\n name: 'gotoUrl',\n title: 'Open a Web URL',\n description:\n 'Navigate the current browser Page to an absolute HTTP(S) URL or a path relative to testRunner.baseURL or the current page URL.',\n stringInputKey: 'url',\n inputSchema: gotoUrlInputSchema,\n async execute(agent, input, executionContext) {\n const runtimeAgent = adapter.requireAgent(agent);\n const driver = adapter.createDriver(runtimeAgent);\n throwIfAborted(executionContext.signal, 'gotoUrl');\n const url = resolveNavigationUrl(\n input.url,\n driver.currentUrl(),\n adapter.getOptions(runtimeAgent)?.baseURL ?? driver.baseUrl(),\n );\n const response = await driver.goto(url, {\n waitUntil: input.waitUntil,\n timeoutMs: input.timeoutMs,\n });\n throwIfAborted(executionContext.signal, 'gotoUrl');\n const result = {\n url: driver.currentUrl(),\n status: response.status,\n title: await driver.title(),\n };\n return { summary: `Navigated to ${result.url}`, data: result };\n },\n };\n\n const setCookiesNode: AgentTestRunnerNodeDefinition<\n z.output<typeof setCookiesInputSchema>,\n SetCookiesNodeResult\n > = {\n name: 'setCookies',\n title: 'Set browser cookies',\n description:\n 'Load cookies from an environment variable, configured profile, or browser storage-state file without persisting cookie values in workflow input or output.',\n stringInputKey: false,\n inputSchema: setCookiesInputSchema,\n async execute(agent, input, executionContext) {\n const runtimeAgent = adapter.requireAgent(agent);\n const driver = adapter.createDriver(runtimeAgent);\n throwIfAborted(executionContext.signal, 'setCookies');\n const { cookies, result } = await resolveCookieInput(\n input,\n { ...executionContext, input, context: runtimeAgent },\n adapter.getOptions(runtimeAgent) ?? {},\n );\n throwIfAborted(executionContext.signal, 'setCookies');\n try {\n await driver.setCookies(cookies);\n } catch {\n throw new Error(\n `Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`,\n );\n }\n return {\n summary: `Set ${result.count} browser cookie(s) from ${result.source} ${result.sourceName}`,\n data: result,\n };\n },\n };\n\n const clearCookiesNode: AgentTestRunnerNodeDefinition<\n z.output<typeof clearCookiesInputSchema>,\n { filters: WebCookieFilters }\n > = {\n name: 'clearCookies',\n title: 'Clear browser cookies',\n description:\n 'Clear all cookies from the current browser context, or only cookies matching name, domain, or path.',\n stringInputKey: false,\n inputSchema: clearCookiesInputSchema,\n async execute(agent, input, executionContext) {\n const runtimeAgent = adapter.requireAgent(agent);\n const driver = adapter.createDriver(runtimeAgent);\n throwIfAborted(executionContext.signal, 'clearCookies');\n const filters: WebCookieFilters = { ...input };\n await driver.clearCookies(filters);\n const filterNames = Object.keys(filters);\n return {\n summary:\n filterNames.length === 0\n ? 'Cleared all browser cookies'\n : `Cleared browser cookies matching ${filterNames.join(', ')}`,\n data: { filters },\n };\n },\n };\n\n const setViewportSizeNode: AgentTestRunnerNodeDefinition<\n z.output<typeof setViewportSizeInputSchema>,\n WebViewportSize\n > = {\n name: 'setViewportSize',\n title: 'Set the browser viewport size',\n description:\n 'Set the current browser Page viewport size in CSS pixels and return the effective size.',\n stringInputKey: false,\n inputSchema: setViewportSizeInputSchema,\n async execute(agent, input, executionContext) {\n const runtimeAgent = adapter.requireAgent(agent);\n const driver = adapter.createDriver(runtimeAgent);\n throwIfAborted(executionContext.signal, 'setViewportSize');\n const viewport = await driver.setViewportSize(input);\n return {\n summary: `Set viewport to ${viewport.width}x${viewport.height}`,\n data: viewport,\n };\n },\n };\n\n return [gotoUrlNode, setCookiesNode, clearCookiesNode, setViewportSizeNode];\n};\n\nexport { setCookiesInputSchema };\nexport type { SetCookiesNodeInput, SetCookiesNodeResult } from './cookies';\n"],"names":["DEFAULT_NAVIGATION_TIMEOUT_MS","DEFAULT_WAIT_UNTIL","gotoUrlInputSchema","z","clearCookiesInputSchema","setViewportSizeInputSchema","resolveNavigationUrl","target","currentUrl","configuredBase","trimmed","TypeError","resolveWebUrl","undefined","JSON","createWebTestRunnerNodeDefinitions","adapter","gotoUrlNode","agent","input","executionContext","runtimeAgent","driver","throwIfAborted","url","response","result","setCookiesNode","setCookiesInputSchema","cookies","resolveCookieInput","Error","clearCookiesNode","filters","filterNames","Object","setViewportSizeNode","viewport"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ const SUPPORTED_WEB_PROTOCOLS = new Set([
2
+ 'http:',
3
+ 'https:'
4
+ ]);
5
+ const throwIfAborted = (signal, operation)=>{
6
+ if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
7
+ };
8
+ const resolveWebUrl = (target, baseUrl, label)=>{
9
+ const trimmed = target.trim();
10
+ if (!trimmed) throw new TypeError(`${label} must not be blank.`);
11
+ let resolved;
12
+ try {
13
+ resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
14
+ } catch (error) {
15
+ throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute HTTP(S) URL.` : `${label} is not a valid URL.`, {
16
+ cause: error
17
+ });
18
+ }
19
+ if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
20
+ return resolved.toString();
21
+ };
22
+ export { resolveWebUrl, throwIfAborted };
23
+
24
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common/test-runner/utils.mjs","sources":["../../../../src/common/test-runner/utils.ts"],"sourcesContent":["const SUPPORTED_WEB_PROTOCOLS = new Set(['http:', 'https:']);\n\nexport const throwIfAborted = (signal: AbortSignal, operation: string) => {\n if (signal.aborted) {\n throw signal.reason ?? new Error(`${operation} aborted.`);\n }\n};\n\nexport const resolveWebUrl = (\n target: string,\n baseUrl: string | undefined,\n label: string,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError(`${label} must not be blank.`);\n\n let resolved: URL;\n try {\n resolved =\n baseUrl === undefined ? new URL(trimmed) : new URL(trimmed, baseUrl);\n } catch (error) {\n throw new TypeError(\n baseUrl === undefined\n ? `${label} must be an absolute HTTP(S) URL.`\n : `${label} is not a valid URL.`,\n { cause: error },\n );\n }\n if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) {\n throw new TypeError(\n `${label} does not support the ${resolved.protocol} protocol.`,\n );\n }\n return resolved.toString();\n};\n"],"names":["SUPPORTED_WEB_PROTOCOLS","Set","throwIfAborted","signal","operation","Error","resolveWebUrl","target","baseUrl","label","trimmed","TypeError","resolved","undefined","URL","error"],"mappings":"AAAA,MAAMA,0BAA0B,IAAIC,IAAI;IAAC;IAAS;CAAS;AAEpD,MAAMC,iBAAiB,CAACC,QAAqBC;IAClD,IAAID,OAAO,OAAO,EAChB,MAAMA,OAAO,MAAM,IAAI,IAAIE,MAAM,GAAGD,UAAU,SAAS,CAAC;AAE5D;AAEO,MAAME,gBAAgB,CAC3BC,QACAC,SACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU,GAAGF,MAAM,mBAAmB,CAAC;IAE/D,IAAIG;IACJ,IAAI;QACFA,WACEJ,AAAYK,WAAZL,UAAwB,IAAIM,IAAIJ,WAAW,IAAII,IAAIJ,SAASF;IAChE,EAAE,OAAOO,OAAO;QACd,MAAM,IAAIJ,UACRH,AAAYK,WAAZL,UACI,GAAGC,MAAM,iCAAiC,CAAC,GAC3C,GAAGA,MAAM,oBAAoB,CAAC,EAClC;YAAE,OAAOM;QAAM;IAEnB;IACA,IAAI,CAACf,wBAAwB,GAAG,CAACY,SAAS,QAAQ,GAChD,MAAM,IAAID,UACR,GAAGF,MAAM,sBAAsB,EAAEG,SAAS,QAAQ,CAAC,UAAU,CAAC;IAGlE,OAAOA,SAAS,QAAQ;AAC1B"}
@@ -1,13 +1,6 @@
1
- import { clearCookiesNode } from "./clear-cookies.mjs";
2
- import { setCookiesNode } from "./cookies.mjs";
3
- import { gotoUrlNode } from "./goto-url.mjs";
4
- import { setViewportSizeNode } from "./viewport.mjs";
5
- const playwrightAgentTestRunnerNodeDefinitions = [
6
- gotoUrlNode,
7
- setCookiesNode,
8
- clearCookiesNode,
9
- setViewportSizeNode
10
- ];
1
+ import { createWebTestRunnerNodeDefinitions } from "../../common/test-runner/nodes.mjs";
2
+ import { playwrightTestDriverAdapter } from "./driver.mjs";
3
+ const playwrightAgentTestRunnerNodeDefinitions = createWebTestRunnerNodeDefinitions(playwrightTestDriverAdapter);
11
4
  export { playwrightAgentTestRunnerNodeDefinitions };
12
5
 
13
6
  //# sourceMappingURL=agent-nodes.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"playwright/test-runner/agent-nodes.mjs","sources":["../../../../src/playwright/test-runner/agent-nodes.ts"],"sourcesContent":["import type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { clearCookiesNode } from './clear-cookies';\nimport { setCookiesNode } from './cookies';\nimport { gotoUrlNode } from './goto-url';\nimport { setViewportSizeNode } from './viewport';\n\nexport const playwrightAgentTestRunnerNodeDefinitions: readonly AgentTestRunnerNodeDefinition[] =\n [gotoUrlNode, setCookiesNode, clearCookiesNode, setViewportSizeNode];\n"],"names":["playwrightAgentTestRunnerNodeDefinitions","gotoUrlNode","setCookiesNode","clearCookiesNode","setViewportSizeNode"],"mappings":";;;;AAMO,MAAMA,2CACX;IAACC;IAAaC;IAAgBC;IAAkBC;CAAoB"}
1
+ {"version":3,"file":"playwright/test-runner/agent-nodes.mjs","sources":["../../../../src/playwright/test-runner/agent-nodes.ts"],"sourcesContent":["import { createWebTestRunnerNodeDefinitions } from '@/common/test-runner/nodes';\nimport { playwrightTestDriverAdapter } from './driver';\n\nexport const playwrightAgentTestRunnerNodeDefinitions =\n createWebTestRunnerNodeDefinitions(playwrightTestDriverAdapter);\n"],"names":["playwrightAgentTestRunnerNodeDefinitions","createWebTestRunnerNodeDefinitions","playwrightTestDriverAdapter"],"mappings":";;AAGO,MAAMA,2CACXC,mCAAmCC"}
@@ -0,0 +1,42 @@
1
+ import { requirePlaywrightAgent } from "./utils.mjs";
2
+ const createPlaywrightDriver = (agent)=>{
3
+ const page = agent.interface.underlyingPage;
4
+ return {
5
+ currentUrl: ()=>page.url(),
6
+ baseUrl: ()=>{
7
+ const context = page.context();
8
+ return context._options?.baseURL;
9
+ },
10
+ async goto (url, options) {
11
+ if ('networkidle0' === options.waitUntil || 'networkidle2' === options.waitUntil) throw new TypeError(`Playwright does not support gotoUrl.waitUntil=${options.waitUntil}; use networkidle instead.`);
12
+ const response = await page.goto(url, {
13
+ waitUntil: options.waitUntil,
14
+ timeout: options.timeoutMs
15
+ });
16
+ return {
17
+ status: response?.status() ?? null
18
+ };
19
+ },
20
+ title: ()=>page.title(),
21
+ setCookies: async (cookies)=>{
22
+ await page.context().addCookies(cookies);
23
+ },
24
+ clearCookies: async (filters)=>{
25
+ await page.context().clearCookies(filters);
26
+ },
27
+ setViewportSize: async (size)=>{
28
+ await page.setViewportSize(size);
29
+ const viewport = page.viewportSize();
30
+ if (!viewport) throw new Error('Playwright did not report an effective viewport size.');
31
+ return viewport;
32
+ }
33
+ };
34
+ };
35
+ const playwrightTestDriverAdapter = {
36
+ requireAgent: requirePlaywrightAgent,
37
+ createDriver: createPlaywrightDriver,
38
+ getOptions: (agent)=>agent.testRunner
39
+ };
40
+ export { playwrightTestDriverAdapter };
41
+
42
+ //# sourceMappingURL=driver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright/test-runner/driver.mjs","sources":["../../../../src/playwright/test-runner/driver.ts"],"sourcesContent":["import type {\n WebCookieFilters,\n WebTestDriver,\n WebTestDriverAdapter,\n} from '@/common/test-runner/driver';\nimport type { BrowserContext } from 'playwright';\nimport type {\n PlaywrightTestRunnerAgent,\n PlaywrightTestRunnerOptions,\n} from './types';\nimport { requirePlaywrightAgent } from './utils';\n\ntype CookieClearOptions = NonNullable<\n Parameters<BrowserContext['clearCookies']>[0]\n>;\n\nconst createPlaywrightDriver = (\n agent: PlaywrightTestRunnerAgent,\n): WebTestDriver => {\n const page = agent.interface.underlyingPage;\n return {\n currentUrl: () => page.url(),\n baseUrl: () => {\n const context = page.context() as BrowserContext & {\n _options?: { baseURL?: string };\n };\n return context._options?.baseURL;\n },\n async goto(url, options) {\n if (\n options.waitUntil === 'networkidle0' ||\n options.waitUntil === 'networkidle2'\n ) {\n throw new TypeError(\n `Playwright does not support gotoUrl.waitUntil=${options.waitUntil}; use networkidle instead.`,\n );\n }\n const response = await page.goto(url, {\n waitUntil: options.waitUntil,\n timeout: options.timeoutMs,\n });\n return { status: response?.status() ?? null };\n },\n title: () => page.title(),\n setCookies: async (cookies) => {\n await page.context().addCookies(cookies);\n },\n clearCookies: async (filters: WebCookieFilters) => {\n await page.context().clearCookies(filters as CookieClearOptions);\n },\n setViewportSize: async (size) => {\n await page.setViewportSize(size);\n const viewport = page.viewportSize();\n if (!viewport) {\n throw new Error(\n 'Playwright did not report an effective viewport size.',\n );\n }\n return viewport;\n },\n };\n};\n\nexport const playwrightTestDriverAdapter: WebTestDriverAdapter<\n PlaywrightTestRunnerAgent,\n PlaywrightTestRunnerOptions\n> = {\n requireAgent: requirePlaywrightAgent,\n createDriver: createPlaywrightDriver,\n getOptions: (agent) => agent.testRunner,\n};\n"],"names":["createPlaywrightDriver","agent","page","context","url","options","TypeError","response","cookies","filters","size","viewport","Error","playwrightTestDriverAdapter","requirePlaywrightAgent"],"mappings":";AAgBA,MAAMA,yBAAyB,CAC7BC;IAEA,MAAMC,OAAOD,MAAM,SAAS,CAAC,cAAc;IAC3C,OAAO;QACL,YAAY,IAAMC,KAAK,GAAG;QAC1B,SAAS;YACP,MAAMC,UAAUD,KAAK,OAAO;YAG5B,OAAOC,QAAQ,QAAQ,EAAE;QAC3B;QACA,MAAM,MAAKC,GAAG,EAAEC,OAAO;YACrB,IACEA,AAAsB,mBAAtBA,QAAQ,SAAS,IACjBA,AAAsB,mBAAtBA,QAAQ,SAAS,EAEjB,MAAM,IAAIC,UACR,CAAC,8CAA8C,EAAED,QAAQ,SAAS,CAAC,0BAA0B,CAAC;YAGlG,MAAME,WAAW,MAAML,KAAK,IAAI,CAACE,KAAK;gBACpC,WAAWC,QAAQ,SAAS;gBAC5B,SAASA,QAAQ,SAAS;YAC5B;YACA,OAAO;gBAAE,QAAQE,UAAU,YAAY;YAAK;QAC9C;QACA,OAAO,IAAML,KAAK,KAAK;QACvB,YAAY,OAAOM;YACjB,MAAMN,KAAK,OAAO,GAAG,UAAU,CAACM;QAClC;QACA,cAAc,OAAOC;YACnB,MAAMP,KAAK,OAAO,GAAG,YAAY,CAACO;QACpC;QACA,iBAAiB,OAAOC;YACtB,MAAMR,KAAK,eAAe,CAACQ;YAC3B,MAAMC,WAAWT,KAAK,YAAY;YAClC,IAAI,CAACS,UACH,MAAM,IAAIC,MACR;YAGJ,OAAOD;QACT;IACF;AACF;AAEO,MAAME,8BAGT;IACF,cAAcC;IACd,cAAcd;IACd,YAAY,CAACC,QAAUA,MAAM,UAAU;AACzC"}
@@ -1,6 +1,3 @@
1
- import { clearCookiesInputSchema } from "./clear-cookies.mjs";
2
- import { setCookiesInputSchema } from "./cookies.mjs";
3
- import { gotoUrlInputSchema } from "./goto-url.mjs";
4
- import { setViewportSizeInputSchema } from "./viewport.mjs";
1
+ import { clearCookiesInputSchema, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema } from "../../common/test-runner/nodes.mjs";
5
2
  import { playwrightAgentTestRunnerNodeDefinitions } from "./agent-nodes.mjs";
6
3
  export { clearCookiesInputSchema, gotoUrlInputSchema, playwrightAgentTestRunnerNodeDefinitions, setCookiesInputSchema, setViewportSizeInputSchema };
@@ -1,24 +1,4 @@
1
- const SUPPORTED_WEB_PROTOCOLS = new Set([
2
- 'http:',
3
- 'https:'
4
- ]);
5
- const throwIfAborted = (signal, operation)=>{
6
- if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
7
- };
8
- const resolveWebUrl = (target, baseUrl, label)=>{
9
- const trimmed = target.trim();
10
- if (!trimmed) throw new TypeError(`${label} must not be blank.`);
11
- let resolved;
12
- try {
13
- resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
14
- } catch (error) {
15
- throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute HTTP(S) URL.` : `${label} is not a valid URL.`, {
16
- cause: error
17
- });
18
- }
19
- if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
20
- return resolved.toString();
21
- };
1
+ import { resolveWebUrl, throwIfAborted } from "../../common/test-runner/utils.mjs";
22
2
  const requirePlaywrightAgent = (agent)=>{
23
3
  if (!agent || 'object' != typeof agent || !('interface' in agent) || !agent.interface || 'object' != typeof agent.interface || !('underlyingPage' in agent.interface) || !agent.interface.underlyingPage) throw new TypeError('getAgent() must return a Playwright Agent with an underlying Page.');
24
4
  return agent;
@@ -1 +1 @@
1
- {"version":3,"file":"playwright/test-runner/utils.mjs","sources":["../../../../src/playwright/test-runner/utils.ts"],"sourcesContent":["import type { PlaywrightTestRunnerAgent } from './types';\n\nconst SUPPORTED_WEB_PROTOCOLS = new Set(['http:', 'https:']);\n\nexport const throwIfAborted = (signal: AbortSignal, operation: string) => {\n if (signal.aborted) {\n throw signal.reason ?? new Error(`${operation} aborted.`);\n }\n};\n\nexport const resolveWebUrl = (\n target: string,\n baseUrl: string | undefined,\n label: string,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError(`${label} must not be blank.`);\n\n let resolved: URL;\n try {\n resolved =\n baseUrl === undefined ? new URL(trimmed) : new URL(trimmed, baseUrl);\n } catch (error) {\n throw new TypeError(\n baseUrl === undefined\n ? `${label} must be an absolute HTTP(S) URL.`\n : `${label} is not a valid URL.`,\n { cause: error },\n );\n }\n if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) {\n throw new TypeError(\n `${label} does not support the ${resolved.protocol} protocol.`,\n );\n }\n return resolved.toString();\n};\n\nexport const requirePlaywrightAgent = (\n agent: unknown,\n): PlaywrightTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Playwright Agent with an underlying Page.',\n );\n }\n return agent as PlaywrightTestRunnerAgent;\n};\n"],"names":["SUPPORTED_WEB_PROTOCOLS","Set","throwIfAborted","signal","operation","Error","resolveWebUrl","target","baseUrl","label","trimmed","TypeError","resolved","undefined","URL","error","requirePlaywrightAgent","agent"],"mappings":"AAEA,MAAMA,0BAA0B,IAAIC,IAAI;IAAC;IAAS;CAAS;AAEpD,MAAMC,iBAAiB,CAACC,QAAqBC;IAClD,IAAID,OAAO,OAAO,EAChB,MAAMA,OAAO,MAAM,IAAI,IAAIE,MAAM,GAAGD,UAAU,SAAS,CAAC;AAE5D;AAEO,MAAME,gBAAgB,CAC3BC,QACAC,SACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU,GAAGF,MAAM,mBAAmB,CAAC;IAE/D,IAAIG;IACJ,IAAI;QACFA,WACEJ,AAAYK,WAAZL,UAAwB,IAAIM,IAAIJ,WAAW,IAAII,IAAIJ,SAASF;IAChE,EAAE,OAAOO,OAAO;QACd,MAAM,IAAIJ,UACRH,AAAYK,WAAZL,UACI,GAAGC,MAAM,iCAAiC,CAAC,GAC3C,GAAGA,MAAM,oBAAoB,CAAC,EAClC;YAAE,OAAOM;QAAM;IAEnB;IACA,IAAI,CAACf,wBAAwB,GAAG,CAACY,SAAS,QAAQ,GAChD,MAAM,IAAID,UACR,GAAGF,MAAM,sBAAsB,EAAEG,SAAS,QAAQ,CAAC,UAAU,CAAC;IAGlE,OAAOA,SAAS,QAAQ;AAC1B;AAEO,MAAMI,yBAAyB,CACpCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIN,UACR;IAGJ,OAAOM;AACT"}
1
+ {"version":3,"file":"playwright/test-runner/utils.mjs","sources":["../../../../src/playwright/test-runner/utils.ts"],"sourcesContent":["export { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';\n\nimport type { PlaywrightTestRunnerAgent } from './types';\n\nexport const requirePlaywrightAgent = (\n agent: unknown,\n): PlaywrightTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Playwright Agent with an underlying Page.',\n );\n }\n return agent as PlaywrightTestRunnerAgent;\n};\n"],"names":["requirePlaywrightAgent","agent","TypeError"],"mappings":";AAIO,MAAMA,yBAAyB,CACpCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIC,UACR;IAGJ,OAAOD;AACT"}
@@ -4,6 +4,7 @@ import { appendBrowserAgentPageActions, createBrowserAgentPageActions } from "..
4
4
  import { getDebug } from "@midscene/shared/logger";
5
5
  import { createPuppeteerBrowserPageManager } from "./browser-page-manager.mjs";
6
6
  import { PuppeteerWebPage } from "./page.mjs";
7
+ import { puppeteerAgentTestRunnerNodeDefinitions } from "./test-runner/agent-nodes.mjs";
7
8
  function _define_property(obj, key, value) {
8
9
  if (key in obj) Object.defineProperty(obj, key, {
9
10
  value: value,
@@ -16,6 +17,12 @@ function _define_property(obj, key, value) {
16
17
  }
17
18
  const debug = getDebug('puppeteer:browser-agent');
18
19
  class PuppeteerBrowserAgent extends WebAgentCore {
20
+ static getTestRunnerNodeDefinitions() {
21
+ return [
22
+ ...WebAgentCore.getTestRunnerNodeDefinitions(),
23
+ ...puppeteerAgentTestRunnerNodeDefinitions
24
+ ];
25
+ }
19
26
  static async create(browser, opts) {
20
27
  const { initialPage, ...agentOpts } = opts ?? {};
21
28
  const page = initialPage ?? (await browser.pages())[0] ?? await browser.newPage();
@@ -67,7 +74,8 @@ class PuppeteerBrowserAgent extends WebAgentCore {
67
74
  debug,
68
75
  pageScope
69
76
  });
70
- super(webPage, agentOpts), _define_property(this, "pageManager", void 0);
77
+ super(webPage, agentOpts), _define_property(this, "testRunner", void 0), _define_property(this, "pageManager", void 0);
78
+ this.testRunner = opts?.testRunner;
71
79
  this.pageManager = pageManager;
72
80
  applyForceChromeSelectRendering(initialPage, 'puppeteer', forceChromeSelectRendering);
73
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"puppeteer/browser-agent.mjs","sources":["../../../src/puppeteer/browser-agent.ts"],"sourcesContent":["import {\n type BrowserPageManager,\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport {\n appendBrowserAgentPageActions,\n createBrowserAgentPageActions,\n} from '@/common/browser-page-actions';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport type {\n Browser as PuppeteerBrowser,\n Page as PuppeteerPage,\n Target as PuppeteerTarget,\n} from 'puppeteer';\nimport { createPuppeteerBrowserPageManager } from './browser-page-manager';\nimport type { PuppeteerBrowserPageScope } from './browser-page-manager';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:browser-agent');\n\nexport type PuppeteerBrowserAgentOpt = Omit<\n WebPageAgentOpt,\n 'forceSameTabNavigation'\n> & {\n autoFollowNewPage?: boolean;\n newPageTimeout?: number;\n};\n\nexport type PuppeteerBrowserAgentCreateOpt = PuppeteerBrowserAgentOpt & {\n initialPage?: PuppeteerPage;\n};\n\nexport class PuppeteerBrowserAgent extends WebAgentCore<PuppeteerWebPage> {\n protected readonly pageManager: BrowserPageManager<\n PuppeteerPage,\n PuppeteerTarget\n >;\n\n constructor(\n browser: PuppeteerBrowser,\n initialPage: PuppeteerPage,\n opts?: PuppeteerBrowserAgentOpt,\n pageScope?: PuppeteerBrowserPageScope,\n ) {\n if (!browser) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid Puppeteer browser instance.',\n );\n }\n if (!initialPage) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid initial page instance.',\n );\n }\n\n const { autoFollowNewPage, newPageTimeout, ...agentOpts } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerBrowserAgent',\n pageScope: 'browser',\n forceSameTabNavigation: (opts as WebPageAgentOpt | undefined)\n ?.forceSameTabNavigation,\n autoFollowNewPage,\n newPageTimeout,\n });\n const { forceChromeSelectRendering } = agentOpts;\n const browserActions = createBrowserAgentPageActions({\n getPageManager: () => pageManager,\n });\n const webPage: PuppeteerWebPage = new PuppeteerWebPage(initialPage, {\n ...agentOpts,\n forceSameTabNavigation: runtimeOptions.forceSameTabNavigation,\n customActions: appendBrowserAgentPageActions(\n agentOpts.customActions,\n browserActions,\n ),\n });\n const pageManager: BrowserPageManager<PuppeteerPage, PuppeteerTarget> =\n createPuppeteerBrowserPageManager({\n browser,\n webPage,\n runtimeOptions,\n debug,\n pageScope,\n });\n super(webPage, agentOpts);\n this.pageManager = pageManager;\n\n applyForceChromeSelectRendering(\n initialPage,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n\n static async create(\n browser: PuppeteerBrowser,\n opts?: PuppeteerBrowserAgentCreateOpt,\n ) {\n const { initialPage, ...agentOpts } = opts ?? {};\n const page =\n initialPage ?? (await browser.pages())[0] ?? (await browser.newPage());\n\n return new PuppeteerBrowserAgent(browser, page, agentOpts);\n }\n\n get activePage() {\n return this.pageManager.activePage;\n }\n\n pages() {\n return this.pageManager.pages();\n }\n\n async newPage() {\n return this.pageManager.newPage();\n }\n\n async setActivePage(page: PuppeteerPage) {\n await this.pageManager.setActivePage(page);\n }\n\n async waitForNewPage(\n action?: () => Promise<unknown> | unknown,\n opts?: { timeout?: number },\n ) {\n return this.pageManager.waitForNewPage(action, opts);\n }\n\n async destroy() {\n this.pageManager.destroy();\n await super.destroy();\n }\n}\n"],"names":["debug","getDebug","PuppeteerBrowserAgent","WebAgentCore","browser","opts","initialPage","agentOpts","page","action","pageScope","Error","autoFollowNewPage","newPageTimeout","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceChromeSelectRendering","browserActions","createBrowserAgentPageActions","pageManager","webPage","PuppeteerWebPage","appendBrowserAgentPageActions","createPuppeteerBrowserPageManager","applyForceChromeSelectRendering"],"mappings":";;;;;;;;;;;;;;;;AAqBA,MAAMA,QAAQC,SAAS;AAchB,MAAMC,8BAA8BC;IA8DzC,aAAa,OACXC,OAAyB,EACzBC,IAAqC,EACrC;QACA,MAAM,EAAEC,WAAW,EAAE,GAAGC,WAAW,GAAGF,QAAQ,CAAC;QAC/C,MAAMG,OACJF,eAAgB,OAAMF,QAAQ,KAAK,EAAC,CAAE,CAAC,EAAE,IAAK,MAAMA,QAAQ,OAAO;QAErE,OAAO,IAAIF,sBAAsBE,SAASI,MAAMD;IAClD;IAEA,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU;IACpC;IAEA,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK;IAC/B;IAEA,MAAM,UAAU;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO;IACjC;IAEA,MAAM,cAAcC,IAAmB,EAAE;QACvC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAACA;IACvC;IAEA,MAAM,eACJC,MAAyC,EACzCJ,IAA2B,EAC3B;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAACI,QAAQJ;IACjD;IAEA,MAAM,UAAU;QACd,IAAI,CAAC,WAAW,CAAC,OAAO;QACxB,MAAM,KAAK,CAAC;IACd;IA7FA,YACED,OAAyB,EACzBE,WAA0B,EAC1BD,IAA+B,EAC/BK,SAAqC,CACrC;QACA,IAAI,CAACN,SACH,MAAM,IAAIO,MACR;QAGJ,IAAI,CAACL,aACH,MAAM,IAAIK,MACR;QAIJ,MAAM,EAAEC,iBAAiB,EAAEC,cAAc,EAAE,GAAGN,WAAW,GAAGF,QAAQ,CAAC;QACrE,MAAMS,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACX,wBAAyBV,MACrB;YACJO;YACAC;QACF;QACA,MAAM,EAAEG,0BAA0B,EAAE,GAAGT;QACvC,MAAMU,iBAAiBC,8BAA8B;YACnD,gBAAgB,IAAMC;QACxB;QACA,MAAMC,UAA4B,IAAIC,iBAAiBf,aAAa;YAClE,GAAGC,SAAS;YACZ,wBAAwBO,eAAe,sBAAsB;YAC7D,eAAeQ,8BACbf,UAAU,aAAa,EACvBU;QAEJ;QACA,MAAME,cACJI,kCAAkC;YAChCnB;YACAgB;YACAN;YACAd;YACAU;QACF;QACF,KAAK,CAACU,SAASb,YAnDjB,uBAAmB,eAAnB;QAoDE,IAAI,CAAC,WAAW,GAAGY;QAEnBK,gCACElB,aACA,aACAU;IAEJ;AAwCF"}
1
+ {"version":3,"file":"puppeteer/browser-agent.mjs","sources":["../../../src/puppeteer/browser-agent.ts"],"sourcesContent":["import {\n type BrowserPageManager,\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport {\n appendBrowserAgentPageActions,\n createBrowserAgentPageActions,\n} from '@/common/browser-page-actions';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { getDebug } from '@midscene/shared/logger';\nimport type {\n Browser as PuppeteerBrowser,\n Page as PuppeteerPage,\n Target as PuppeteerTarget,\n} from 'puppeteer';\nimport { createPuppeteerBrowserPageManager } from './browser-page-manager';\nimport type { PuppeteerBrowserPageScope } from './browser-page-manager';\nimport { PuppeteerWebPage } from './page';\nimport { puppeteerAgentTestRunnerNodeDefinitions } from './test-runner/agent-nodes';\nimport type { PuppeteerTestRunnerOptions } from './test-runner/types';\n\nconst debug = getDebug('puppeteer:browser-agent');\n\nexport type PuppeteerBrowserAgentOpt = Omit<\n WebPageAgentOpt,\n 'forceSameTabNavigation'\n> & {\n testRunner?: PuppeteerTestRunnerOptions;\n autoFollowNewPage?: boolean;\n newPageTimeout?: number;\n};\n\nexport type PuppeteerBrowserAgentCreateOpt = PuppeteerBrowserAgentOpt & {\n initialPage?: PuppeteerPage;\n};\n\nexport class PuppeteerBrowserAgent extends WebAgentCore<PuppeteerWebPage> {\n static override getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return [\n ...WebAgentCore.getTestRunnerNodeDefinitions(),\n ...puppeteerAgentTestRunnerNodeDefinitions,\n ];\n }\n\n readonly testRunner?: PuppeteerTestRunnerOptions;\n\n protected readonly pageManager: BrowserPageManager<\n PuppeteerPage,\n PuppeteerTarget\n >;\n\n constructor(\n browser: PuppeteerBrowser,\n initialPage: PuppeteerPage,\n opts?: PuppeteerBrowserAgentOpt,\n pageScope?: PuppeteerBrowserPageScope,\n ) {\n if (!browser) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid Puppeteer browser instance.',\n );\n }\n if (!initialPage) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid initial page instance.',\n );\n }\n\n const { autoFollowNewPage, newPageTimeout, ...agentOpts } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerBrowserAgent',\n pageScope: 'browser',\n forceSameTabNavigation: (opts as WebPageAgentOpt | undefined)\n ?.forceSameTabNavigation,\n autoFollowNewPage,\n newPageTimeout,\n });\n const { forceChromeSelectRendering } = agentOpts;\n const browserActions = createBrowserAgentPageActions({\n getPageManager: () => pageManager,\n });\n const webPage: PuppeteerWebPage = new PuppeteerWebPage(initialPage, {\n ...agentOpts,\n forceSameTabNavigation: runtimeOptions.forceSameTabNavigation,\n customActions: appendBrowserAgentPageActions(\n agentOpts.customActions,\n browserActions,\n ),\n });\n const pageManager: BrowserPageManager<PuppeteerPage, PuppeteerTarget> =\n createPuppeteerBrowserPageManager({\n browser,\n webPage,\n runtimeOptions,\n debug,\n pageScope,\n });\n super(webPage, agentOpts);\n this.testRunner = opts?.testRunner;\n this.pageManager = pageManager;\n\n applyForceChromeSelectRendering(\n initialPage,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n\n static async create(\n browser: PuppeteerBrowser,\n opts?: PuppeteerBrowserAgentCreateOpt,\n ) {\n const { initialPage, ...agentOpts } = opts ?? {};\n const page =\n initialPage ?? (await browser.pages())[0] ?? (await browser.newPage());\n\n return new PuppeteerBrowserAgent(browser, page, agentOpts);\n }\n\n get activePage() {\n return this.pageManager.activePage;\n }\n\n pages() {\n return this.pageManager.pages();\n }\n\n async newPage() {\n return this.pageManager.newPage();\n }\n\n async setActivePage(page: PuppeteerPage) {\n await this.pageManager.setActivePage(page);\n }\n\n async waitForNewPage(\n action?: () => Promise<unknown> | unknown,\n opts?: { timeout?: number },\n ) {\n return this.pageManager.waitForNewPage(action, opts);\n }\n\n async destroy() {\n this.pageManager.destroy();\n await super.destroy();\n }\n}\n"],"names":["debug","getDebug","PuppeteerBrowserAgent","WebAgentCore","puppeteerAgentTestRunnerNodeDefinitions","browser","opts","initialPage","agentOpts","page","action","pageScope","Error","autoFollowNewPage","newPageTimeout","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceChromeSelectRendering","browserActions","createBrowserAgentPageActions","pageManager","webPage","PuppeteerWebPage","appendBrowserAgentPageActions","createPuppeteerBrowserPageManager","applyForceChromeSelectRendering"],"mappings":";;;;;;;;;;;;;;;;;AAwBA,MAAMA,QAAQC,SAAS;AAehB,MAAMC,8BAA8BC;IACzC,OAAgB,+BAAyE;QACvF,OAAO;eACFA,aAAa,4BAA4B;eACzCC;SACJ;IACH;IAkEA,aAAa,OACXC,OAAyB,EACzBC,IAAqC,EACrC;QACA,MAAM,EAAEC,WAAW,EAAE,GAAGC,WAAW,GAAGF,QAAQ,CAAC;QAC/C,MAAMG,OACJF,eAAgB,OAAMF,QAAQ,KAAK,EAAC,CAAE,CAAC,EAAE,IAAK,MAAMA,QAAQ,OAAO;QAErE,OAAO,IAAIH,sBAAsBG,SAASI,MAAMD;IAClD;IAEA,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU;IACpC;IAEA,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK;IAC/B;IAEA,MAAM,UAAU;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO;IACjC;IAEA,MAAM,cAAcC,IAAmB,EAAE;QACvC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAACA;IACvC;IAEA,MAAM,eACJC,MAAyC,EACzCJ,IAA2B,EAC3B;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAACI,QAAQJ;IACjD;IAEA,MAAM,UAAU;QACd,IAAI,CAAC,WAAW,CAAC,OAAO;QACxB,MAAM,KAAK,CAAC;IACd;IA9FA,YACED,OAAyB,EACzBE,WAA0B,EAC1BD,IAA+B,EAC/BK,SAAqC,CACrC;QACA,IAAI,CAACN,SACH,MAAM,IAAIO,MACR;QAGJ,IAAI,CAACL,aACH,MAAM,IAAIK,MACR;QAIJ,MAAM,EAAEC,iBAAiB,EAAEC,cAAc,EAAE,GAAGN,WAAW,GAAGF,QAAQ,CAAC;QACrE,MAAMS,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACX,wBAAyBV,MACrB;YACJO;YACAC;QACF;QACA,MAAM,EAAEG,0BAA0B,EAAE,GAAGT;QACvC,MAAMU,iBAAiBC,8BAA8B;YACnD,gBAAgB,IAAMC;QACxB;QACA,MAAMC,UAA4B,IAAIC,iBAAiBf,aAAa;YAClE,GAAGC,SAAS;YACZ,wBAAwBO,eAAe,sBAAsB;YAC7D,eAAeQ,8BACbf,UAAU,aAAa,EACvBU;QAEJ;QACA,MAAME,cACJI,kCAAkC;YAChCnB;YACAgB;YACAN;YACAf;YACAW;QACF;QACF,KAAK,CAACU,SAASb,YArDjB,uBAAS,cAAT,SAEA,uBAAmB,eAAnB;QAoDE,IAAI,CAAC,UAAU,GAAGF,MAAM;QACxB,IAAI,CAAC,WAAW,GAAGc;QAEnBK,gCACElB,aACA,aACAU;IAEJ;AAwCF"}
@@ -3,12 +3,30 @@ import { applyForceChromeSelectRendering } from "../common/browser-agent-utils.m
3
3
  import { getDebug } from "@midscene/shared/logger";
4
4
  import { forceClosePopup } from "./base-page.mjs";
5
5
  import { PuppeteerWebPage } from "./page.mjs";
6
+ import { puppeteerAgentTestRunnerNodeDefinitions } from "./test-runner/agent-nodes.mjs";
7
+ function _define_property(obj, key, value) {
8
+ if (key in obj) Object.defineProperty(obj, key, {
9
+ value: value,
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true
13
+ });
14
+ else obj[key] = value;
15
+ return obj;
16
+ }
6
17
  const debug = getDebug('puppeteer:agent');
7
18
  class PuppeteerPageAgent extends WebAgentCore {
19
+ static getTestRunnerNodeDefinitions() {
20
+ return [
21
+ ...WebAgentCore.getTestRunnerNodeDefinitions(),
22
+ ...puppeteerAgentTestRunnerNodeDefinitions
23
+ ];
24
+ }
8
25
  constructor(page, opts){
9
26
  if (!page) throw new Error('[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.');
10
27
  const webPage = new PuppeteerWebPage(page, opts);
11
- super(webPage, opts);
28
+ super(webPage, opts), _define_property(this, "testRunner", void 0);
29
+ this.testRunner = opts?.testRunner;
12
30
  const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};
13
31
  const runtimeOptions = resolveBrowserAgentRuntimeOptions({
14
32
  agentName: 'PuppeteerPageAgent',
@@ -1 +1 @@
1
- {"version":3,"file":"puppeteer/page-agent.mjs","sources":["../../../src/puppeteer/page-agent.ts"],"sourcesContent":["import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {\n constructor(page: PuppeteerPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PuppeteerWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerPageAgent',\n pageScope: 'page',\n forceSameTabNavigation,\n });\n\n if (runtimeOptions.forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n applyForceChromeSelectRendering(\n page,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n}\n\nexport { PuppeteerPageAgent as PuppeteerAgent };\n"],"names":["debug","getDebug","PuppeteerPageAgent","WebAgentCore","page","opts","Error","webPage","PuppeteerWebPage","forceSameTabNavigation","forceChromeSelectRendering","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceClosePopup","applyForceChromeSelectRendering"],"mappings":";;;;;AAWA,MAAMA,QAAQC,SAAS;AAEhB,MAAMC,2BAA2BC;IACtC,YAAYC,IAAmB,EAAEC,IAAsB,CAAE;QACvD,IAAI,CAACD,MACH,MAAM,IAAIE,MACR;QAGJ,MAAMC,UAAU,IAAIC,iBAAiBJ,MAAMC;QAC3C,KAAK,CAACE,SAASF;QAEf,MAAM,EAAEI,sBAAsB,EAAEC,0BAA0B,EAAE,GAAGL,QAAQ,CAAC;QACxE,MAAMM,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACXH;QACF;QAEA,IAAIE,eAAe,sBAAsB,EACvCE,gBAAgBT,MAAMJ;QAGxBc,gCACEV,MACA,aACAM;IAEJ;AACF"}
1
+ {"version":3,"file":"puppeteer/page-agent.mjs","sources":["../../../src/puppeteer/page-agent.ts"],"sourcesContent":["import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\nimport { puppeteerAgentTestRunnerNodeDefinitions } from './test-runner/agent-nodes';\nimport type { PuppeteerTestRunnerOptions } from './test-runner/types';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport type PuppeteerPageAgentOpt = WebPageAgentOpt & {\n testRunner?: PuppeteerTestRunnerOptions;\n};\n\nexport class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {\n static override getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return [\n ...WebAgentCore.getTestRunnerNodeDefinitions(),\n ...puppeteerAgentTestRunnerNodeDefinitions,\n ];\n }\n\n readonly testRunner?: PuppeteerTestRunnerOptions;\n\n constructor(page: PuppeteerPage, opts?: PuppeteerPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PuppeteerWebPage(page, opts);\n super(webPage, opts);\n this.testRunner = opts?.testRunner;\n\n const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerPageAgent',\n pageScope: 'page',\n forceSameTabNavigation,\n });\n\n if (runtimeOptions.forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n applyForceChromeSelectRendering(\n page,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n}\n\nexport { PuppeteerPageAgent as PuppeteerAgent };\n"],"names":["debug","getDebug","PuppeteerPageAgent","WebAgentCore","puppeteerAgentTestRunnerNodeDefinitions","page","opts","Error","webPage","PuppeteerWebPage","forceSameTabNavigation","forceChromeSelectRendering","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceClosePopup","applyForceChromeSelectRendering"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAMA,QAAQC,SAAS;AAMhB,MAAMC,2BAA2BC;IACtC,OAAgB,+BAAyE;QACvF,OAAO;eACFA,aAAa,4BAA4B;eACzCC;SACJ;IACH;IAIA,YAAYC,IAAmB,EAAEC,IAA4B,CAAE;QAC7D,IAAI,CAACD,MACH,MAAM,IAAIE,MACR;QAGJ,MAAMC,UAAU,IAAIC,iBAAiBJ,MAAMC;QAC3C,KAAK,CAACE,SAASF,OATjB,uBAAS,cAAT;QAUE,IAAI,CAAC,UAAU,GAAGA,MAAM;QAExB,MAAM,EAAEI,sBAAsB,EAAEC,0BAA0B,EAAE,GAAGL,QAAQ,CAAC;QACxE,MAAMM,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACXH;QACF;QAEA,IAAIE,eAAe,sBAAsB,EACvCE,gBAAgBT,MAAML;QAGxBe,gCACEV,MACA,aACAM;IAEJ;AACF"}
@@ -0,0 +1,6 @@
1
+ import { createWebTestRunnerNodeDefinitions } from "../../common/test-runner/nodes.mjs";
2
+ import { puppeteerTestDriverAdapter } from "./driver.mjs";
3
+ const puppeteerAgentTestRunnerNodeDefinitions = createWebTestRunnerNodeDefinitions(puppeteerTestDriverAdapter);
4
+ export { puppeteerAgentTestRunnerNodeDefinitions };
5
+
6
+ //# sourceMappingURL=agent-nodes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer/test-runner/agent-nodes.mjs","sources":["../../../../src/puppeteer/test-runner/agent-nodes.ts"],"sourcesContent":["import { createWebTestRunnerNodeDefinitions } from '@/common/test-runner/nodes';\nimport { puppeteerTestDriverAdapter } from './driver';\n\nexport const puppeteerAgentTestRunnerNodeDefinitions =\n createWebTestRunnerNodeDefinitions(puppeteerTestDriverAdapter);\n"],"names":["puppeteerAgentTestRunnerNodeDefinitions","createWebTestRunnerNodeDefinitions","puppeteerTestDriverAdapter"],"mappings":";;AAGO,MAAMA,0CACXC,mCAAmCC"}
@@ -0,0 +1,44 @@
1
+ import { requirePuppeteerAgent } from "./utils.mjs";
2
+ const createPuppeteerDriver = (agent)=>{
3
+ const page = agent.interface.underlyingPage;
4
+ return {
5
+ currentUrl: ()=>page.url(),
6
+ baseUrl: ()=>void 0,
7
+ async goto (url, options) {
8
+ if ('commit' === options.waitUntil) throw new TypeError('Puppeteer does not support gotoUrl.waitUntil=commit; use domcontentloaded instead.');
9
+ const response = await page.goto(url, {
10
+ waitUntil: 'networkidle' === options.waitUntil ? 'networkidle0' : options.waitUntil,
11
+ timeout: options.timeoutMs
12
+ });
13
+ return {
14
+ status: response?.status() ?? null
15
+ };
16
+ },
17
+ title: ()=>page.title(),
18
+ setCookies: async (cookies)=>{
19
+ await page.setCookie(...cookies.map((cookie)=>cookie));
20
+ },
21
+ clearCookies: async (filters)=>{
22
+ const browserContext = page.browserContext();
23
+ const cookies = (await browserContext.cookies()).filter((cookie)=>(void 0 === filters.name || cookie.name === filters.name) && (void 0 === filters.domain || cookie.domain === filters.domain) && (void 0 === filters.path || cookie.path === filters.path));
24
+ if (cookies.length > 0) await browserContext.deleteCookie(...cookies);
25
+ },
26
+ setViewportSize: async (size)=>{
27
+ await page.setViewport(size);
28
+ const viewport = page.viewport();
29
+ if (!viewport) throw new Error('Puppeteer did not report an effective viewport size.');
30
+ return {
31
+ width: viewport.width,
32
+ height: viewport.height
33
+ };
34
+ }
35
+ };
36
+ };
37
+ const puppeteerTestDriverAdapter = {
38
+ requireAgent: requirePuppeteerAgent,
39
+ createDriver: createPuppeteerDriver,
40
+ getOptions: (agent)=>agent.testRunner
41
+ };
42
+ export { puppeteerTestDriverAdapter };
43
+
44
+ //# sourceMappingURL=driver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer/test-runner/driver.mjs","sources":["../../../../src/puppeteer/test-runner/driver.ts"],"sourcesContent":["import type {\n WebTestDriver,\n WebTestDriverAdapter,\n} from '@/common/test-runner/driver';\nimport type { CookieParam } from 'puppeteer';\nimport type {\n PuppeteerTestRunnerAgent,\n PuppeteerTestRunnerOptions,\n} from './types';\nimport { requirePuppeteerAgent } from './utils';\n\nconst createPuppeteerDriver = (\n agent: PuppeteerTestRunnerAgent,\n): WebTestDriver => {\n const page = agent.interface.underlyingPage;\n return {\n currentUrl: () => page.url(),\n baseUrl: () => undefined,\n async goto(url, options) {\n if (options.waitUntil === 'commit') {\n throw new TypeError(\n 'Puppeteer does not support gotoUrl.waitUntil=commit; use domcontentloaded instead.',\n );\n }\n const response = await page.goto(url, {\n waitUntil:\n options.waitUntil === 'networkidle'\n ? 'networkidle0'\n : options.waitUntil,\n timeout: options.timeoutMs,\n });\n return { status: response?.status() ?? null };\n },\n title: () => page.title(),\n setCookies: async (cookies) => {\n await page.setCookie(\n ...cookies.map((cookie) => cookie as unknown as CookieParam),\n );\n },\n clearCookies: async (filters) => {\n const browserContext = page.browserContext();\n const cookies = (await browserContext.cookies()).filter(\n (cookie) =>\n (filters.name === undefined || cookie.name === filters.name) &&\n (filters.domain === undefined || cookie.domain === filters.domain) &&\n (filters.path === undefined || cookie.path === filters.path),\n );\n if (cookies.length > 0) await browserContext.deleteCookie(...cookies);\n },\n setViewportSize: async (size) => {\n await page.setViewport(size);\n const viewport = page.viewport();\n if (!viewport) {\n throw new Error('Puppeteer did not report an effective viewport size.');\n }\n return { width: viewport.width, height: viewport.height };\n },\n };\n};\n\nexport const puppeteerTestDriverAdapter: WebTestDriverAdapter<\n PuppeteerTestRunnerAgent,\n PuppeteerTestRunnerOptions\n> = {\n requireAgent: requirePuppeteerAgent,\n createDriver: createPuppeteerDriver,\n getOptions: (agent) => agent.testRunner,\n};\n"],"names":["createPuppeteerDriver","agent","page","undefined","url","options","TypeError","response","cookies","cookie","filters","browserContext","size","viewport","Error","puppeteerTestDriverAdapter","requirePuppeteerAgent"],"mappings":";AAWA,MAAMA,wBAAwB,CAC5BC;IAEA,MAAMC,OAAOD,MAAM,SAAS,CAAC,cAAc;IAC3C,OAAO;QACL,YAAY,IAAMC,KAAK,GAAG;QAC1B,SAAS,IAAMC;QACf,MAAM,MAAKC,GAAG,EAAEC,OAAO;YACrB,IAAIA,AAAsB,aAAtBA,QAAQ,SAAS,EACnB,MAAM,IAAIC,UACR;YAGJ,MAAMC,WAAW,MAAML,KAAK,IAAI,CAACE,KAAK;gBACpC,WACEC,AAAsB,kBAAtBA,QAAQ,SAAS,GACb,iBACAA,QAAQ,SAAS;gBACvB,SAASA,QAAQ,SAAS;YAC5B;YACA,OAAO;gBAAE,QAAQE,UAAU,YAAY;YAAK;QAC9C;QACA,OAAO,IAAML,KAAK,KAAK;QACvB,YAAY,OAAOM;YACjB,MAAMN,KAAK,SAAS,IACfM,QAAQ,GAAG,CAAC,CAACC,SAAWA;QAE/B;QACA,cAAc,OAAOC;YACnB,MAAMC,iBAAiBT,KAAK,cAAc;YAC1C,MAAMM,UAAW,OAAMG,eAAe,OAAO,EAAC,EAAG,MAAM,CACrD,CAACF,SACEC,AAAAA,CAAAA,AAAiBP,WAAjBO,QAAQ,IAAI,IAAkBD,OAAO,IAAI,KAAKC,QAAQ,IAAG,KACzDA,CAAAA,AAAmBP,WAAnBO,QAAQ,MAAM,IAAkBD,OAAO,MAAM,KAAKC,QAAQ,MAAK,KAC/DA,CAAAA,AAAiBP,WAAjBO,QAAQ,IAAI,IAAkBD,OAAO,IAAI,KAAKC,QAAQ,IAAG;YAE9D,IAAIF,QAAQ,MAAM,GAAG,GAAG,MAAMG,eAAe,YAAY,IAAIH;QAC/D;QACA,iBAAiB,OAAOI;YACtB,MAAMV,KAAK,WAAW,CAACU;YACvB,MAAMC,WAAWX,KAAK,QAAQ;YAC9B,IAAI,CAACW,UACH,MAAM,IAAIC,MAAM;YAElB,OAAO;gBAAE,OAAOD,SAAS,KAAK;gBAAE,QAAQA,SAAS,MAAM;YAAC;QAC1D;IACF;AACF;AAEO,MAAME,6BAGT;IACF,cAAcC;IACd,cAAchB;IACd,YAAY,CAACC,QAAUA,MAAM,UAAU;AACzC"}
@@ -0,0 +1,3 @@
1
+ import { clearCookiesInputSchema, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema } from "../../common/test-runner/nodes.mjs";
2
+ import { puppeteerAgentTestRunnerNodeDefinitions } from "./agent-nodes.mjs";
3
+ export { clearCookiesInputSchema, gotoUrlInputSchema, puppeteerAgentTestRunnerNodeDefinitions, setCookiesInputSchema, setViewportSizeInputSchema };
File without changes
@@ -0,0 +1,8 @@
1
+ import { resolveWebUrl, throwIfAborted } from "../../common/test-runner/utils.mjs";
2
+ const requirePuppeteerAgent = (agent)=>{
3
+ if (!agent || 'object' != typeof agent || !('interface' in agent) || !agent.interface || 'object' != typeof agent.interface || !('underlyingPage' in agent.interface) || !agent.interface.underlyingPage) throw new TypeError('getAgent() must return a Puppeteer Agent with an underlying Page.');
4
+ return agent;
5
+ };
6
+ export { requirePuppeteerAgent, resolveWebUrl, throwIfAborted };
7
+
8
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer/test-runner/utils.mjs","sources":["../../../../src/puppeteer/test-runner/utils.ts"],"sourcesContent":["import type { PuppeteerTestRunnerAgent } from './types';\n\nexport { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';\n\nexport const requirePuppeteerAgent = (\n agent: unknown,\n): PuppeteerTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Puppeteer Agent with an underlying Page.',\n );\n }\n return agent as PuppeteerTestRunnerAgent;\n};\n"],"names":["requirePuppeteerAgent","agent","TypeError"],"mappings":";AAIO,MAAMA,wBAAwB,CACnCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIC,UACR;IAGJ,OAAOD;AACT"}
@@ -51,6 +51,7 @@ const logger_namespaceObject = require("@midscene/shared/logger");
51
51
  const external_puppeteer_core_namespaceObject = require("puppeteer-core");
52
52
  var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
53
53
  const external_agent_init_args_js_namespaceObject = require("./agent-init-args.js");
54
+ const persistent_puppeteer_viewport_js_namespaceObject = require("./common/persistent-puppeteer-viewport.js");
54
55
  const viewport_js_namespaceObject = require("./common/viewport.js");
55
56
  const index_js_namespaceObject = require("./puppeteer/index.js");
56
57
  const external_static_index_js_namespaceObject = require("./static/index.js");
@@ -343,7 +344,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
343
344
  let page;
344
345
  if (navigateToUrl) {
345
346
  page = await browser.newPage();
346
- if (this.viewport) await page.setViewport(this.viewport);
347
+ if (this.viewport) await (0, persistent_puppeteer_viewport_js_namespaceObject.setPersistentPuppeteerViewport)(page, this.viewport);
347
348
  await page.goto(navigateToUrl, {
348
349
  timeout: 30000,
349
350
  waitUntil: 'domcontentloaded'
@@ -354,7 +355,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
354
355
  const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
355
356
  page = matchedPage ?? (webPages.length > 0 ? webPages[webPages.length - 1] : pages[pages.length - 1] || await browser.newPage());
356
357
  if (reused) await page.bringToFront();
357
- if (this.viewport) await page.setViewport(this.viewport);
358
+ if (this.viewport) await (0, persistent_puppeteer_viewport_js_namespaceObject.setPersistentPuppeteerViewport)(page, this.viewport);
358
359
  }
359
360
  const targetId = getTargetId(page);
360
361
  if (!targetId) throw new Error('Failed to persist Puppeteer page session because Puppeteer did not expose a Chrome targetId.');