@midscene/web 1.0.1-beta-20251208031823.0 → 1.0.1-beta-20251208031856.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.
- package/dist/es/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/puppeteer/agent-launcher.mjs +2 -6
- package/dist/es/puppeteer/agent-launcher.mjs.map +1 -1
- package/dist/lib/bin.js +1 -1
- package/dist/lib/bridge-mode/agent-cli-side.js +2 -2
- package/dist/lib/bridge-mode/browser.js +2 -2
- package/dist/lib/bridge-mode/common.js +2 -2
- package/dist/lib/bridge-mode/index.js +2 -2
- package/dist/lib/bridge-mode/io-client.js +3 -3
- package/dist/lib/bridge-mode/io-server.js +4 -4
- package/dist/lib/bridge-mode/page-browser-side.js +3 -3
- package/dist/lib/chrome-extension/agent.js +2 -2
- package/dist/lib/chrome-extension/cdpInput.js +2 -2
- package/dist/lib/chrome-extension/dynamic-scripts.js +2 -2
- package/dist/lib/chrome-extension/index.js +2 -2
- package/dist/lib/chrome-extension/page.js +2 -2
- package/dist/lib/index.js +2 -2
- package/dist/lib/playwright/ai-fixture.js +2 -2
- package/dist/lib/playwright/index.js +2 -2
- package/dist/lib/playwright/page.js +2 -2
- package/dist/lib/playwright/reporter/index.js +2 -2
- package/dist/lib/puppeteer/agent-launcher.js +8 -15
- package/dist/lib/puppeteer/agent-launcher.js.map +1 -1
- package/dist/lib/puppeteer/base-page.js +2 -2
- package/dist/lib/puppeteer/index.js +2 -2
- package/dist/lib/puppeteer/page.js +2 -2
- package/dist/lib/static/index.js +2 -2
- package/dist/lib/static/static-agent.js +2 -2
- package/dist/lib/static/static-page.js +2 -2
- package/dist/lib/utils.js +2 -2
- package/dist/lib/web-element.js +2 -2
- package/dist/lib/web-page.js +2 -2
- package/dist/types/puppeteer/agent-launcher.d.ts +0 -1
- package/package.json +5 -5
|
@@ -75,7 +75,7 @@ class BridgeServer {
|
|
|
75
75
|
logMsg('one client connected');
|
|
76
76
|
this.socket = socket;
|
|
77
77
|
const clientVersion = socket.handshake.query.version;
|
|
78
|
-
logMsg(`Bridge connected, cli-side version v1.0.1-beta-
|
|
78
|
+
logMsg(`Bridge connected, cli-side version v1.0.1-beta-20251208031856.0, browser-side version v${clientVersion}`);
|
|
79
79
|
socket.on(BridgeEvent.CallResponse, (params)=>{
|
|
80
80
|
const id = params.id;
|
|
81
81
|
const response = params.response;
|
|
@@ -100,7 +100,7 @@ class BridgeServer {
|
|
|
100
100
|
setTimeout(()=>{
|
|
101
101
|
this.onConnect?.();
|
|
102
102
|
const payload = {
|
|
103
|
-
version: "1.0.1-beta-
|
|
103
|
+
version: "1.0.1-beta-20251208031856.0"
|
|
104
104
|
};
|
|
105
105
|
socket.emit(BridgeEvent.Connected, payload);
|
|
106
106
|
Promise.resolve().then(()=>{
|
|
@@ -46,7 +46,7 @@ class ExtensionBridgePageBrowserSide extends page {
|
|
|
46
46
|
}
|
|
47
47
|
}, ()=>this.destroy());
|
|
48
48
|
await this.bridgeClient.connect();
|
|
49
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.0.1-beta-
|
|
49
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.0.1-beta-20251208031856.0`, 'log');
|
|
50
50
|
}
|
|
51
51
|
async connect() {
|
|
52
52
|
return await this.setupBridgeClient();
|
|
@@ -9,9 +9,6 @@ const defaultViewportWidth = 1440;
|
|
|
9
9
|
const defaultViewportHeight = 768;
|
|
10
10
|
const defaultViewportScale = 'darwin' === process.platform ? 2 : 1;
|
|
11
11
|
const defaultWaitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;
|
|
12
|
-
function resolveAiActionContext(target, preference) {
|
|
13
|
-
return target.aiActionContext ?? preference?.aiActionContext;
|
|
14
|
-
}
|
|
15
12
|
const DANGEROUS_ARGS = [
|
|
16
13
|
'--no-sandbox',
|
|
17
14
|
'--disable-setuid-sandbox',
|
|
@@ -139,10 +136,9 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
139
136
|
}
|
|
140
137
|
async function puppeteerAgentForTarget(target, preference, browser) {
|
|
141
138
|
const { page, freeFn } = await launchPuppeteerPage(target, preference, browser);
|
|
142
|
-
const aiActionContext = resolveAiActionContext(target, preference);
|
|
143
139
|
const agent = new PuppeteerAgent(page, {
|
|
144
140
|
...preference,
|
|
145
|
-
aiActionContext,
|
|
141
|
+
aiActionContext: target.aiActionContext,
|
|
146
142
|
forceSameTabNavigation: void 0 !== target.forceSameTabNavigation ? target.forceSameTabNavigation : true
|
|
147
143
|
});
|
|
148
144
|
freeFn.push({
|
|
@@ -154,6 +150,6 @@ async function puppeteerAgentForTarget(target, preference, browser) {
|
|
|
154
150
|
freeFn
|
|
155
151
|
};
|
|
156
152
|
}
|
|
157
|
-
export { defaultUA, defaultViewportHeight, defaultViewportScale, defaultViewportWidth, defaultWaitForNetworkIdleTimeout, launchPuppeteerPage, puppeteerAgentForTarget
|
|
153
|
+
export { defaultUA, defaultViewportHeight, defaultViewportScale, defaultViewportWidth, defaultWaitForNetworkIdleTimeout, launchPuppeteerPage, puppeteerAgentForTarget };
|
|
158
154
|
|
|
159
155
|
//# sourceMappingURL=agent-launcher.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/agent-launcher.mjs","sources":["../../../src/puppeteer/agent-launcher.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n\nimport { PuppeteerAgent } from '@/puppeteer/index';\nimport type { AgentOpt, Cache, MidsceneYamlScriptWebEnv } from '@midscene/core';\nimport { DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT } from '@midscene/shared/constants';\nimport puppeteer, { type Browser } from 'puppeteer';\n\nexport const defaultUA =\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36';\nexport const defaultViewportWidth = 1440;\nexport const defaultViewportHeight = 768;\nexport const defaultViewportScale = process.platform === 'darwin' ? 2 : 1;\nexport const defaultWaitForNetworkIdleTimeout =\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n\nexport function resolveAiActionContext(\n target: MidsceneYamlScriptWebEnv,\n preference?: Partial<Pick<AgentOpt, 'aiActionContext'>>,\n): AgentOpt['aiActionContext'] | undefined {\n // Prefer the web target override if provided; otherwise fall back to agent-level preference.\n return target.aiActionContext ?? preference?.aiActionContext;\n}\n\n/**\n * Chrome arguments that may reduce browser security.\n * These should only be used in controlled testing environments.\n *\n * Security implications:\n * - `--no-sandbox`: Disables Chrome's sandbox security model\n * - `--disable-setuid-sandbox`: Disables setuid sandbox on Linux\n * - `--disable-web-security`: Allows cross-origin requests without CORS\n * - `--ignore-certificate-errors`: Ignores SSL/TLS certificate errors\n * - `--disable-features=IsolateOrigins`: Disables origin isolation\n * - `--disable-site-isolation-trials`: Disables site isolation\n * - `--allow-running-insecure-content`: Allows mixed HTTP/HTTPS content\n */\nconst DANGEROUS_ARGS = [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--ignore-certificate-errors',\n '--disable-features=IsolateOrigins',\n '--disable-site-isolation-trials',\n '--allow-running-insecure-content',\n] as const;\n\n/**\n * Validates Chrome launch arguments for security concerns.\n * Emits a warning if dangerous arguments are detected.\n *\n * This function filters out arguments that are already present in baseArgs\n * to avoid warning about platform-specific defaults (e.g., --no-sandbox on non-Windows).\n *\n * @param args - Chrome launch arguments to validate\n * @param baseArgs - Base Chrome arguments already configured\n *\n * @example\n * ```typescript\n * // Will show warning for --disable-web-security\n * validateChromeArgs(['--disable-web-security', '--headless'], ['--no-sandbox']);\n *\n * // Will NOT show warning for --no-sandbox (already in baseArgs)\n * validateChromeArgs(['--no-sandbox'], ['--no-sandbox', '--headless']);\n * ```\n */\nfunction validateChromeArgs(args: string[], baseArgs: string[]): void {\n // Filter out arguments that are already in baseArgs\n const newArgs = args.filter(\n (arg) =>\n !baseArgs.some((baseArg) => {\n // Check if arg starts with the same flag as baseArg (before '=' if present)\n const argFlag = arg.split('=')[0];\n const baseFlag = baseArg.split('=')[0];\n return argFlag === baseFlag;\n }),\n );\n\n const dangerousArgs = newArgs.filter((arg) =>\n DANGEROUS_ARGS.some((dangerous) => arg.startsWith(dangerous)),\n );\n\n if (dangerousArgs.length > 0) {\n console.warn(\n `Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\\nThese arguments may reduce browser security. Use only in controlled testing environments.`,\n );\n }\n}\n\ninterface FreeFn {\n name: string;\n fn: () => void;\n}\n\nconst launcherDebug = getDebug('puppeteer:launcher');\n\nexport async function launchPuppeteerPage(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n },\n browser?: Browser,\n) {\n assert(target.url, 'url is required');\n const freeFn: FreeFn[] = [];\n\n // prepare the environment\n const ua = target.userAgent || defaultUA;\n let width = defaultViewportWidth;\n let preferMaximizedWindow = true;\n if (target.viewportWidth) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportWidth === 'number',\n 'viewportWidth must be a number',\n );\n width = Number.parseInt(target.viewportWidth as unknown as string, 10);\n assert(width > 0, `viewportWidth must be greater than 0, but got ${width}`);\n }\n let height = defaultViewportHeight;\n if (target.viewportHeight) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportHeight === 'number',\n 'viewportHeight must be a number',\n );\n height = Number.parseInt(target.viewportHeight as unknown as string, 10);\n assert(\n height > 0,\n `viewportHeight must be greater than 0, but got ${height}`,\n );\n }\n let dpr = defaultViewportScale;\n if (target.viewportScale) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportScale === 'number',\n 'viewportScale must be a number',\n );\n dpr = Number.parseInt(target.viewportScale as unknown as string, 10);\n assert(dpr > 0, `viewportScale must be greater than 0, but got ${dpr}`);\n }\n const viewportConfig = {\n width,\n height,\n deviceScaleFactor: dpr,\n };\n\n const headed = preference?.headed || preference?.keepWindow;\n\n // only maximize window in headed mode\n preferMaximizedWindow = preferMaximizedWindow && !!headed;\n\n // launch the browser\n if (headed && process.env.CI === '1') {\n console.warn(\n 'you are probably running headed mode in CI, this will usually fail.',\n );\n }\n // do not use 'no-sandbox' on windows https://www.perplexity.ai/search/how-to-solve-this-with-nodejs-dMHpdCypRa..JA8TkQzbeQ\n const isWindows = process.platform === 'win32';\n\n const baseArgs = [\n ...(isWindows ? [] : ['--no-sandbox', '--disable-setuid-sandbox']),\n '--disable-features=HttpsFirstBalancedModeAutoEnable',\n '--disable-features=PasswordLeakDetection',\n '--disable-save-password-bubble',\n `--user-agent=\"${ua}\"`,\n preferMaximizedWindow\n ? '--start-maximized'\n : `--window-size=${width},${height + 200}`, // add 200px for the address bar\n ];\n\n // Merge custom Chrome arguments\n let args = baseArgs;\n if (target.chromeArgs && target.chromeArgs.length > 0) {\n validateChromeArgs(target.chromeArgs, baseArgs);\n\n // Custom args come after base args, allowing them to override defaults\n args = [...baseArgs, ...target.chromeArgs];\n launcherDebug(\n 'Merging custom Chrome arguments',\n target.chromeArgs,\n 'Final args',\n args,\n );\n }\n\n launcherDebug(\n 'launching browser with viewport, headed',\n headed,\n 'viewport',\n viewportConfig,\n 'args',\n args,\n 'preference',\n preference,\n );\n let browserInstance = browser;\n if (!browserInstance) {\n browserInstance = await puppeteer.launch({\n headless: !preference?.headed,\n defaultViewport: viewportConfig,\n args,\n acceptInsecureCerts: target.acceptInsecureCerts,\n });\n freeFn.push({\n name: 'puppeteer_browser',\n fn: () => {\n if (!preference?.keepWindow) {\n if (isWindows) {\n setTimeout(() => {\n browserInstance?.close();\n }, 800);\n } else {\n browserInstance?.close();\n }\n }\n },\n });\n }\n const page = await browserInstance.newPage();\n\n if (target.cookie) {\n const cookieFileContent = readFileSync(target.cookie, 'utf-8');\n await browserInstance.setCookie(...JSON.parse(cookieFileContent));\n }\n\n if (ua) {\n await page.setUserAgent(ua);\n }\n\n if (viewportConfig) {\n await page.setViewport(viewportConfig);\n }\n\n const waitForNetworkIdleTimeout =\n typeof target.waitForNetworkIdle?.timeout === 'number'\n ? target.waitForNetworkIdle.timeout\n : defaultWaitForNetworkIdleTimeout;\n\n try {\n launcherDebug('goto', target.url);\n await page.goto(target.url);\n if (waitForNetworkIdleTimeout > 0) {\n launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);\n await page.waitForNetworkIdle({\n timeout: waitForNetworkIdleTimeout,\n });\n }\n } catch (e) {\n if (\n typeof target.waitForNetworkIdle?.continueOnNetworkIdleError ===\n 'boolean' &&\n !target.waitForNetworkIdle?.continueOnNetworkIdleError\n ) {\n const newError = new Error(`failed to wait for network idle: ${e}`, {\n cause: e,\n });\n throw newError;\n }\n const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;\n console.warn(newMessage);\n }\n\n return { page, freeFn };\n}\n\nexport async function puppeteerAgentForTarget(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n } & Partial<\n Pick<\n AgentOpt,\n | 'testId'\n | 'groupName'\n | 'groupDescription'\n | 'generateReport'\n | 'autoPrintReportMsg'\n | 'reportFileName'\n | 'replanningCycleLimit'\n | 'cache'\n | 'aiActionContext'\n >\n >,\n browser?: Browser,\n) {\n const { page, freeFn } = await launchPuppeteerPage(\n target,\n preference,\n browser,\n );\n const aiActionContext = resolveAiActionContext(target, preference);\n\n // prepare Midscene agent\n const agent = new PuppeteerAgent(page, {\n ...preference,\n aiActionContext,\n forceSameTabNavigation:\n typeof target.forceSameTabNavigation !== 'undefined'\n ? target.forceSameTabNavigation\n : true, // true for default in yaml script\n });\n\n freeFn.push({\n name: 'midscene_puppeteer_agent',\n fn: () => agent.destroy(),\n });\n\n return { agent, freeFn };\n}\n"],"names":["defaultUA","defaultViewportWidth","defaultViewportHeight","defaultViewportScale","process","defaultWaitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","resolveAiActionContext","target","preference","DANGEROUS_ARGS","validateChromeArgs","args","baseArgs","newArgs","arg","baseArg","argFlag","baseFlag","dangerousArgs","dangerous","console","launcherDebug","getDebug","launchPuppeteerPage","browser","assert","freeFn","ua","width","preferMaximizedWindow","Number","height","dpr","viewportConfig","headed","isWindows","browserInstance","puppeteer","setTimeout","page","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","aiActionContext","agent","PuppeteerAgent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"puppeteer/agent-launcher.mjs","sources":["../../../src/puppeteer/agent-launcher.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n\nimport { PuppeteerAgent } from '@/puppeteer/index';\nimport type { AgentOpt, Cache, MidsceneYamlScriptWebEnv } from '@midscene/core';\nimport { DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT } from '@midscene/shared/constants';\nimport puppeteer, { type Browser } from 'puppeteer';\n\nexport const defaultUA =\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36';\nexport const defaultViewportWidth = 1440;\nexport const defaultViewportHeight = 768;\nexport const defaultViewportScale = process.platform === 'darwin' ? 2 : 1;\nexport const defaultWaitForNetworkIdleTimeout =\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n\n/**\n * Chrome arguments that may reduce browser security.\n * These should only be used in controlled testing environments.\n *\n * Security implications:\n * - `--no-sandbox`: Disables Chrome's sandbox security model\n * - `--disable-setuid-sandbox`: Disables setuid sandbox on Linux\n * - `--disable-web-security`: Allows cross-origin requests without CORS\n * - `--ignore-certificate-errors`: Ignores SSL/TLS certificate errors\n * - `--disable-features=IsolateOrigins`: Disables origin isolation\n * - `--disable-site-isolation-trials`: Disables site isolation\n * - `--allow-running-insecure-content`: Allows mixed HTTP/HTTPS content\n */\nconst DANGEROUS_ARGS = [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--ignore-certificate-errors',\n '--disable-features=IsolateOrigins',\n '--disable-site-isolation-trials',\n '--allow-running-insecure-content',\n] as const;\n\n/**\n * Validates Chrome launch arguments for security concerns.\n * Emits a warning if dangerous arguments are detected.\n *\n * This function filters out arguments that are already present in baseArgs\n * to avoid warning about platform-specific defaults (e.g., --no-sandbox on non-Windows).\n *\n * @param args - Chrome launch arguments to validate\n * @param baseArgs - Base Chrome arguments already configured\n *\n * @example\n * ```typescript\n * // Will show warning for --disable-web-security\n * validateChromeArgs(['--disable-web-security', '--headless'], ['--no-sandbox']);\n *\n * // Will NOT show warning for --no-sandbox (already in baseArgs)\n * validateChromeArgs(['--no-sandbox'], ['--no-sandbox', '--headless']);\n * ```\n */\nfunction validateChromeArgs(args: string[], baseArgs: string[]): void {\n // Filter out arguments that are already in baseArgs\n const newArgs = args.filter(\n (arg) =>\n !baseArgs.some((baseArg) => {\n // Check if arg starts with the same flag as baseArg (before '=' if present)\n const argFlag = arg.split('=')[0];\n const baseFlag = baseArg.split('=')[0];\n return argFlag === baseFlag;\n }),\n );\n\n const dangerousArgs = newArgs.filter((arg) =>\n DANGEROUS_ARGS.some((dangerous) => arg.startsWith(dangerous)),\n );\n\n if (dangerousArgs.length > 0) {\n console.warn(\n `Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\\nThese arguments may reduce browser security. Use only in controlled testing environments.`,\n );\n }\n}\n\ninterface FreeFn {\n name: string;\n fn: () => void;\n}\n\nconst launcherDebug = getDebug('puppeteer:launcher');\n\nexport async function launchPuppeteerPage(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n },\n browser?: Browser,\n) {\n assert(target.url, 'url is required');\n const freeFn: FreeFn[] = [];\n\n // prepare the environment\n const ua = target.userAgent || defaultUA;\n let width = defaultViewportWidth;\n let preferMaximizedWindow = true;\n if (target.viewportWidth) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportWidth === 'number',\n 'viewportWidth must be a number',\n );\n width = Number.parseInt(target.viewportWidth as unknown as string, 10);\n assert(width > 0, `viewportWidth must be greater than 0, but got ${width}`);\n }\n let height = defaultViewportHeight;\n if (target.viewportHeight) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportHeight === 'number',\n 'viewportHeight must be a number',\n );\n height = Number.parseInt(target.viewportHeight as unknown as string, 10);\n assert(\n height > 0,\n `viewportHeight must be greater than 0, but got ${height}`,\n );\n }\n let dpr = defaultViewportScale;\n if (target.viewportScale) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportScale === 'number',\n 'viewportScale must be a number',\n );\n dpr = Number.parseInt(target.viewportScale as unknown as string, 10);\n assert(dpr > 0, `viewportScale must be greater than 0, but got ${dpr}`);\n }\n const viewportConfig = {\n width,\n height,\n deviceScaleFactor: dpr,\n };\n\n const headed = preference?.headed || preference?.keepWindow;\n\n // only maximize window in headed mode\n preferMaximizedWindow = preferMaximizedWindow && !!headed;\n\n // launch the browser\n if (headed && process.env.CI === '1') {\n console.warn(\n 'you are probably running headed mode in CI, this will usually fail.',\n );\n }\n // do not use 'no-sandbox' on windows https://www.perplexity.ai/search/how-to-solve-this-with-nodejs-dMHpdCypRa..JA8TkQzbeQ\n const isWindows = process.platform === 'win32';\n\n const baseArgs = [\n ...(isWindows ? [] : ['--no-sandbox', '--disable-setuid-sandbox']),\n '--disable-features=HttpsFirstBalancedModeAutoEnable',\n '--disable-features=PasswordLeakDetection',\n '--disable-save-password-bubble',\n `--user-agent=\"${ua}\"`,\n preferMaximizedWindow\n ? '--start-maximized'\n : `--window-size=${width},${height + 200}`, // add 200px for the address bar\n ];\n\n // Merge custom Chrome arguments\n let args = baseArgs;\n if (target.chromeArgs && target.chromeArgs.length > 0) {\n validateChromeArgs(target.chromeArgs, baseArgs);\n\n // Custom args come after base args, allowing them to override defaults\n args = [...baseArgs, ...target.chromeArgs];\n launcherDebug(\n 'Merging custom Chrome arguments',\n target.chromeArgs,\n 'Final args',\n args,\n );\n }\n\n launcherDebug(\n 'launching browser with viewport, headed',\n headed,\n 'viewport',\n viewportConfig,\n 'args',\n args,\n 'preference',\n preference,\n );\n let browserInstance = browser;\n if (!browserInstance) {\n browserInstance = await puppeteer.launch({\n headless: !preference?.headed,\n defaultViewport: viewportConfig,\n args,\n acceptInsecureCerts: target.acceptInsecureCerts,\n });\n freeFn.push({\n name: 'puppeteer_browser',\n fn: () => {\n if (!preference?.keepWindow) {\n if (isWindows) {\n setTimeout(() => {\n browserInstance?.close();\n }, 800);\n } else {\n browserInstance?.close();\n }\n }\n },\n });\n }\n const page = await browserInstance.newPage();\n\n if (target.cookie) {\n const cookieFileContent = readFileSync(target.cookie, 'utf-8');\n await browserInstance.setCookie(...JSON.parse(cookieFileContent));\n }\n\n if (ua) {\n await page.setUserAgent(ua);\n }\n\n if (viewportConfig) {\n await page.setViewport(viewportConfig);\n }\n\n const waitForNetworkIdleTimeout =\n typeof target.waitForNetworkIdle?.timeout === 'number'\n ? target.waitForNetworkIdle.timeout\n : defaultWaitForNetworkIdleTimeout;\n\n try {\n launcherDebug('goto', target.url);\n await page.goto(target.url);\n if (waitForNetworkIdleTimeout > 0) {\n launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);\n await page.waitForNetworkIdle({\n timeout: waitForNetworkIdleTimeout,\n });\n }\n } catch (e) {\n if (\n typeof target.waitForNetworkIdle?.continueOnNetworkIdleError ===\n 'boolean' &&\n !target.waitForNetworkIdle?.continueOnNetworkIdleError\n ) {\n const newError = new Error(`failed to wait for network idle: ${e}`, {\n cause: e,\n });\n throw newError;\n }\n const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;\n console.warn(newMessage);\n }\n\n return { page, freeFn };\n}\n\nexport async function puppeteerAgentForTarget(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n } & Partial<\n Pick<\n AgentOpt,\n | 'testId'\n | 'groupName'\n | 'groupDescription'\n | 'generateReport'\n | 'autoPrintReportMsg'\n | 'reportFileName'\n | 'replanningCycleLimit'\n | 'cache'\n | 'aiActionContext'\n >\n >,\n browser?: Browser,\n) {\n const { page, freeFn } = await launchPuppeteerPage(\n target,\n preference,\n browser,\n );\n\n // prepare Midscene agent\n const agent = new PuppeteerAgent(page, {\n ...preference,\n aiActionContext: target.aiActionContext,\n forceSameTabNavigation:\n typeof target.forceSameTabNavigation !== 'undefined'\n ? target.forceSameTabNavigation\n : true, // true for default in yaml script\n });\n\n freeFn.push({\n name: 'midscene_puppeteer_agent',\n fn: () => agent.destroy(),\n });\n\n return { agent, freeFn };\n}\n"],"names":["defaultUA","defaultViewportWidth","defaultViewportHeight","defaultViewportScale","process","defaultWaitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","DANGEROUS_ARGS","validateChromeArgs","args","baseArgs","newArgs","arg","baseArg","argFlag","baseFlag","dangerousArgs","dangerous","console","launcherDebug","getDebug","launchPuppeteerPage","target","preference","browser","assert","freeFn","ua","width","preferMaximizedWindow","Number","height","dpr","viewportConfig","headed","isWindows","browserInstance","puppeteer","setTimeout","page","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","agent","PuppeteerAgent"],"mappings":";;;;;;AASO,MAAMA,YACX;AACK,MAAMC,uBAAuB;AAC7B,MAAMC,wBAAwB;AAC9B,MAAMC,uBAAuBC,AAAqB,aAArBA,QAAQ,QAAQ,GAAgB,IAAI;AACjE,MAAMC,mCACXC;AAeF,MAAMC,iBAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAqBD,SAASC,mBAAmBC,IAAc,EAAEC,QAAkB;IAE5D,MAAMC,UAAUF,KAAK,MAAM,CACzB,CAACG,MACC,CAACF,SAAS,IAAI,CAAC,CAACG;YAEd,MAAMC,UAAUF,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;YACjC,MAAMG,WAAWF,QAAQ,KAAK,CAAC,IAAI,CAAC,EAAE;YACtC,OAAOC,YAAYC;QACrB;IAGJ,MAAMC,gBAAgBL,QAAQ,MAAM,CAAC,CAACC,MACpCL,eAAe,IAAI,CAAC,CAACU,YAAcL,IAAI,UAAU,CAACK;IAGpD,IAAID,cAAc,MAAM,GAAG,GACzBE,QAAQ,IAAI,CACV,CAAC,8CAA8C,EAAEF,cAAc,IAAI,CAAC,MAAM,4FAA4F,CAAC;AAG7K;AAOA,MAAMG,gBAAgBC,SAAS;AAExB,eAAeC,oBACpBC,MAAgC,EAChCC,UAGC,EACDC,OAAiB;IAEjBC,OAAOH,OAAO,GAAG,EAAE;IACnB,MAAMI,SAAmB,EAAE;IAG3B,MAAMC,KAAKL,OAAO,SAAS,IAAItB;IAC/B,IAAI4B,QAAQ3B;IACZ,IAAI4B,wBAAwB;IAC5B,IAAIP,OAAO,aAAa,EAAE;QACxBO,wBAAwB;QACxBJ,OACE,AAAgC,YAAhC,OAAOH,OAAO,aAAa,EAC3B;QAEFM,QAAQE,OAAO,QAAQ,CAACR,OAAO,aAAa,EAAuB;QACnEG,OAAOG,QAAQ,GAAG,CAAC,8CAA8C,EAAEA,OAAO;IAC5E;IACA,IAAIG,SAAS7B;IACb,IAAIoB,OAAO,cAAc,EAAE;QACzBO,wBAAwB;QACxBJ,OACE,AAAiC,YAAjC,OAAOH,OAAO,cAAc,EAC5B;QAEFS,SAASD,OAAO,QAAQ,CAACR,OAAO,cAAc,EAAuB;QACrEG,OACEM,SAAS,GACT,CAAC,+CAA+C,EAAEA,QAAQ;IAE9D;IACA,IAAIC,MAAM7B;IACV,IAAImB,OAAO,aAAa,EAAE;QACxBO,wBAAwB;QACxBJ,OACE,AAAgC,YAAhC,OAAOH,OAAO,aAAa,EAC3B;QAEFU,MAAMF,OAAO,QAAQ,CAACR,OAAO,aAAa,EAAuB;QACjEG,OAAOO,MAAM,GAAG,CAAC,8CAA8C,EAAEA,KAAK;IACxE;IACA,MAAMC,iBAAiB;QACrBL;QACAG;QACA,mBAAmBC;IACrB;IAEA,MAAME,SAASX,YAAY,UAAUA,YAAY;IAGjDM,wBAAwBA,yBAAyB,CAAC,CAACK;IAGnD,IAAIA,UAAU9B,AAAmB,QAAnBA,QAAQ,GAAG,CAAC,EAAE,EAC1Bc,QAAQ,IAAI,CACV;IAIJ,MAAMiB,YAAY/B,AAAqB,YAArBA,QAAQ,QAAQ;IAElC,MAAMM,WAAW;WACXyB,YAAY,EAAE,GAAG;YAAC;YAAgB;SAA2B;QACjE;QACA;QACA;QACA,CAAC,cAAc,EAAER,GAAG,CAAC,CAAC;QACtBE,wBACI,sBACA,CAAC,cAAc,EAAED,MAAM,CAAC,EAAEG,SAAS,KAAK;KAC7C;IAGD,IAAItB,OAAOC;IACX,IAAIY,OAAO,UAAU,IAAIA,OAAO,UAAU,CAAC,MAAM,GAAG,GAAG;QACrDd,mBAAmBc,OAAO,UAAU,EAAEZ;QAGtCD,OAAO;eAAIC;eAAaY,OAAO,UAAU;SAAC;QAC1CH,cACE,mCACAG,OAAO,UAAU,EACjB,cACAb;IAEJ;IAEAU,cACE,2CACAe,QACA,YACAD,gBACA,QACAxB,MACA,cACAc;IAEF,IAAIa,kBAAkBZ;IACtB,IAAI,CAACY,iBAAiB;QACpBA,kBAAkB,MAAMC,UAAU,MAAM,CAAC;YACvC,UAAU,CAACd,YAAY;YACvB,iBAAiBU;YACjBxB;YACA,qBAAqBa,OAAO,mBAAmB;QACjD;QACAI,OAAO,IAAI,CAAC;YACV,MAAM;YACN,IAAI;gBACF,IAAI,CAACH,YAAY,YACf,IAAIY,WACFG,WAAW;oBACTF,iBAAiB;gBACnB,GAAG;qBAEHA,iBAAiB;YAGvB;QACF;IACF;IACA,MAAMG,OAAO,MAAMH,gBAAgB,OAAO;IAE1C,IAAId,OAAO,MAAM,EAAE;QACjB,MAAMkB,oBAAoBC,aAAanB,OAAO,MAAM,EAAE;QACtD,MAAMc,gBAAgB,SAAS,IAAIM,KAAK,KAAK,CAACF;IAChD;IAEA,IAAIb,IACF,MAAMY,KAAK,YAAY,CAACZ;IAG1B,IAAIM,gBACF,MAAMM,KAAK,WAAW,CAACN;IAGzB,MAAMU,4BACJ,AAA8C,YAA9C,OAAOrB,OAAO,kBAAkB,EAAE,UAC9BA,OAAO,kBAAkB,CAAC,OAAO,GACjCjB;IAEN,IAAI;QACFc,cAAc,QAAQG,OAAO,GAAG;QAChC,MAAMiB,KAAK,IAAI,CAACjB,OAAO,GAAG;QAC1B,IAAIqB,4BAA4B,GAAG;YACjCxB,cAAc,sBAAsBwB;YACpC,MAAMJ,KAAK,kBAAkB,CAAC;gBAC5B,SAASI;YACX;QACF;IACF,EAAE,OAAOC,GAAG;QACV,IACE,AACE,aADF,OAAOtB,OAAO,kBAAkB,EAAE,8BAElC,CAACA,OAAO,kBAAkB,EAAE,4BAC5B;YACA,MAAMuB,WAAW,IAAIC,MAAM,CAAC,iCAAiC,EAAEF,GAAG,EAAE;gBAClE,OAAOA;YACT;YACA,MAAMC;QACR;QACA,MAAME,aAAa,CAAC,sCAAsC,EAAEJ,0BAA0B,iCAAiC,CAAC;QACxHzB,QAAQ,IAAI,CAAC6B;IACf;IAEA,OAAO;QAAER;QAAMb;IAAO;AACxB;AAEO,eAAesB,wBACpB1B,MAAgC,EAChCC,UAgBC,EACDC,OAAiB;IAEjB,MAAM,EAAEe,IAAI,EAAEb,MAAM,EAAE,GAAG,MAAML,oBAC7BC,QACAC,YACAC;IAIF,MAAMyB,QAAQ,IAAIC,eAAeX,MAAM;QACrC,GAAGhB,UAAU;QACb,iBAAiBD,OAAO,eAAe;QACvC,wBACE,AAAyC,WAAlCA,OAAO,sBAAsB,GAChCA,OAAO,sBAAsB,GAC7B;IACR;IAEAI,OAAO,IAAI,CAAC;QACV,MAAM;QACN,IAAI,IAAMuB,MAAM,OAAO;IACzB;IAEA,OAAO;QAAEA;QAAOvB;IAAO;AACzB"}
|
package/dist/lib/bin.js
CHANGED
|
@@ -42,7 +42,7 @@ server.app.use(external_cors_default()({
|
|
|
42
42
|
Promise.resolve().then(()=>server.launch()).then(()=>{
|
|
43
43
|
console.log(`Midscene playground server is running on http://localhost:${server.port}`);
|
|
44
44
|
});
|
|
45
|
-
for(var
|
|
45
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
46
46
|
Object.defineProperty(exports, '__esModule', {
|
|
47
47
|
value: true
|
|
48
48
|
});
|
|
@@ -154,10 +154,10 @@ class AgentOverChromeBridge extends agent_namespaceObject.Agent {
|
|
|
154
154
|
}
|
|
155
155
|
exports.AgentOverChromeBridge = __webpack_exports__.AgentOverChromeBridge;
|
|
156
156
|
exports.getBridgePageInCliSide = __webpack_exports__.getBridgePageInCliSide;
|
|
157
|
-
for(var
|
|
157
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
158
158
|
"AgentOverChromeBridge",
|
|
159
159
|
"getBridgePageInCliSide"
|
|
160
|
-
].indexOf(
|
|
160
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
161
161
|
Object.defineProperty(exports, '__esModule', {
|
|
162
162
|
value: true
|
|
163
163
|
});
|
|
@@ -28,9 +28,9 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
28
28
|
});
|
|
29
29
|
const external_page_browser_side_js_namespaceObject = require("./page-browser-side.js");
|
|
30
30
|
exports.ExtensionBridgePageBrowserSide = __webpack_exports__.ExtensionBridgePageBrowserSide;
|
|
31
|
-
for(var
|
|
31
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
32
32
|
"ExtensionBridgePageBrowserSide"
|
|
33
|
-
].indexOf(
|
|
33
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
34
34
|
Object.defineProperty(exports, '__esModule', {
|
|
35
35
|
value: true
|
|
36
36
|
});
|
|
@@ -87,7 +87,7 @@ exports.DefaultLocalEndpoint = __webpack_exports__.DefaultLocalEndpoint;
|
|
|
87
87
|
exports.KeyboardEvent = __webpack_exports__.KeyboardEvent;
|
|
88
88
|
exports.MouseEvent = __webpack_exports__.MouseEvent;
|
|
89
89
|
exports.getBridgeServerHost = __webpack_exports__.getBridgeServerHost;
|
|
90
|
-
for(var
|
|
90
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
91
91
|
"BridgeCallTimeout",
|
|
92
92
|
"BridgeErrorCodeNoClientConnected",
|
|
93
93
|
"BridgeEvent",
|
|
@@ -99,7 +99,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
99
99
|
"KeyboardEvent",
|
|
100
100
|
"MouseEvent",
|
|
101
101
|
"getBridgeServerHost"
|
|
102
|
-
].indexOf(
|
|
102
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
103
103
|
Object.defineProperty(exports, '__esModule', {
|
|
104
104
|
value: true
|
|
105
105
|
});
|
|
@@ -34,11 +34,11 @@ const external_io_server_js_namespaceObject = require("./io-server.js");
|
|
|
34
34
|
exports.AgentOverChromeBridge = __webpack_exports__.AgentOverChromeBridge;
|
|
35
35
|
exports.killRunningServer = __webpack_exports__.killRunningServer;
|
|
36
36
|
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
37
|
-
for(var
|
|
37
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
38
38
|
"AgentOverChromeBridge",
|
|
39
39
|
"killRunningServer",
|
|
40
40
|
"overrideAIConfig"
|
|
41
|
-
].indexOf(
|
|
41
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
42
42
|
Object.defineProperty(exports, '__esModule', {
|
|
43
43
|
value: true
|
|
44
44
|
});
|
|
@@ -45,7 +45,7 @@ class BridgeClient {
|
|
|
45
45
|
this.socket = (0, external_socket_io_client_namespaceObject.io)(this.endpoint, {
|
|
46
46
|
reconnection: false,
|
|
47
47
|
query: {
|
|
48
|
-
version: "1.0.1-beta-
|
|
48
|
+
version: "1.0.1-beta-20251208031856.0"
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
51
|
const timeout = setTimeout(()=>{
|
|
@@ -119,9 +119,9 @@ class BridgeClient {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
exports.BridgeClient = __webpack_exports__.BridgeClient;
|
|
122
|
-
for(var
|
|
122
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
123
123
|
"BridgeClient"
|
|
124
|
-
].indexOf(
|
|
124
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
125
125
|
Object.defineProperty(exports, '__esModule', {
|
|
126
126
|
value: true
|
|
127
127
|
});
|
|
@@ -104,7 +104,7 @@ class BridgeServer {
|
|
|
104
104
|
(0, shared_utils_namespaceObject.logMsg)('one client connected');
|
|
105
105
|
this.socket = socket;
|
|
106
106
|
const clientVersion = socket.handshake.query.version;
|
|
107
|
-
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.0.1-beta-
|
|
107
|
+
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.0.1-beta-20251208031856.0, browser-side version v${clientVersion}`);
|
|
108
108
|
socket.on(external_common_js_namespaceObject.BridgeEvent.CallResponse, (params)=>{
|
|
109
109
|
const id = params.id;
|
|
110
110
|
const response = params.response;
|
|
@@ -129,7 +129,7 @@ class BridgeServer {
|
|
|
129
129
|
setTimeout(()=>{
|
|
130
130
|
this.onConnect?.();
|
|
131
131
|
const payload = {
|
|
132
|
-
version: "1.0.1-beta-
|
|
132
|
+
version: "1.0.1-beta-20251208031856.0"
|
|
133
133
|
};
|
|
134
134
|
socket.emit(external_common_js_namespaceObject.BridgeEvent.Connected, payload);
|
|
135
135
|
Promise.resolve().then(()=>{
|
|
@@ -236,10 +236,10 @@ class BridgeServer {
|
|
|
236
236
|
}
|
|
237
237
|
exports.BridgeServer = __webpack_exports__.BridgeServer;
|
|
238
238
|
exports.killRunningServer = __webpack_exports__.killRunningServer;
|
|
239
|
-
for(var
|
|
239
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
240
240
|
"BridgeServer",
|
|
241
241
|
"killRunningServer"
|
|
242
|
-
].indexOf(
|
|
242
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
243
243
|
Object.defineProperty(exports, '__esModule', {
|
|
244
244
|
value: true
|
|
245
245
|
});
|
|
@@ -84,7 +84,7 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
|
|
|
84
84
|
}
|
|
85
85
|
}, ()=>this.destroy());
|
|
86
86
|
await this.bridgeClient.connect();
|
|
87
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.0.1-beta-
|
|
87
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.0.1-beta-20251208031856.0`, 'log');
|
|
88
88
|
}
|
|
89
89
|
async connect() {
|
|
90
90
|
return await this.setupBridgeClient();
|
|
@@ -136,9 +136,9 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
exports.ExtensionBridgePageBrowserSide = __webpack_exports__.ExtensionBridgePageBrowserSide;
|
|
139
|
-
for(var
|
|
139
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
140
140
|
"ExtensionBridgePageBrowserSide"
|
|
141
|
-
].indexOf(
|
|
141
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
142
142
|
Object.defineProperty(exports, '__esModule', {
|
|
143
143
|
value: true
|
|
144
144
|
});
|
|
@@ -33,9 +33,9 @@ class ChromeExtensionProxyPageAgent extends agent_namespaceObject.Agent {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.ChromeExtensionProxyPageAgent = __webpack_exports__.ChromeExtensionProxyPageAgent;
|
|
36
|
-
for(var
|
|
36
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
37
37
|
"ChromeExtensionProxyPageAgent"
|
|
38
|
-
].indexOf(
|
|
38
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
39
39
|
Object.defineProperty(exports, '__esModule', {
|
|
40
40
|
value: true
|
|
41
41
|
});
|
|
@@ -198,9 +198,9 @@ function keyDescriptionForString(keyString) {
|
|
|
198
198
|
return description;
|
|
199
199
|
}
|
|
200
200
|
exports.CdpKeyboard = __webpack_exports__.CdpKeyboard;
|
|
201
|
-
for(var
|
|
201
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
202
202
|
"CdpKeyboard"
|
|
203
|
-
].indexOf(
|
|
203
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
204
204
|
Object.defineProperty(exports, '__esModule', {
|
|
205
205
|
value: true
|
|
206
206
|
});
|
|
@@ -76,11 +76,11 @@ const injectStopWaterFlowAnimation = async ()=>{
|
|
|
76
76
|
exports.getHtmlElementScript = __webpack_exports__.getHtmlElementScript;
|
|
77
77
|
exports.injectStopWaterFlowAnimation = __webpack_exports__.injectStopWaterFlowAnimation;
|
|
78
78
|
exports.injectWaterFlowAnimation = __webpack_exports__.injectWaterFlowAnimation;
|
|
79
|
-
for(var
|
|
79
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
80
80
|
"getHtmlElementScript",
|
|
81
81
|
"injectStopWaterFlowAnimation",
|
|
82
82
|
"injectWaterFlowAnimation"
|
|
83
|
-
].indexOf(
|
|
83
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
84
84
|
Object.defineProperty(exports, '__esModule', {
|
|
85
85
|
value: true
|
|
86
86
|
});
|
|
@@ -47,12 +47,12 @@ exports.ChromeExtensionProxyPage = __webpack_exports__.ChromeExtensionProxyPage;
|
|
|
47
47
|
exports.ChromeExtensionProxyPageAgent = __webpack_exports__.ChromeExtensionProxyPageAgent;
|
|
48
48
|
exports.ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = __webpack_exports__.ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED;
|
|
49
49
|
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
50
|
-
for(var
|
|
50
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
51
51
|
"ChromeExtensionProxyPage",
|
|
52
52
|
"ChromeExtensionProxyPageAgent",
|
|
53
53
|
"ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED",
|
|
54
54
|
"overrideAIConfig"
|
|
55
|
-
].indexOf(
|
|
55
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
56
56
|
Object.defineProperty(exports, '__esModule', {
|
|
57
57
|
value: true
|
|
58
58
|
});
|
|
@@ -641,9 +641,9 @@ class ChromeExtensionProxyPage {
|
|
|
641
641
|
}
|
|
642
642
|
}
|
|
643
643
|
exports["default"] = __webpack_exports__["default"];
|
|
644
|
-
for(var
|
|
644
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
645
645
|
"default"
|
|
646
|
-
].indexOf(
|
|
646
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
647
647
|
Object.defineProperty(exports, '__esModule', {
|
|
648
648
|
value: true
|
|
649
649
|
});
|
package/dist/lib/index.js
CHANGED
|
@@ -44,7 +44,7 @@ exports.PuppeteerAgent = __webpack_exports__.PuppeteerAgent;
|
|
|
44
44
|
exports.StaticPage = __webpack_exports__.StaticPage;
|
|
45
45
|
exports.StaticPageAgent = __webpack_exports__.StaticPageAgent;
|
|
46
46
|
exports.WebPageContextParser = __webpack_exports__.WebPageContextParser;
|
|
47
|
-
for(var
|
|
47
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
48
48
|
"PageAgent",
|
|
49
49
|
"PlaywrightAgent",
|
|
50
50
|
"PlaywrightAiFixture",
|
|
@@ -52,7 +52,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
52
52
|
"StaticPage",
|
|
53
53
|
"StaticPageAgent",
|
|
54
54
|
"WebPageContextParser"
|
|
55
|
-
].indexOf(
|
|
55
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
56
56
|
Object.defineProperty(exports, '__esModule', {
|
|
57
57
|
value: true
|
|
58
58
|
});
|
|
@@ -380,10 +380,10 @@ const PlaywrightAiFixture = (options)=>{
|
|
|
380
380
|
};
|
|
381
381
|
exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
|
|
382
382
|
exports.midsceneDumpAnnotationId = __webpack_exports__.midsceneDumpAnnotationId;
|
|
383
|
-
for(var
|
|
383
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
384
384
|
"PlaywrightAiFixture",
|
|
385
385
|
"midsceneDumpAnnotationId"
|
|
386
|
-
].indexOf(
|
|
386
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
387
387
|
Object.defineProperty(exports, '__esModule', {
|
|
388
388
|
value: true
|
|
389
389
|
});
|
|
@@ -79,12 +79,12 @@ exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
|
|
|
79
79
|
exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
|
|
80
80
|
exports.PlaywrightWebPage = __webpack_exports__.PlaywrightWebPage;
|
|
81
81
|
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
82
|
-
for(var
|
|
82
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
83
83
|
"PlaywrightAgent",
|
|
84
84
|
"PlaywrightAiFixture",
|
|
85
85
|
"PlaywrightWebPage",
|
|
86
86
|
"overrideAIConfig"
|
|
87
|
-
].indexOf(
|
|
87
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
88
88
|
Object.defineProperty(exports, '__esModule', {
|
|
89
89
|
value: true
|
|
90
90
|
});
|
|
@@ -33,9 +33,9 @@ class WebPage extends base_page_js_namespaceObject.Page {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.WebPage = __webpack_exports__.WebPage;
|
|
36
|
-
for(var
|
|
36
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
37
37
|
"WebPage"
|
|
38
|
-
].indexOf(
|
|
38
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
39
39
|
Object.defineProperty(exports, '__esModule', {
|
|
40
40
|
value: true
|
|
41
41
|
});
|
|
@@ -128,9 +128,9 @@ class MidsceneReporter {
|
|
|
128
128
|
}
|
|
129
129
|
const reporter = MidsceneReporter;
|
|
130
130
|
exports["default"] = __webpack_exports__["default"];
|
|
131
|
-
for(var
|
|
131
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
132
132
|
"default"
|
|
133
|
-
].indexOf(
|
|
133
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
134
134
|
Object.defineProperty(exports, '__esModule', {
|
|
135
135
|
value: true
|
|
136
136
|
});
|
|
@@ -34,13 +34,12 @@ var __webpack_exports__ = {};
|
|
|
34
34
|
__webpack_require__.r(__webpack_exports__);
|
|
35
35
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
36
|
defaultViewportScale: ()=>defaultViewportScale,
|
|
37
|
-
launchPuppeteerPage: ()=>launchPuppeteerPage,
|
|
38
|
-
defaultUA: ()=>defaultUA,
|
|
39
|
-
defaultViewportHeight: ()=>defaultViewportHeight,
|
|
40
37
|
defaultWaitForNetworkIdleTimeout: ()=>defaultWaitForNetworkIdleTimeout,
|
|
41
|
-
|
|
38
|
+
launchPuppeteerPage: ()=>launchPuppeteerPage,
|
|
42
39
|
defaultViewportWidth: ()=>defaultViewportWidth,
|
|
43
|
-
puppeteerAgentForTarget: ()=>puppeteerAgentForTarget
|
|
40
|
+
puppeteerAgentForTarget: ()=>puppeteerAgentForTarget,
|
|
41
|
+
defaultUA: ()=>defaultUA,
|
|
42
|
+
defaultViewportHeight: ()=>defaultViewportHeight
|
|
44
43
|
});
|
|
45
44
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
46
45
|
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
@@ -54,9 +53,6 @@ const defaultViewportWidth = 1440;
|
|
|
54
53
|
const defaultViewportHeight = 768;
|
|
55
54
|
const defaultViewportScale = 'darwin' === process.platform ? 2 : 1;
|
|
56
55
|
const defaultWaitForNetworkIdleTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;
|
|
57
|
-
function resolveAiActionContext(target, preference) {
|
|
58
|
-
return target.aiActionContext ?? preference?.aiActionContext;
|
|
59
|
-
}
|
|
60
56
|
const DANGEROUS_ARGS = [
|
|
61
57
|
'--no-sandbox',
|
|
62
58
|
'--disable-setuid-sandbox',
|
|
@@ -184,10 +180,9 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
184
180
|
}
|
|
185
181
|
async function puppeteerAgentForTarget(target, preference, browser) {
|
|
186
182
|
const { page, freeFn } = await launchPuppeteerPage(target, preference, browser);
|
|
187
|
-
const aiActionContext = resolveAiActionContext(target, preference);
|
|
188
183
|
const agent = new external_index_js_namespaceObject.PuppeteerAgent(page, {
|
|
189
184
|
...preference,
|
|
190
|
-
aiActionContext,
|
|
185
|
+
aiActionContext: target.aiActionContext,
|
|
191
186
|
forceSameTabNavigation: void 0 !== target.forceSameTabNavigation ? target.forceSameTabNavigation : true
|
|
192
187
|
});
|
|
193
188
|
freeFn.push({
|
|
@@ -206,17 +201,15 @@ exports.defaultViewportWidth = __webpack_exports__.defaultViewportWidth;
|
|
|
206
201
|
exports.defaultWaitForNetworkIdleTimeout = __webpack_exports__.defaultWaitForNetworkIdleTimeout;
|
|
207
202
|
exports.launchPuppeteerPage = __webpack_exports__.launchPuppeteerPage;
|
|
208
203
|
exports.puppeteerAgentForTarget = __webpack_exports__.puppeteerAgentForTarget;
|
|
209
|
-
|
|
210
|
-
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
204
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
211
205
|
"defaultUA",
|
|
212
206
|
"defaultViewportHeight",
|
|
213
207
|
"defaultViewportScale",
|
|
214
208
|
"defaultViewportWidth",
|
|
215
209
|
"defaultWaitForNetworkIdleTimeout",
|
|
216
210
|
"launchPuppeteerPage",
|
|
217
|
-
"puppeteerAgentForTarget"
|
|
218
|
-
|
|
219
|
-
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
211
|
+
"puppeteerAgentForTarget"
|
|
212
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
220
213
|
Object.defineProperty(exports, '__esModule', {
|
|
221
214
|
value: true
|
|
222
215
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/agent-launcher.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/agent-launcher.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { readFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n\nimport { PuppeteerAgent } from '@/puppeteer/index';\nimport type { AgentOpt, Cache, MidsceneYamlScriptWebEnv } from '@midscene/core';\nimport { DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT } from '@midscene/shared/constants';\nimport puppeteer, { type Browser } from 'puppeteer';\n\nexport const defaultUA =\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36';\nexport const defaultViewportWidth = 1440;\nexport const defaultViewportHeight = 768;\nexport const defaultViewportScale = process.platform === 'darwin' ? 2 : 1;\nexport const defaultWaitForNetworkIdleTimeout =\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n\nexport function resolveAiActionContext(\n target: MidsceneYamlScriptWebEnv,\n preference?: Partial<Pick<AgentOpt, 'aiActionContext'>>,\n): AgentOpt['aiActionContext'] | undefined {\n // Prefer the web target override if provided; otherwise fall back to agent-level preference.\n return target.aiActionContext ?? preference?.aiActionContext;\n}\n\n/**\n * Chrome arguments that may reduce browser security.\n * These should only be used in controlled testing environments.\n *\n * Security implications:\n * - `--no-sandbox`: Disables Chrome's sandbox security model\n * - `--disable-setuid-sandbox`: Disables setuid sandbox on Linux\n * - `--disable-web-security`: Allows cross-origin requests without CORS\n * - `--ignore-certificate-errors`: Ignores SSL/TLS certificate errors\n * - `--disable-features=IsolateOrigins`: Disables origin isolation\n * - `--disable-site-isolation-trials`: Disables site isolation\n * - `--allow-running-insecure-content`: Allows mixed HTTP/HTTPS content\n */\nconst DANGEROUS_ARGS = [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--ignore-certificate-errors',\n '--disable-features=IsolateOrigins',\n '--disable-site-isolation-trials',\n '--allow-running-insecure-content',\n] as const;\n\n/**\n * Validates Chrome launch arguments for security concerns.\n * Emits a warning if dangerous arguments are detected.\n *\n * This function filters out arguments that are already present in baseArgs\n * to avoid warning about platform-specific defaults (e.g., --no-sandbox on non-Windows).\n *\n * @param args - Chrome launch arguments to validate\n * @param baseArgs - Base Chrome arguments already configured\n *\n * @example\n * ```typescript\n * // Will show warning for --disable-web-security\n * validateChromeArgs(['--disable-web-security', '--headless'], ['--no-sandbox']);\n *\n * // Will NOT show warning for --no-sandbox (already in baseArgs)\n * validateChromeArgs(['--no-sandbox'], ['--no-sandbox', '--headless']);\n * ```\n */\nfunction validateChromeArgs(args: string[], baseArgs: string[]): void {\n // Filter out arguments that are already in baseArgs\n const newArgs = args.filter(\n (arg) =>\n !baseArgs.some((baseArg) => {\n // Check if arg starts with the same flag as baseArg (before '=' if present)\n const argFlag = arg.split('=')[0];\n const baseFlag = baseArg.split('=')[0];\n return argFlag === baseFlag;\n }),\n );\n\n const dangerousArgs = newArgs.filter((arg) =>\n DANGEROUS_ARGS.some((dangerous) => arg.startsWith(dangerous)),\n );\n\n if (dangerousArgs.length > 0) {\n console.warn(\n `Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\\nThese arguments may reduce browser security. Use only in controlled testing environments.`,\n );\n }\n}\n\ninterface FreeFn {\n name: string;\n fn: () => void;\n}\n\nconst launcherDebug = getDebug('puppeteer:launcher');\n\nexport async function launchPuppeteerPage(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n },\n browser?: Browser,\n) {\n assert(target.url, 'url is required');\n const freeFn: FreeFn[] = [];\n\n // prepare the environment\n const ua = target.userAgent || defaultUA;\n let width = defaultViewportWidth;\n let preferMaximizedWindow = true;\n if (target.viewportWidth) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportWidth === 'number',\n 'viewportWidth must be a number',\n );\n width = Number.parseInt(target.viewportWidth as unknown as string, 10);\n assert(width > 0, `viewportWidth must be greater than 0, but got ${width}`);\n }\n let height = defaultViewportHeight;\n if (target.viewportHeight) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportHeight === 'number',\n 'viewportHeight must be a number',\n );\n height = Number.parseInt(target.viewportHeight as unknown as string, 10);\n assert(\n height > 0,\n `viewportHeight must be greater than 0, but got ${height}`,\n );\n }\n let dpr = defaultViewportScale;\n if (target.viewportScale) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportScale === 'number',\n 'viewportScale must be a number',\n );\n dpr = Number.parseInt(target.viewportScale as unknown as string, 10);\n assert(dpr > 0, `viewportScale must be greater than 0, but got ${dpr}`);\n }\n const viewportConfig = {\n width,\n height,\n deviceScaleFactor: dpr,\n };\n\n const headed = preference?.headed || preference?.keepWindow;\n\n // only maximize window in headed mode\n preferMaximizedWindow = preferMaximizedWindow && !!headed;\n\n // launch the browser\n if (headed && process.env.CI === '1') {\n console.warn(\n 'you are probably running headed mode in CI, this will usually fail.',\n );\n }\n // do not use 'no-sandbox' on windows https://www.perplexity.ai/search/how-to-solve-this-with-nodejs-dMHpdCypRa..JA8TkQzbeQ\n const isWindows = process.platform === 'win32';\n\n const baseArgs = [\n ...(isWindows ? [] : ['--no-sandbox', '--disable-setuid-sandbox']),\n '--disable-features=HttpsFirstBalancedModeAutoEnable',\n '--disable-features=PasswordLeakDetection',\n '--disable-save-password-bubble',\n `--user-agent=\"${ua}\"`,\n preferMaximizedWindow\n ? '--start-maximized'\n : `--window-size=${width},${height + 200}`, // add 200px for the address bar\n ];\n\n // Merge custom Chrome arguments\n let args = baseArgs;\n if (target.chromeArgs && target.chromeArgs.length > 0) {\n validateChromeArgs(target.chromeArgs, baseArgs);\n\n // Custom args come after base args, allowing them to override defaults\n args = [...baseArgs, ...target.chromeArgs];\n launcherDebug(\n 'Merging custom Chrome arguments',\n target.chromeArgs,\n 'Final args',\n args,\n );\n }\n\n launcherDebug(\n 'launching browser with viewport, headed',\n headed,\n 'viewport',\n viewportConfig,\n 'args',\n args,\n 'preference',\n preference,\n );\n let browserInstance = browser;\n if (!browserInstance) {\n browserInstance = await puppeteer.launch({\n headless: !preference?.headed,\n defaultViewport: viewportConfig,\n args,\n acceptInsecureCerts: target.acceptInsecureCerts,\n });\n freeFn.push({\n name: 'puppeteer_browser',\n fn: () => {\n if (!preference?.keepWindow) {\n if (isWindows) {\n setTimeout(() => {\n browserInstance?.close();\n }, 800);\n } else {\n browserInstance?.close();\n }\n }\n },\n });\n }\n const page = await browserInstance.newPage();\n\n if (target.cookie) {\n const cookieFileContent = readFileSync(target.cookie, 'utf-8');\n await browserInstance.setCookie(...JSON.parse(cookieFileContent));\n }\n\n if (ua) {\n await page.setUserAgent(ua);\n }\n\n if (viewportConfig) {\n await page.setViewport(viewportConfig);\n }\n\n const waitForNetworkIdleTimeout =\n typeof target.waitForNetworkIdle?.timeout === 'number'\n ? target.waitForNetworkIdle.timeout\n : defaultWaitForNetworkIdleTimeout;\n\n try {\n launcherDebug('goto', target.url);\n await page.goto(target.url);\n if (waitForNetworkIdleTimeout > 0) {\n launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);\n await page.waitForNetworkIdle({\n timeout: waitForNetworkIdleTimeout,\n });\n }\n } catch (e) {\n if (\n typeof target.waitForNetworkIdle?.continueOnNetworkIdleError ===\n 'boolean' &&\n !target.waitForNetworkIdle?.continueOnNetworkIdleError\n ) {\n const newError = new Error(`failed to wait for network idle: ${e}`, {\n cause: e,\n });\n throw newError;\n }\n const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;\n console.warn(newMessage);\n }\n\n return { page, freeFn };\n}\n\nexport async function puppeteerAgentForTarget(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n } & Partial<\n Pick<\n AgentOpt,\n | 'testId'\n | 'groupName'\n | 'groupDescription'\n | 'generateReport'\n | 'autoPrintReportMsg'\n | 'reportFileName'\n | 'replanningCycleLimit'\n | 'cache'\n | 'aiActionContext'\n >\n >,\n browser?: Browser,\n) {\n const { page, freeFn } = await launchPuppeteerPage(\n target,\n preference,\n browser,\n );\n const aiActionContext = resolveAiActionContext(target, preference);\n\n // prepare Midscene agent\n const agent = new PuppeteerAgent(page, {\n ...preference,\n aiActionContext,\n forceSameTabNavigation:\n typeof target.forceSameTabNavigation !== 'undefined'\n ? target.forceSameTabNavigation\n : true, // true for default in yaml script\n });\n\n freeFn.push({\n name: 'midscene_puppeteer_agent',\n fn: () => agent.destroy(),\n });\n\n return { agent, freeFn };\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","defaultUA","defaultViewportWidth","defaultViewportHeight","defaultViewportScale","process","defaultWaitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","resolveAiActionContext","target","preference","DANGEROUS_ARGS","validateChromeArgs","args","baseArgs","newArgs","arg","baseArg","argFlag","baseFlag","dangerousArgs","dangerous","console","launcherDebug","getDebug","launchPuppeteerPage","browser","assert","freeFn","ua","width","preferMaximizedWindow","Number","height","dpr","viewportConfig","headed","isWindows","browserInstance","puppeteer","setTimeout","page","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","aiActionContext","agent","PuppeteerAgent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"puppeteer/agent-launcher.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/agent-launcher.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { readFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n\nimport { PuppeteerAgent } from '@/puppeteer/index';\nimport type { AgentOpt, Cache, MidsceneYamlScriptWebEnv } from '@midscene/core';\nimport { DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT } from '@midscene/shared/constants';\nimport puppeteer, { type Browser } from 'puppeteer';\n\nexport const defaultUA =\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36';\nexport const defaultViewportWidth = 1440;\nexport const defaultViewportHeight = 768;\nexport const defaultViewportScale = process.platform === 'darwin' ? 2 : 1;\nexport const defaultWaitForNetworkIdleTimeout =\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n\n/**\n * Chrome arguments that may reduce browser security.\n * These should only be used in controlled testing environments.\n *\n * Security implications:\n * - `--no-sandbox`: Disables Chrome's sandbox security model\n * - `--disable-setuid-sandbox`: Disables setuid sandbox on Linux\n * - `--disable-web-security`: Allows cross-origin requests without CORS\n * - `--ignore-certificate-errors`: Ignores SSL/TLS certificate errors\n * - `--disable-features=IsolateOrigins`: Disables origin isolation\n * - `--disable-site-isolation-trials`: Disables site isolation\n * - `--allow-running-insecure-content`: Allows mixed HTTP/HTTPS content\n */\nconst DANGEROUS_ARGS = [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-web-security',\n '--ignore-certificate-errors',\n '--disable-features=IsolateOrigins',\n '--disable-site-isolation-trials',\n '--allow-running-insecure-content',\n] as const;\n\n/**\n * Validates Chrome launch arguments for security concerns.\n * Emits a warning if dangerous arguments are detected.\n *\n * This function filters out arguments that are already present in baseArgs\n * to avoid warning about platform-specific defaults (e.g., --no-sandbox on non-Windows).\n *\n * @param args - Chrome launch arguments to validate\n * @param baseArgs - Base Chrome arguments already configured\n *\n * @example\n * ```typescript\n * // Will show warning for --disable-web-security\n * validateChromeArgs(['--disable-web-security', '--headless'], ['--no-sandbox']);\n *\n * // Will NOT show warning for --no-sandbox (already in baseArgs)\n * validateChromeArgs(['--no-sandbox'], ['--no-sandbox', '--headless']);\n * ```\n */\nfunction validateChromeArgs(args: string[], baseArgs: string[]): void {\n // Filter out arguments that are already in baseArgs\n const newArgs = args.filter(\n (arg) =>\n !baseArgs.some((baseArg) => {\n // Check if arg starts with the same flag as baseArg (before '=' if present)\n const argFlag = arg.split('=')[0];\n const baseFlag = baseArg.split('=')[0];\n return argFlag === baseFlag;\n }),\n );\n\n const dangerousArgs = newArgs.filter((arg) =>\n DANGEROUS_ARGS.some((dangerous) => arg.startsWith(dangerous)),\n );\n\n if (dangerousArgs.length > 0) {\n console.warn(\n `Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\\nThese arguments may reduce browser security. Use only in controlled testing environments.`,\n );\n }\n}\n\ninterface FreeFn {\n name: string;\n fn: () => void;\n}\n\nconst launcherDebug = getDebug('puppeteer:launcher');\n\nexport async function launchPuppeteerPage(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n },\n browser?: Browser,\n) {\n assert(target.url, 'url is required');\n const freeFn: FreeFn[] = [];\n\n // prepare the environment\n const ua = target.userAgent || defaultUA;\n let width = defaultViewportWidth;\n let preferMaximizedWindow = true;\n if (target.viewportWidth) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportWidth === 'number',\n 'viewportWidth must be a number',\n );\n width = Number.parseInt(target.viewportWidth as unknown as string, 10);\n assert(width > 0, `viewportWidth must be greater than 0, but got ${width}`);\n }\n let height = defaultViewportHeight;\n if (target.viewportHeight) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportHeight === 'number',\n 'viewportHeight must be a number',\n );\n height = Number.parseInt(target.viewportHeight as unknown as string, 10);\n assert(\n height > 0,\n `viewportHeight must be greater than 0, but got ${height}`,\n );\n }\n let dpr = defaultViewportScale;\n if (target.viewportScale) {\n preferMaximizedWindow = false;\n assert(\n typeof target.viewportScale === 'number',\n 'viewportScale must be a number',\n );\n dpr = Number.parseInt(target.viewportScale as unknown as string, 10);\n assert(dpr > 0, `viewportScale must be greater than 0, but got ${dpr}`);\n }\n const viewportConfig = {\n width,\n height,\n deviceScaleFactor: dpr,\n };\n\n const headed = preference?.headed || preference?.keepWindow;\n\n // only maximize window in headed mode\n preferMaximizedWindow = preferMaximizedWindow && !!headed;\n\n // launch the browser\n if (headed && process.env.CI === '1') {\n console.warn(\n 'you are probably running headed mode in CI, this will usually fail.',\n );\n }\n // do not use 'no-sandbox' on windows https://www.perplexity.ai/search/how-to-solve-this-with-nodejs-dMHpdCypRa..JA8TkQzbeQ\n const isWindows = process.platform === 'win32';\n\n const baseArgs = [\n ...(isWindows ? [] : ['--no-sandbox', '--disable-setuid-sandbox']),\n '--disable-features=HttpsFirstBalancedModeAutoEnable',\n '--disable-features=PasswordLeakDetection',\n '--disable-save-password-bubble',\n `--user-agent=\"${ua}\"`,\n preferMaximizedWindow\n ? '--start-maximized'\n : `--window-size=${width},${height + 200}`, // add 200px for the address bar\n ];\n\n // Merge custom Chrome arguments\n let args = baseArgs;\n if (target.chromeArgs && target.chromeArgs.length > 0) {\n validateChromeArgs(target.chromeArgs, baseArgs);\n\n // Custom args come after base args, allowing them to override defaults\n args = [...baseArgs, ...target.chromeArgs];\n launcherDebug(\n 'Merging custom Chrome arguments',\n target.chromeArgs,\n 'Final args',\n args,\n );\n }\n\n launcherDebug(\n 'launching browser with viewport, headed',\n headed,\n 'viewport',\n viewportConfig,\n 'args',\n args,\n 'preference',\n preference,\n );\n let browserInstance = browser;\n if (!browserInstance) {\n browserInstance = await puppeteer.launch({\n headless: !preference?.headed,\n defaultViewport: viewportConfig,\n args,\n acceptInsecureCerts: target.acceptInsecureCerts,\n });\n freeFn.push({\n name: 'puppeteer_browser',\n fn: () => {\n if (!preference?.keepWindow) {\n if (isWindows) {\n setTimeout(() => {\n browserInstance?.close();\n }, 800);\n } else {\n browserInstance?.close();\n }\n }\n },\n });\n }\n const page = await browserInstance.newPage();\n\n if (target.cookie) {\n const cookieFileContent = readFileSync(target.cookie, 'utf-8');\n await browserInstance.setCookie(...JSON.parse(cookieFileContent));\n }\n\n if (ua) {\n await page.setUserAgent(ua);\n }\n\n if (viewportConfig) {\n await page.setViewport(viewportConfig);\n }\n\n const waitForNetworkIdleTimeout =\n typeof target.waitForNetworkIdle?.timeout === 'number'\n ? target.waitForNetworkIdle.timeout\n : defaultWaitForNetworkIdleTimeout;\n\n try {\n launcherDebug('goto', target.url);\n await page.goto(target.url);\n if (waitForNetworkIdleTimeout > 0) {\n launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);\n await page.waitForNetworkIdle({\n timeout: waitForNetworkIdleTimeout,\n });\n }\n } catch (e) {\n if (\n typeof target.waitForNetworkIdle?.continueOnNetworkIdleError ===\n 'boolean' &&\n !target.waitForNetworkIdle?.continueOnNetworkIdleError\n ) {\n const newError = new Error(`failed to wait for network idle: ${e}`, {\n cause: e,\n });\n throw newError;\n }\n const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;\n console.warn(newMessage);\n }\n\n return { page, freeFn };\n}\n\nexport async function puppeteerAgentForTarget(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n } & Partial<\n Pick<\n AgentOpt,\n | 'testId'\n | 'groupName'\n | 'groupDescription'\n | 'generateReport'\n | 'autoPrintReportMsg'\n | 'reportFileName'\n | 'replanningCycleLimit'\n | 'cache'\n | 'aiActionContext'\n >\n >,\n browser?: Browser,\n) {\n const { page, freeFn } = await launchPuppeteerPage(\n target,\n preference,\n browser,\n );\n\n // prepare Midscene agent\n const agent = new PuppeteerAgent(page, {\n ...preference,\n aiActionContext: target.aiActionContext,\n forceSameTabNavigation:\n typeof target.forceSameTabNavigation !== 'undefined'\n ? target.forceSameTabNavigation\n : true, // true for default in yaml script\n });\n\n freeFn.push({\n name: 'midscene_puppeteer_agent',\n fn: () => agent.destroy(),\n });\n\n return { agent, freeFn };\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","defaultUA","defaultViewportWidth","defaultViewportHeight","defaultViewportScale","process","defaultWaitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","DANGEROUS_ARGS","validateChromeArgs","args","baseArgs","newArgs","arg","baseArg","argFlag","baseFlag","dangerousArgs","dangerous","console","launcherDebug","getDebug","launchPuppeteerPage","target","preference","browser","assert","freeFn","ua","width","preferMaximizedWindow","Number","height","dpr","viewportConfig","headed","isWindows","browserInstance","puppeteer","setTimeout","page","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","agent","PuppeteerAgent"],"mappings":"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"}
|
|
@@ -539,12 +539,12 @@ exports.Page = __webpack_exports__.Page;
|
|
|
539
539
|
exports.debugPage = __webpack_exports__.debugPage;
|
|
540
540
|
exports.forceChromeSelectRendering = __webpack_exports__.forceChromeSelectRendering;
|
|
541
541
|
exports.forceClosePopup = __webpack_exports__.forceClosePopup;
|
|
542
|
-
for(var
|
|
542
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
543
543
|
"Page",
|
|
544
544
|
"debugPage",
|
|
545
545
|
"forceChromeSelectRendering",
|
|
546
546
|
"forceClosePopup"
|
|
547
|
-
].indexOf(
|
|
547
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
548
548
|
Object.defineProperty(exports, '__esModule', {
|
|
549
549
|
value: true
|
|
550
550
|
});
|
|
@@ -71,11 +71,11 @@ class PuppeteerAgent extends agent_namespaceObject.Agent {
|
|
|
71
71
|
exports.PuppeteerAgent = __webpack_exports__.PuppeteerAgent;
|
|
72
72
|
exports.PuppeteerWebPage = __webpack_exports__.PuppeteerWebPage;
|
|
73
73
|
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
74
|
-
for(var
|
|
74
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
75
75
|
"PuppeteerAgent",
|
|
76
76
|
"PuppeteerWebPage",
|
|
77
77
|
"overrideAIConfig"
|
|
78
|
-
].indexOf(
|
|
78
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
79
79
|
Object.defineProperty(exports, '__esModule', {
|
|
80
80
|
value: true
|
|
81
81
|
});
|
|
@@ -33,9 +33,9 @@ class PuppeteerWebPage extends external_base_page_js_namespaceObject.Page {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.PuppeteerWebPage = __webpack_exports__.PuppeteerWebPage;
|
|
36
|
-
for(var
|
|
36
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
37
37
|
"PuppeteerWebPage"
|
|
38
|
-
].indexOf(
|
|
38
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
39
39
|
Object.defineProperty(exports, '__esModule', {
|
|
40
40
|
value: true
|
|
41
41
|
});
|
package/dist/lib/static/index.js
CHANGED
|
@@ -41,10 +41,10 @@ const external_static_page_js_namespaceObject = require("./static-page.js");
|
|
|
41
41
|
var external_static_page_js_default = /*#__PURE__*/ __webpack_require__.n(external_static_page_js_namespaceObject);
|
|
42
42
|
exports.StaticPage = __webpack_exports__.StaticPage;
|
|
43
43
|
exports.StaticPageAgent = __webpack_exports__.StaticPageAgent;
|
|
44
|
-
for(var
|
|
44
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
45
45
|
"StaticPage",
|
|
46
46
|
"StaticPageAgent"
|
|
47
|
-
].indexOf(
|
|
47
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
48
48
|
Object.defineProperty(exports, '__esModule', {
|
|
49
49
|
value: true
|
|
50
50
|
});
|
|
@@ -34,9 +34,9 @@ class StaticPageAgent extends agent_namespaceObject.Agent {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
exports.StaticPageAgent = __webpack_exports__.StaticPageAgent;
|
|
37
|
-
for(var
|
|
37
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
38
38
|
"StaticPageAgent"
|
|
39
|
-
].indexOf(
|
|
39
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
40
40
|
Object.defineProperty(exports, '__esModule', {
|
|
41
41
|
value: true
|
|
42
42
|
});
|
|
@@ -147,9 +147,9 @@ class StaticPage {
|
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
exports["default"] = __webpack_exports__["default"];
|
|
150
|
-
for(var
|
|
150
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
151
151
|
"default"
|
|
152
|
-
].indexOf(
|
|
152
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
153
153
|
Object.defineProperty(exports, '__esModule', {
|
|
154
154
|
value: true
|
|
155
155
|
});
|
package/dist/lib/utils.js
CHANGED
|
@@ -30,9 +30,9 @@ function getWebpackRequire() {
|
|
|
30
30
|
return 'undefined' != typeof require ? require : require;
|
|
31
31
|
}
|
|
32
32
|
exports.getWebpackRequire = __webpack_exports__.getWebpackRequire;
|
|
33
|
-
for(var
|
|
33
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
34
34
|
"getWebpackRequire"
|
|
35
|
-
].indexOf(
|
|
35
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
36
36
|
Object.defineProperty(exports, '__esModule', {
|
|
37
37
|
value: true
|
|
38
38
|
});
|
package/dist/lib/web-element.js
CHANGED
|
@@ -96,11 +96,11 @@ if (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
|
|
|
96
96
|
exports.WebElementInfoImpl = __webpack_exports__.WebElementInfoImpl;
|
|
97
97
|
exports.WebPageContextParser = __webpack_exports__.WebPageContextParser;
|
|
98
98
|
exports.limitOpenNewTabScript = __webpack_exports__.limitOpenNewTabScript;
|
|
99
|
-
for(var
|
|
99
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
100
100
|
"WebElementInfoImpl",
|
|
101
101
|
"WebPageContextParser",
|
|
102
102
|
"limitOpenNewTabScript"
|
|
103
|
-
].indexOf(
|
|
103
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
104
104
|
Object.defineProperty(exports, '__esModule', {
|
|
105
105
|
value: true
|
|
106
106
|
});
|
package/dist/lib/web-page.js
CHANGED
|
@@ -272,11 +272,11 @@ const commonWebActionsForWebPage = (page)=>[
|
|
|
272
272
|
exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
|
|
273
273
|
exports.commonWebActionsForWebPage = __webpack_exports__.commonWebActionsForWebPage;
|
|
274
274
|
exports.getKeyCommands = __webpack_exports__.getKeyCommands;
|
|
275
|
-
for(var
|
|
275
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
276
276
|
"AbstractWebPage",
|
|
277
277
|
"commonWebActionsForWebPage",
|
|
278
278
|
"getKeyCommands"
|
|
279
|
-
].indexOf(
|
|
279
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
280
280
|
Object.defineProperty(exports, '__esModule', {
|
|
281
281
|
value: true
|
|
282
282
|
});
|
|
@@ -6,7 +6,6 @@ export declare const defaultViewportWidth = 1440;
|
|
|
6
6
|
export declare const defaultViewportHeight = 768;
|
|
7
7
|
export declare const defaultViewportScale: number;
|
|
8
8
|
export declare const defaultWaitForNetworkIdleTimeout = 2000;
|
|
9
|
-
export declare function resolveAiActionContext(target: MidsceneYamlScriptWebEnv, preference?: Partial<Pick<AgentOpt, 'aiActionContext'>>): AgentOpt['aiActionContext'] | undefined;
|
|
10
9
|
interface FreeFn {
|
|
11
10
|
name: string;
|
|
12
11
|
fn: () => void;
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"Browser use",
|
|
9
9
|
"Android use"
|
|
10
10
|
],
|
|
11
|
-
"version": "1.0.1-beta-
|
|
11
|
+
"version": "1.0.1-beta-20251208031856.0",
|
|
12
12
|
"repository": "https://github.com/web-infra-dev/midscene",
|
|
13
13
|
"homepage": "https://midscenejs.com/",
|
|
14
14
|
"main": "./dist/lib/index.js",
|
|
@@ -103,13 +103,13 @@
|
|
|
103
103
|
"http-server": "14.1.1",
|
|
104
104
|
"socket.io": "^4.8.1",
|
|
105
105
|
"socket.io-client": "4.8.1",
|
|
106
|
-
"@midscene/
|
|
107
|
-
"@midscene/
|
|
108
|
-
"@midscene/shared": "1.0.1-beta-
|
|
106
|
+
"@midscene/playground": "1.0.1-beta-20251208031856.0",
|
|
107
|
+
"@midscene/core": "1.0.1-beta-20251208031856.0",
|
|
108
|
+
"@midscene/shared": "1.0.1-beta-20251208031856.0"
|
|
109
109
|
},
|
|
110
110
|
"devDependencies": {
|
|
111
111
|
"@playwright/test": "^1.44.1",
|
|
112
|
-
"@rslib/core": "^0.18.
|
|
112
|
+
"@rslib/core": "^0.18.3",
|
|
113
113
|
"@types/chrome": "0.0.279",
|
|
114
114
|
"@types/cors": "^2.8.17",
|
|
115
115
|
"@types/http-server": "^0.12.4",
|