@midscene/web 1.0.1-beta-20251208112226.0 → 1.0.1-beta-20251209112631.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/chrome-extension/page.mjs.map +1 -1
- package/dist/es/playwright/ai-fixture.mjs.map +1 -1
- package/dist/es/puppeteer/agent-launcher.mjs +4 -7
- 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/chrome-extension/page.js.map +1 -1
- package/dist/lib/index.js +2 -2
- package/dist/lib/playwright/ai-fixture.js +2 -2
- package/dist/lib/playwright/ai-fixture.js.map +1 -1
- 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 +6 -9
- 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/chrome-extension/page.d.ts +6 -1
- package/dist/types/playwright/ai-fixture.d.ts +3 -3
- package/package.json +5 -5
|
@@ -81,23 +81,19 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
81
81
|
const freeFn = [];
|
|
82
82
|
const ua = target.userAgent || defaultUA;
|
|
83
83
|
let width = defaultViewportWidth;
|
|
84
|
-
let preferMaximizedWindow = true;
|
|
85
84
|
if (target.viewportWidth) {
|
|
86
|
-
preferMaximizedWindow = false;
|
|
87
85
|
(0, utils_namespaceObject.assert)('number' == typeof target.viewportWidth, 'viewportWidth must be a number');
|
|
88
86
|
width = Number.parseInt(target.viewportWidth, 10);
|
|
89
87
|
(0, utils_namespaceObject.assert)(width > 0, `viewportWidth must be greater than 0, but got ${width}`);
|
|
90
88
|
}
|
|
91
89
|
let height = defaultViewportHeight;
|
|
92
90
|
if (target.viewportHeight) {
|
|
93
|
-
preferMaximizedWindow = false;
|
|
94
91
|
(0, utils_namespaceObject.assert)('number' == typeof target.viewportHeight, 'viewportHeight must be a number');
|
|
95
92
|
height = Number.parseInt(target.viewportHeight, 10);
|
|
96
93
|
(0, utils_namespaceObject.assert)(height > 0, `viewportHeight must be greater than 0, but got ${height}`);
|
|
97
94
|
}
|
|
98
95
|
let dpr = defaultViewportScale;
|
|
99
96
|
if (target.viewportScale) {
|
|
100
|
-
preferMaximizedWindow = false;
|
|
101
97
|
(0, utils_namespaceObject.assert)('number' == typeof target.viewportScale, 'viewportScale must be a number');
|
|
102
98
|
dpr = Number.parseInt(target.viewportScale, 10);
|
|
103
99
|
(0, utils_namespaceObject.assert)(dpr > 0, `viewportScale must be greater than 0, but got ${dpr}`);
|
|
@@ -108,7 +104,8 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
108
104
|
deviceScaleFactor: dpr
|
|
109
105
|
};
|
|
110
106
|
const headed = preference?.headed || preference?.keepWindow;
|
|
111
|
-
|
|
107
|
+
const windowSizeArg = `--window-size=${width},${height + (headed ? 100 : 0)}`;
|
|
108
|
+
const defaultViewportConfig = headed ? null : viewportConfig;
|
|
112
109
|
if (headed && '1' === process.env.CI) console.warn('you are probably running headed mode in CI, this will usually fail.');
|
|
113
110
|
const isWindows = 'win32' === process.platform;
|
|
114
111
|
const baseArgs = [
|
|
@@ -120,7 +117,7 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
120
117
|
'--disable-features=PasswordLeakDetection',
|
|
121
118
|
'--disable-save-password-bubble',
|
|
122
119
|
`--user-agent="${ua}"`,
|
|
123
|
-
|
|
120
|
+
windowSizeArg
|
|
124
121
|
];
|
|
125
122
|
let args = baseArgs;
|
|
126
123
|
if (target.chromeArgs && target.chromeArgs.length > 0) {
|
|
@@ -136,7 +133,7 @@ async function launchPuppeteerPage(target, preference, browser) {
|
|
|
136
133
|
if (!browserInstance) {
|
|
137
134
|
browserInstance = await external_puppeteer_default().launch({
|
|
138
135
|
headless: !preference?.headed,
|
|
139
|
-
defaultViewport:
|
|
136
|
+
defaultViewport: defaultViewportConfig,
|
|
140
137
|
args,
|
|
141
138
|
acceptInsecureCerts: target.acceptInsecureCerts
|
|
142
139
|
});
|
|
@@ -207,7 +204,7 @@ exports.defaultWaitForNetworkIdleTimeout = __webpack_exports__.defaultWaitForNet
|
|
|
207
204
|
exports.launchPuppeteerPage = __webpack_exports__.launchPuppeteerPage;
|
|
208
205
|
exports.puppeteerAgentForTarget = __webpack_exports__.puppeteerAgentForTarget;
|
|
209
206
|
exports.resolveAiActionContext = __webpack_exports__.resolveAiActionContext;
|
|
210
|
-
for(var
|
|
207
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
211
208
|
"defaultUA",
|
|
212
209
|
"defaultViewportHeight",
|
|
213
210
|
"defaultViewportScale",
|
|
@@ -216,7 +213,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
216
213
|
"launchPuppeteerPage",
|
|
217
214
|
"puppeteerAgentForTarget",
|
|
218
215
|
"resolveAiActionContext"
|
|
219
|
-
].indexOf(
|
|
216
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
220
217
|
Object.defineProperty(exports, '__esModule', {
|
|
221
218
|
value: true
|
|
222
219
|
});
|
|
@@ -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\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 if (target.viewportWidth) {\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 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 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 const windowSizeArg = `--window-size=${width},${height + (headed ? 100 : 0)}`; // add 100px for the address bar in headed mode\n const defaultViewportConfig = headed ? null : viewportConfig;\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 windowSizeArg,\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: defaultViewportConfig,\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","Number","height","dpr","viewportConfig","headed","windowSizeArg","defaultViewportConfig","isWindows","browserInstance","puppeteer","setTimeout","page","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","aiActionContext","agent","PuppeteerAgent"],"mappings":"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"}
|
|
@@ -541,12 +541,12 @@ exports.Page = __webpack_exports__.Page;
|
|
|
541
541
|
exports.debugPage = __webpack_exports__.debugPage;
|
|
542
542
|
exports.forceChromeSelectRendering = __webpack_exports__.forceChromeSelectRendering;
|
|
543
543
|
exports.forceClosePopup = __webpack_exports__.forceClosePopup;
|
|
544
|
-
for(var
|
|
544
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
545
545
|
"Page",
|
|
546
546
|
"debugPage",
|
|
547
547
|
"forceChromeSelectRendering",
|
|
548
548
|
"forceClosePopup"
|
|
549
|
-
].indexOf(
|
|
549
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
550
550
|
Object.defineProperty(exports, '__esModule', {
|
|
551
551
|
value: true
|
|
552
552
|
});
|
|
@@ -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
|
@@ -274,11 +274,11 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
|
|
|
274
274
|
exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
|
|
275
275
|
exports.commonWebActionsForWebPage = __webpack_exports__.commonWebActionsForWebPage;
|
|
276
276
|
exports.getKeyCommands = __webpack_exports__.getKeyCommands;
|
|
277
|
-
for(var
|
|
277
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
278
278
|
"AbstractWebPage",
|
|
279
279
|
"commonWebActionsForWebPage",
|
|
280
280
|
"getKeyCommands"
|
|
281
|
-
].indexOf(
|
|
281
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
282
282
|
Object.defineProperty(exports, '__esModule', {
|
|
283
283
|
value: true
|
|
284
284
|
});
|
|
@@ -32,7 +32,12 @@ export default class ChromeExtensionProxyPage implements AbstractInterface {
|
|
|
32
32
|
private ensureDebuggerAttached;
|
|
33
33
|
private showMousePointer;
|
|
34
34
|
private hideMousePointer;
|
|
35
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Public method to detach debugger without destroying the page instance.
|
|
37
|
+
* Useful for error recovery scenarios where we want to remove the debugger banner
|
|
38
|
+
* without completely destroying the page.
|
|
39
|
+
*/
|
|
40
|
+
detachDebugger(tabId?: number): Promise<void>;
|
|
36
41
|
private enableWaterFlowAnimation;
|
|
37
42
|
private disableWaterFlowAnimation;
|
|
38
43
|
/**
|
|
@@ -99,12 +99,12 @@ export declare const PlaywrightAiFixture: (options?: {
|
|
|
99
99
|
};
|
|
100
100
|
export type PlayWrightAiFixtureType = {
|
|
101
101
|
agentForPage: (page?: any, opts?: any) => Promise<PageAgent<PlaywrightWebPage>>;
|
|
102
|
-
ai: <T = any>(
|
|
103
|
-
aiAct: (
|
|
102
|
+
ai: <T = any>(...args: Parameters<PageAgent['ai']>) => Promise<T>;
|
|
103
|
+
aiAct: (...args: Parameters<PageAgent['aiAct']>) => ReturnType<PageAgent['aiAct']>;
|
|
104
104
|
/**
|
|
105
105
|
* @deprecated Use {@link PlayWrightAiFixtureType.aiAct} instead.
|
|
106
106
|
*/
|
|
107
|
-
aiAction: (
|
|
107
|
+
aiAction: (...args: Parameters<PageAgent['aiAction']>) => ReturnType<PageAgent['aiAction']>;
|
|
108
108
|
aiTap: (...args: Parameters<PageAgent['aiTap']>) => ReturnType<PageAgent['aiTap']>;
|
|
109
109
|
aiRightClick: (...args: Parameters<PageAgent['aiRightClick']>) => ReturnType<PageAgent['aiRightClick']>;
|
|
110
110
|
aiDoubleClick: (...args: Parameters<PageAgent['aiDoubleClick']>) => ReturnType<PageAgent['aiDoubleClick']>;
|
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-20251209112631.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/core": "1.0.1-beta-
|
|
107
|
-
"@midscene/playground": "1.0.1-beta-
|
|
108
|
-
"@midscene/shared": "1.0.1-beta-
|
|
106
|
+
"@midscene/core": "1.0.1-beta-20251209112631.0",
|
|
107
|
+
"@midscene/playground": "1.0.1-beta-20251209112631.0",
|
|
108
|
+
"@midscene/shared": "1.0.1-beta-20251209112631.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",
|