@donggui/web 1.5.5-donggui.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/bin/midscene-playground +3 -0
- package/bin/midscene-web +2 -0
- package/dist/es/bin.mjs +23 -0
- package/dist/es/bin.mjs.map +1 -0
- package/dist/es/bridge-mode/agent-cli-side.mjs +137 -0
- package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
- package/dist/es/bridge-mode/browser.mjs +2 -0
- package/dist/es/bridge-mode/common.mjs +43 -0
- package/dist/es/bridge-mode/common.mjs.map +1 -0
- package/dist/es/bridge-mode/index.mjs +4 -0
- package/dist/es/bridge-mode/io-client.mjs +101 -0
- package/dist/es/bridge-mode/io-client.mjs.map +1 -0
- package/dist/es/bridge-mode/io-server.mjs +210 -0
- package/dist/es/bridge-mode/io-server.mjs.map +1 -0
- package/dist/es/bridge-mode/page-browser-side.mjs +118 -0
- package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
- package/dist/es/chrome-extension/agent.mjs +9 -0
- package/dist/es/chrome-extension/agent.mjs.map +1 -0
- package/dist/es/chrome-extension/cdpInput.mjs +174 -0
- package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
- package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
- package/dist/es/chrome-extension/dynamic-scripts.mjs +38 -0
- package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
- package/dist/es/chrome-extension/index.mjs +5 -0
- package/dist/es/chrome-extension/page.mjs +651 -0
- package/dist/es/chrome-extension/page.mjs.map +1 -0
- package/dist/es/cli.mjs +16 -0
- package/dist/es/cli.mjs.map +1 -0
- package/dist/es/common/cache-helper.mjs +28 -0
- package/dist/es/common/cache-helper.mjs.map +1 -0
- package/dist/es/index.mjs +6 -0
- package/dist/es/mcp-server.mjs +35 -0
- package/dist/es/mcp-server.mjs.map +1 -0
- package/dist/es/mcp-tools-puppeteer.mjs +215 -0
- package/dist/es/mcp-tools-puppeteer.mjs.map +1 -0
- package/dist/es/mcp-tools.mjs +78 -0
- package/dist/es/mcp-tools.mjs.map +1 -0
- package/dist/es/playwright/ai-fixture.mjs +367 -0
- package/dist/es/playwright/ai-fixture.mjs.map +1 -0
- package/dist/es/playwright/index.mjs +40 -0
- package/dist/es/playwright/index.mjs.map +1 -0
- package/dist/es/playwright/page.mjs +44 -0
- package/dist/es/playwright/page.mjs.map +1 -0
- package/dist/es/playwright/reporter/index.mjs +216 -0
- package/dist/es/playwright/reporter/index.mjs.map +1 -0
- package/dist/es/puppeteer/agent-launcher.mjs +185 -0
- package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
- package/dist/es/puppeteer/base-page.mjs +564 -0
- package/dist/es/puppeteer/base-page.mjs.map +1 -0
- package/dist/es/puppeteer/index.mjs +34 -0
- package/dist/es/puppeteer/index.mjs.map +1 -0
- package/dist/es/puppeteer/page.mjs +9 -0
- package/dist/es/puppeteer/page.mjs.map +1 -0
- package/dist/es/static/index.mjs +3 -0
- package/dist/es/static/static-agent.mjs +12 -0
- package/dist/es/static/static-agent.mjs.map +1 -0
- package/dist/es/static/static-page.mjs +122 -0
- package/dist/es/static/static-page.mjs.map +1 -0
- package/dist/es/utils.mjs +8 -0
- package/dist/es/utils.mjs.map +1 -0
- package/dist/es/web-element.mjs +59 -0
- package/dist/es/web-element.mjs.map +1 -0
- package/dist/es/web-page.mjs +260 -0
- package/dist/es/web-page.mjs.map +1 -0
- package/dist/lib/bin.js +29 -0
- package/dist/lib/bin.js.map +1 -0
- package/dist/lib/bridge-mode/agent-cli-side.js +174 -0
- package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
- package/dist/lib/bridge-mode/browser.js +38 -0
- package/dist/lib/bridge-mode/browser.js.map +1 -0
- package/dist/lib/bridge-mode/common.js +107 -0
- package/dist/lib/bridge-mode/common.js.map +1 -0
- package/dist/lib/bridge-mode/index.js +46 -0
- package/dist/lib/bridge-mode/index.js.map +1 -0
- package/dist/lib/bridge-mode/io-client.js +135 -0
- package/dist/lib/bridge-mode/io-client.js.map +1 -0
- package/dist/lib/bridge-mode/io-server.js +247 -0
- package/dist/lib/bridge-mode/io-server.js.map +1 -0
- package/dist/lib/bridge-mode/page-browser-side.js +162 -0
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
- package/dist/lib/chrome-extension/agent.js +43 -0
- package/dist/lib/chrome-extension/agent.js.map +1 -0
- package/dist/lib/chrome-extension/cdpInput.js +208 -0
- package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
- package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js +88 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
- package/dist/lib/chrome-extension/index.js +60 -0
- package/dist/lib/chrome-extension/index.js.map +1 -0
- package/dist/lib/chrome-extension/page.js +685 -0
- package/dist/lib/chrome-extension/page.js.map +1 -0
- package/dist/lib/cli.js +22 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/common/cache-helper.js +68 -0
- package/dist/lib/common/cache-helper.js.map +1 -0
- package/dist/lib/index.js +60 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mcp-server.js +75 -0
- package/dist/lib/mcp-server.js.map +1 -0
- package/dist/lib/mcp-tools-puppeteer.js +259 -0
- package/dist/lib/mcp-tools-puppeteer.js.map +1 -0
- package/dist/lib/mcp-tools.js +112 -0
- package/dist/lib/mcp-tools.js.map +1 -0
- package/dist/lib/playwright/ai-fixture.js +404 -0
- package/dist/lib/playwright/ai-fixture.js.map +1 -0
- package/dist/lib/playwright/index.js +93 -0
- package/dist/lib/playwright/index.js.map +1 -0
- package/dist/lib/playwright/page.js +78 -0
- package/dist/lib/playwright/page.js.map +1 -0
- package/dist/lib/playwright/reporter/index.js +250 -0
- package/dist/lib/playwright/reporter/index.js.map +1 -0
- package/dist/lib/puppeteer/agent-launcher.js +253 -0
- package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
- package/dist/lib/puppeteer/base-page.js +607 -0
- package/dist/lib/puppeteer/base-page.js.map +1 -0
- package/dist/lib/puppeteer/index.js +84 -0
- package/dist/lib/puppeteer/index.js.map +1 -0
- package/dist/lib/puppeteer/page.js +43 -0
- package/dist/lib/puppeteer/page.js.map +1 -0
- package/dist/lib/static/index.js +52 -0
- package/dist/lib/static/index.js.map +1 -0
- package/dist/lib/static/static-agent.js +46 -0
- package/dist/lib/static/static-agent.js.map +1 -0
- package/dist/lib/static/static-page.js +156 -0
- package/dist/lib/static/static-page.js.map +1 -0
- package/dist/lib/utils.js +40 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/web-element.js +96 -0
- package/dist/lib/web-element.js.map +1 -0
- package/dist/lib/web-page.js +310 -0
- package/dist/lib/web-page.js.map +1 -0
- package/dist/types/bin.d.ts +1 -0
- package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
- package/dist/types/bridge-mode/browser.d.ts +2 -0
- package/dist/types/bridge-mode/common.d.ts +74 -0
- package/dist/types/bridge-mode/index.d.ts +4 -0
- package/dist/types/bridge-mode/io-client.d.ts +10 -0
- package/dist/types/bridge-mode/io-server.d.ts +27 -0
- package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
- package/dist/types/chrome-extension/agent.d.ts +5 -0
- package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
- package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
- package/dist/types/chrome-extension/index.d.ts +5 -0
- package/dist/types/chrome-extension/page.d.ts +110 -0
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/common/cache-helper.d.ts +20 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/mcp-server.d.ts +26 -0
- package/dist/types/mcp-tools-puppeteer.d.ts +13 -0
- package/dist/types/mcp-tools.d.ts +12 -0
- package/dist/types/playwright/ai-fixture.d.ts +131 -0
- package/dist/types/playwright/index.d.ts +13 -0
- package/dist/types/playwright/page.d.ts +11 -0
- package/dist/types/playwright/reporter/index.d.ts +42 -0
- package/dist/types/puppeteer/agent-launcher.d.ts +61 -0
- package/dist/types/puppeteer/base-page.d.ts +106 -0
- package/dist/types/puppeteer/index.d.ts +10 -0
- package/dist/types/puppeteer/page.d.ts +6 -0
- package/dist/types/static/index.d.ts +2 -0
- package/dist/types/static/static-agent.d.ts +5 -0
- package/dist/types/static/static-page.d.ts +42 -0
- package/dist/types/utils.d.ts +6 -0
- package/dist/types/web-element.d.ts +48 -0
- package/dist/types/web-page.d.ts +62 -0
- package/package.json +166 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
14
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: definition[key]
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
})();
|
|
20
|
+
(()=>{
|
|
21
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
22
|
+
})();
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.r = (exports1)=>{
|
|
25
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
26
|
+
value: 'Module'
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
29
|
+
value: true
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
})();
|
|
33
|
+
var __webpack_exports__ = {};
|
|
34
|
+
__webpack_require__.r(__webpack_exports__);
|
|
35
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
+
defaultViewportScale: ()=>defaultViewportScale,
|
|
37
|
+
launchPuppeteerPage: ()=>launchPuppeteerPage,
|
|
38
|
+
defaultUA: ()=>defaultUA,
|
|
39
|
+
buildChromeArgs: ()=>buildChromeArgs,
|
|
40
|
+
defaultViewportHeight: ()=>defaultViewportHeight,
|
|
41
|
+
defaultWaitForNetworkIdleTimeout: ()=>defaultWaitForNetworkIdleTimeout,
|
|
42
|
+
resolveAiActionContext: ()=>resolveAiActionContext,
|
|
43
|
+
defaultViewportWidth: ()=>defaultViewportWidth,
|
|
44
|
+
puppeteerAgentForTarget: ()=>puppeteerAgentForTarget
|
|
45
|
+
});
|
|
46
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
47
|
+
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
48
|
+
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
49
|
+
const external_index_js_namespaceObject = require("./index.js");
|
|
50
|
+
const constants_namespaceObject = require("@midscene/shared/constants");
|
|
51
|
+
const external_puppeteer_namespaceObject = require("puppeteer");
|
|
52
|
+
var external_puppeteer_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_namespaceObject);
|
|
53
|
+
const defaultUA = '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';
|
|
54
|
+
const defaultViewportWidth = 1440;
|
|
55
|
+
const defaultViewportHeight = 768;
|
|
56
|
+
const defaultViewportScale = 0;
|
|
57
|
+
const defaultWaitForNetworkIdleTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;
|
|
58
|
+
function resolveAiActionContext(target, preference) {
|
|
59
|
+
const data = preference?.aiActContext ?? preference?.aiActionContext ?? target.aiActionContext;
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
const DANGEROUS_ARGS = [
|
|
63
|
+
'--no-sandbox',
|
|
64
|
+
'--disable-setuid-sandbox',
|
|
65
|
+
'--disable-web-security',
|
|
66
|
+
'--ignore-certificate-errors',
|
|
67
|
+
'--disable-features=IsolateOrigins',
|
|
68
|
+
'--disable-site-isolation-trials',
|
|
69
|
+
'--allow-running-insecure-content'
|
|
70
|
+
];
|
|
71
|
+
function validateChromeArgs(args, baseArgs) {
|
|
72
|
+
const newArgs = args.filter((arg)=>!baseArgs.some((baseArg)=>{
|
|
73
|
+
const argFlag = arg.split('=')[0];
|
|
74
|
+
const baseFlag = baseArg.split('=')[0];
|
|
75
|
+
return argFlag === baseFlag;
|
|
76
|
+
}));
|
|
77
|
+
const dangerousArgs = newArgs.filter((arg)=>DANGEROUS_ARGS.some((dangerous)=>arg.startsWith(dangerous)));
|
|
78
|
+
if (dangerousArgs.length > 0) console.warn(`Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\nThese arguments may reduce browser security. Use only in controlled testing environments.`);
|
|
79
|
+
}
|
|
80
|
+
const launcherDebug = (0, logger_namespaceObject.getDebug)('puppeteer:launcher');
|
|
81
|
+
function buildChromeArgs(options) {
|
|
82
|
+
const isWindows = 'win32' === process.platform;
|
|
83
|
+
const sandboxArgs = isWindows ? [] : [
|
|
84
|
+
'--no-sandbox',
|
|
85
|
+
'--disable-setuid-sandbox'
|
|
86
|
+
];
|
|
87
|
+
const featureArgs = [
|
|
88
|
+
'--disable-features=HttpsFirstBalancedModeAutoEnable',
|
|
89
|
+
'--disable-features=PasswordLeakDetection',
|
|
90
|
+
'--disable-save-password-bubble'
|
|
91
|
+
];
|
|
92
|
+
const userAgentArg = options?.userAgent ? [
|
|
93
|
+
`--user-agent="${options.userAgent}"`
|
|
94
|
+
] : [];
|
|
95
|
+
const windowSizeArg = options?.windowSize ? [
|
|
96
|
+
`--window-size=${options.windowSize.width},${options.windowSize.height}`
|
|
97
|
+
] : [];
|
|
98
|
+
const baseArgs = [
|
|
99
|
+
...sandboxArgs,
|
|
100
|
+
...featureArgs,
|
|
101
|
+
...userAgentArg,
|
|
102
|
+
...windowSizeArg
|
|
103
|
+
];
|
|
104
|
+
if (options?.chromeArgs?.length) {
|
|
105
|
+
validateChromeArgs(options.chromeArgs, baseArgs);
|
|
106
|
+
return [
|
|
107
|
+
...baseArgs,
|
|
108
|
+
...options.chromeArgs
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
return baseArgs;
|
|
112
|
+
}
|
|
113
|
+
async function launchPuppeteerPage(target, preference, browser, existingPage) {
|
|
114
|
+
(0, utils_namespaceObject.assert)(target.url, 'url is required');
|
|
115
|
+
const freeFn = [];
|
|
116
|
+
const ua = target.userAgent || defaultUA;
|
|
117
|
+
let width = defaultViewportWidth;
|
|
118
|
+
if (void 0 !== target.viewportWidth && null !== target.viewportWidth) {
|
|
119
|
+
(0, utils_namespaceObject.assert)('number' == typeof target.viewportWidth, 'viewportWidth must be a number');
|
|
120
|
+
width = Number.parseInt(target.viewportWidth, 10);
|
|
121
|
+
(0, utils_namespaceObject.assert)(width > 0, `viewportWidth must be greater than 0, but got ${width}`);
|
|
122
|
+
}
|
|
123
|
+
let height = defaultViewportHeight;
|
|
124
|
+
if (void 0 !== target.viewportHeight && null !== target.viewportHeight) {
|
|
125
|
+
(0, utils_namespaceObject.assert)('number' == typeof target.viewportHeight, 'viewportHeight must be a number');
|
|
126
|
+
height = Number.parseInt(target.viewportHeight, 10);
|
|
127
|
+
(0, utils_namespaceObject.assert)(height > 0, `viewportHeight must be greater than 0, but got ${height}`);
|
|
128
|
+
}
|
|
129
|
+
let dpr = defaultViewportScale;
|
|
130
|
+
if (void 0 !== target.deviceScaleFactor && null !== target.deviceScaleFactor) {
|
|
131
|
+
(0, utils_namespaceObject.assert)('number' == typeof target.deviceScaleFactor, 'deviceScaleFactor must be a number');
|
|
132
|
+
dpr = Number.parseInt(target.deviceScaleFactor, 10);
|
|
133
|
+
(0, utils_namespaceObject.assert)(dpr >= 0, `deviceScaleFactor must be >= 0, but got ${dpr}`);
|
|
134
|
+
}
|
|
135
|
+
const viewportConfig = {
|
|
136
|
+
width,
|
|
137
|
+
height,
|
|
138
|
+
deviceScaleFactor: dpr
|
|
139
|
+
};
|
|
140
|
+
const headed = preference?.headed || preference?.keepWindow;
|
|
141
|
+
const defaultViewportConfig = headed ? null : viewportConfig;
|
|
142
|
+
if (headed && '1' === process.env.CI) console.warn('you are probably running headed mode in CI, this will usually fail.');
|
|
143
|
+
const browserUIHeight = 100;
|
|
144
|
+
const args = buildChromeArgs({
|
|
145
|
+
userAgent: ua,
|
|
146
|
+
windowSize: headed ? {
|
|
147
|
+
width,
|
|
148
|
+
height: height + browserUIHeight
|
|
149
|
+
} : void 0,
|
|
150
|
+
chromeArgs: target.chromeArgs
|
|
151
|
+
});
|
|
152
|
+
launcherDebug('launching browser with viewport, headed', headed, 'viewport', viewportConfig, 'args', args, 'preference', preference);
|
|
153
|
+
let page;
|
|
154
|
+
let browserInstance = browser;
|
|
155
|
+
if (existingPage) {
|
|
156
|
+
page = existingPage;
|
|
157
|
+
launcherDebug('reusing existing page for shared browser context');
|
|
158
|
+
if (!browserInstance) browserInstance = page.browser();
|
|
159
|
+
} else {
|
|
160
|
+
if (!browserInstance) {
|
|
161
|
+
browserInstance = await external_puppeteer_default().launch({
|
|
162
|
+
headless: !preference?.headed,
|
|
163
|
+
defaultViewport: defaultViewportConfig,
|
|
164
|
+
args,
|
|
165
|
+
acceptInsecureCerts: target.acceptInsecureCerts,
|
|
166
|
+
ignoreDefaultArgs: preference?.ignoreDefaultArgs
|
|
167
|
+
});
|
|
168
|
+
freeFn.push({
|
|
169
|
+
name: 'puppeteer_browser',
|
|
170
|
+
fn: ()=>{
|
|
171
|
+
if (!preference?.keepWindow) if ('win32' === process.platform) setTimeout(()=>{
|
|
172
|
+
browserInstance?.close();
|
|
173
|
+
}, 800);
|
|
174
|
+
else browserInstance?.close();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
page = await browserInstance.newPage();
|
|
179
|
+
}
|
|
180
|
+
if (target.cookie) {
|
|
181
|
+
const cookieFileContent = (0, external_node_fs_namespaceObject.readFileSync)(target.cookie, 'utf-8');
|
|
182
|
+
await browserInstance.setCookie(...JSON.parse(cookieFileContent));
|
|
183
|
+
}
|
|
184
|
+
if (ua) await page.setUserAgent(ua);
|
|
185
|
+
if (viewportConfig) await page.setViewport(viewportConfig);
|
|
186
|
+
const waitForNetworkIdleTimeout = 'number' == typeof target.waitForNetworkIdle?.timeout ? target.waitForNetworkIdle.timeout : defaultWaitForNetworkIdleTimeout;
|
|
187
|
+
try {
|
|
188
|
+
launcherDebug('goto', target.url);
|
|
189
|
+
await page.goto(target.url);
|
|
190
|
+
if (waitForNetworkIdleTimeout > 0) {
|
|
191
|
+
launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);
|
|
192
|
+
await page.waitForNetworkIdle({
|
|
193
|
+
timeout: waitForNetworkIdleTimeout
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
} catch (e) {
|
|
197
|
+
if ('boolean' == typeof target.waitForNetworkIdle?.continueOnNetworkIdleError && !target.waitForNetworkIdle?.continueOnNetworkIdleError) {
|
|
198
|
+
const newError = new Error(`failed to wait for network idle: ${e}`, {
|
|
199
|
+
cause: e
|
|
200
|
+
});
|
|
201
|
+
throw newError;
|
|
202
|
+
}
|
|
203
|
+
const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;
|
|
204
|
+
console.warn(newMessage);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
page,
|
|
208
|
+
freeFn
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
async function puppeteerAgentForTarget(target, preference, browser, existingPage) {
|
|
212
|
+
const { page, freeFn } = await launchPuppeteerPage(target, preference, browser, existingPage);
|
|
213
|
+
const aiActContext = resolveAiActionContext(target, preference);
|
|
214
|
+
const { aiActionContext, ...preferenceToUse } = preference ?? {};
|
|
215
|
+
const agent = new external_index_js_namespaceObject.PuppeteerAgent(page, {
|
|
216
|
+
...preferenceToUse,
|
|
217
|
+
aiActContext,
|
|
218
|
+
forceSameTabNavigation: void 0 !== target.forceSameTabNavigation ? target.forceSameTabNavigation : true
|
|
219
|
+
});
|
|
220
|
+
freeFn.push({
|
|
221
|
+
name: 'midscene_puppeteer_agent',
|
|
222
|
+
fn: ()=>agent.destroy()
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
agent,
|
|
226
|
+
freeFn
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
exports.buildChromeArgs = __webpack_exports__.buildChromeArgs;
|
|
230
|
+
exports.defaultUA = __webpack_exports__.defaultUA;
|
|
231
|
+
exports.defaultViewportHeight = __webpack_exports__.defaultViewportHeight;
|
|
232
|
+
exports.defaultViewportScale = __webpack_exports__.defaultViewportScale;
|
|
233
|
+
exports.defaultViewportWidth = __webpack_exports__.defaultViewportWidth;
|
|
234
|
+
exports.defaultWaitForNetworkIdleTimeout = __webpack_exports__.defaultWaitForNetworkIdleTimeout;
|
|
235
|
+
exports.launchPuppeteerPage = __webpack_exports__.launchPuppeteerPage;
|
|
236
|
+
exports.puppeteerAgentForTarget = __webpack_exports__.puppeteerAgentForTarget;
|
|
237
|
+
exports.resolveAiActionContext = __webpack_exports__.resolveAiActionContext;
|
|
238
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
239
|
+
"buildChromeArgs",
|
|
240
|
+
"defaultUA",
|
|
241
|
+
"defaultViewportHeight",
|
|
242
|
+
"defaultViewportScale",
|
|
243
|
+
"defaultViewportWidth",
|
|
244
|
+
"defaultWaitForNetworkIdleTimeout",
|
|
245
|
+
"launchPuppeteerPage",
|
|
246
|
+
"puppeteerAgentForTarget",
|
|
247
|
+
"resolveAiActionContext"
|
|
248
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
249
|
+
Object.defineProperty(exports, '__esModule', {
|
|
250
|
+
value: true
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
//# sourceMappingURL=agent-launcher.js.map
|
|
@@ -0,0 +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, type Page } 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;\n// Setting deviceScaleFactor value to `0` means reset this value to the system default in Puppeteer.\nexport const defaultViewportScale = 0;\nexport const defaultWaitForNetworkIdleTimeout =\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n\nexport function resolveAiActionContext(\n target: MidsceneYamlScriptWebEnv,\n preference?: Partial<Pick<AgentOpt, 'aiActionContext' | 'aiActContext'>>,\n): AgentOpt['aiActionContext'] | undefined {\n // Prefer agent-level preference if provided; otherwise fall back to target-level context.\n // Priority: preference.aiActContext > preference.aiActionContext (deprecated) > target.aiActionContext\n const data =\n preference?.aiActContext ??\n preference?.aiActionContext ??\n target.aiActionContext;\n return data;\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 interface BuildChromeArgsOptions {\n userAgent?: string;\n windowSize?: { width: number; height: number };\n chromeArgs?: string[];\n}\n\n/**\n * Builds Chrome launch arguments with sensible defaults.\n *\n * Platform-specific behavior:\n * - On non-Windows systems, automatically adds --no-sandbox and --disable-setuid-sandbox\n * for compatibility with containerized/CI environments\n *\n * @param options - Configuration options for Chrome arguments\n * @returns Array of Chrome launch arguments\n *\n * @example\n * ```typescript\n * // Basic usage\n * const args = buildChromeArgs();\n *\n * // With custom arguments\n * const args = buildChromeArgs({\n * chromeArgs: ['--disable-gpu', '--disable-dev-shm-usage'],\n * userAgent: 'CustomUA/1.0',\n * windowSize: { width: 1920, height: 1080 },\n * });\n * ```\n */\nexport function buildChromeArgs(options?: BuildChromeArgsOptions): string[] {\n const isWindows = process.platform === 'win32';\n\n const sandboxArgs = isWindows\n ? []\n : ['--no-sandbox', '--disable-setuid-sandbox'];\n const featureArgs = [\n '--disable-features=HttpsFirstBalancedModeAutoEnable',\n '--disable-features=PasswordLeakDetection',\n '--disable-save-password-bubble',\n ];\n const userAgentArg = options?.userAgent\n ? [`--user-agent=\"${options.userAgent}\"`]\n : [];\n const windowSizeArg = options?.windowSize\n ? [`--window-size=${options.windowSize.width},${options.windowSize.height}`]\n : [];\n\n const baseArgs = [\n ...sandboxArgs,\n ...featureArgs,\n ...userAgentArg,\n ...windowSizeArg,\n ];\n\n if (options?.chromeArgs?.length) {\n validateChromeArgs(options.chromeArgs, baseArgs);\n return [...baseArgs, ...options.chromeArgs];\n }\n\n return baseArgs;\n}\n\nexport async function launchPuppeteerPage(\n target: MidsceneYamlScriptWebEnv,\n preference?: {\n headed?: boolean;\n keepWindow?: boolean;\n ignoreDefaultArgs?: boolean | string[];\n },\n browser?: Browser,\n existingPage?: Page,\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 !== undefined && target.viewportWidth !== null) {\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 !== undefined && target.viewportHeight !== null) {\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 (\n target.deviceScaleFactor !== undefined &&\n target.deviceScaleFactor !== null\n ) {\n assert(\n typeof target.deviceScaleFactor === 'number',\n 'deviceScaleFactor must be a number',\n );\n dpr = Number.parseInt(target.deviceScaleFactor as unknown as string, 10);\n assert(dpr >= 0, `deviceScaleFactor must be >= 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 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\n // Build Chrome arguments using the shared helper\n // Only pass windowSize in headed mode; in headless mode, defaultViewport takes precedence\n // Add 100px to height to account for browser UI (address bar, tabs, etc.)\n const browserUIHeight = 100;\n const args = buildChromeArgs({\n userAgent: ua,\n windowSize: headed\n ? { width, height: height + browserUIHeight }\n : undefined,\n chromeArgs: target.chromeArgs,\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 // If an existing page is provided, reuse it instead of creating a new one\n // This allows sharing localStorage and sessionStorage between YAML files\n let page: Page;\n let browserInstance = browser;\n\n if (existingPage) {\n // Reuse the existing page - this preserves localStorage and sessionStorage\n page = existingPage;\n launcherDebug('reusing existing page for shared browser context');\n\n // Get the browser instance from the existing page\n if (!browserInstance) {\n browserInstance = page.browser();\n }\n } else {\n // Create a new browser and page\n if (!browserInstance) {\n browserInstance = await puppeteer.launch({\n headless: !preference?.headed,\n defaultViewport: defaultViewportConfig,\n args,\n acceptInsecureCerts: target.acceptInsecureCerts,\n ignoreDefaultArgs: preference?.ignoreDefaultArgs,\n });\n freeFn.push({\n name: 'puppeteer_browser',\n fn: () => {\n if (!preference?.keepWindow) {\n if (process.platform === 'win32') {\n setTimeout(() => {\n browserInstance?.close();\n }, 800);\n } else {\n browserInstance?.close();\n }\n }\n },\n });\n }\n page = await browserInstance.newPage();\n }\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 existingPage?: Page,\n) {\n const { page, freeFn } = await launchPuppeteerPage(\n target,\n preference,\n browser,\n existingPage,\n );\n const aiActContext = resolveAiActionContext(target, preference);\n\n const { aiActionContext, ...preferenceToUse } = preference ?? {};\n\n // prepare Midscene agent\n const agent = new PuppeteerAgent(page, {\n ...preferenceToUse,\n aiActContext,\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","defaultWaitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","resolveAiActionContext","target","preference","data","DANGEROUS_ARGS","validateChromeArgs","args","baseArgs","newArgs","arg","baseArg","argFlag","baseFlag","dangerousArgs","dangerous","console","launcherDebug","getDebug","buildChromeArgs","options","isWindows","process","sandboxArgs","featureArgs","userAgentArg","windowSizeArg","launchPuppeteerPage","browser","existingPage","assert","freeFn","ua","width","undefined","Number","height","dpr","viewportConfig","headed","defaultViewportConfig","browserUIHeight","page","browserInstance","puppeteer","setTimeout","cookieFileContent","readFileSync","JSON","waitForNetworkIdleTimeout","e","newError","Error","newMessage","puppeteerAgentForTarget","aiActContext","aiActionContext","preferenceToUse","agent","PuppeteerAgent"],"mappings":"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"}
|