@midscene/web 1.5.7 → 1.5.8-beta-20260324073120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/es/bin.mjs +8 -15
  2. package/dist/es/bin.mjs.map +1 -1
  3. package/dist/es/bridge-mode/io-client.mjs +1 -1
  4. package/dist/es/bridge-mode/io-server.mjs +2 -2
  5. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  6. package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
  7. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  8. package/dist/es/cli.mjs +36 -3
  9. package/dist/es/cli.mjs.map +1 -1
  10. package/dist/es/index.mjs +3 -1
  11. package/dist/es/mcp-server.mjs +1 -1
  12. package/dist/es/mcp-tools-cdp.mjs +130 -0
  13. package/dist/es/mcp-tools-cdp.mjs.map +1 -0
  14. package/dist/es/platform.mjs +37 -0
  15. package/dist/es/platform.mjs.map +1 -0
  16. package/dist/es/puppeteer/base-page.mjs.map +1 -1
  17. package/dist/lib/bin.js +7 -14
  18. package/dist/lib/bin.js.map +1 -1
  19. package/dist/lib/bridge-mode/io-client.js +1 -1
  20. package/dist/lib/bridge-mode/io-server.js +2 -2
  21. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  22. package/dist/lib/bridge-mode/page-browser-side.js +1 -1
  23. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  24. package/dist/lib/cli.js +58 -3
  25. package/dist/lib/cli.js.map +1 -1
  26. package/dist/lib/index.js +10 -2
  27. package/dist/lib/mcp-server.js +1 -1
  28. package/dist/lib/mcp-tools-cdp.js +174 -0
  29. package/dist/lib/mcp-tools-cdp.js.map +1 -0
  30. package/dist/lib/platform.js +71 -0
  31. package/dist/lib/platform.js.map +1 -0
  32. package/dist/lib/puppeteer/base-page.js.map +1 -1
  33. package/dist/types/index.d.ts +2 -0
  34. package/dist/types/mcp-tools-cdp.d.ts +18 -0
  35. package/dist/types/platform.d.ts +9 -0
  36. package/package.json +4 -4
package/dist/lib/index.js CHANGED
@@ -25,11 +25,13 @@ var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  PlaywrightAiFixture: ()=>index_js_namespaceObject.PlaywrightAiFixture,
28
- PageAgent: ()=>agent_namespaceObject.Agent,
29
28
  StaticPageAgent: ()=>external_static_index_js_namespaceObject.StaticPageAgent,
30
29
  PlaywrightAgent: ()=>index_js_namespaceObject.PlaywrightAgent,
31
30
  PuppeteerAgent: ()=>external_puppeteer_index_js_namespaceObject.PuppeteerAgent,
32
31
  StaticPage: ()=>external_static_index_js_namespaceObject.StaticPage,
32
+ PageAgent: ()=>agent_namespaceObject.Agent,
33
+ webPlaygroundPlatform: ()=>external_platform_js_namespaceObject.webPlaygroundPlatform,
34
+ WebCdpMidsceneTools: ()=>external_mcp_tools_cdp_js_namespaceObject.WebCdpMidsceneTools,
33
35
  WebMidsceneTools: ()=>external_mcp_tools_js_namespaceObject.WebMidsceneTools
34
36
  });
35
37
  const index_js_namespaceObject = require("./playwright/index.js");
@@ -37,13 +39,17 @@ const agent_namespaceObject = require("@midscene/core/agent");
37
39
  const external_puppeteer_index_js_namespaceObject = require("./puppeteer/index.js");
38
40
  const external_static_index_js_namespaceObject = require("./static/index.js");
39
41
  const external_mcp_tools_js_namespaceObject = require("./mcp-tools.js");
42
+ const external_platform_js_namespaceObject = require("./platform.js");
43
+ const external_mcp_tools_cdp_js_namespaceObject = require("./mcp-tools-cdp.js");
40
44
  exports.PageAgent = __webpack_exports__.PageAgent;
41
45
  exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
42
46
  exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
43
47
  exports.PuppeteerAgent = __webpack_exports__.PuppeteerAgent;
44
48
  exports.StaticPage = __webpack_exports__.StaticPage;
45
49
  exports.StaticPageAgent = __webpack_exports__.StaticPageAgent;
50
+ exports.WebCdpMidsceneTools = __webpack_exports__.WebCdpMidsceneTools;
46
51
  exports.WebMidsceneTools = __webpack_exports__.WebMidsceneTools;
52
+ exports.webPlaygroundPlatform = __webpack_exports__.webPlaygroundPlatform;
47
53
  for(var __rspack_i in __webpack_exports__)if (-1 === [
48
54
  "PageAgent",
49
55
  "PlaywrightAgent",
@@ -51,7 +57,9 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
51
57
  "PuppeteerAgent",
52
58
  "StaticPage",
53
59
  "StaticPageAgent",
54
- "WebMidsceneTools"
60
+ "WebCdpMidsceneTools",
61
+ "WebMidsceneTools",
62
+ "webPlaygroundPlatform"
55
63
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
56
64
  Object.defineProperty(exports, '__esModule', {
57
65
  value: true
@@ -37,7 +37,7 @@ class WebMCPServer extends mcp_namespaceObject.BaseMCPServer {
37
37
  constructor(toolsManager){
38
38
  super({
39
39
  name: '@midscene/web-bridge-mcp',
40
- version: "1.5.7",
40
+ version: "1.5.8-beta-20260324073120.0",
41
41
  description: 'Control the browser using natural language commands'
42
42
  }, toolsManager);
43
43
  }
@@ -0,0 +1,174 @@
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
+ WebCdpMidsceneTools: ()=>WebCdpMidsceneTools
37
+ });
38
+ const core_namespaceObject = require("@midscene/core");
39
+ const mcp_namespaceObject = require("@midscene/shared/mcp");
40
+ const external_puppeteer_core_namespaceObject = require("puppeteer-core");
41
+ var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
42
+ const index_js_namespaceObject = require("./puppeteer/index.js");
43
+ const external_static_index_js_namespaceObject = require("./static/index.js");
44
+ function _define_property(obj, key, value) {
45
+ if (key in obj) Object.defineProperty(obj, key, {
46
+ value: value,
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true
50
+ });
51
+ else obj[key] = value;
52
+ return obj;
53
+ }
54
+ class WebCdpMidsceneTools extends mcp_namespaceObject.BaseMidsceneTools {
55
+ createTemporaryDevice() {
56
+ return new external_static_index_js_namespaceObject.StaticPage({
57
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
58
+ shotSize: {
59
+ width: 1920,
60
+ height: 1080
61
+ },
62
+ shrunkShotToLogicalRatio: 1
63
+ });
64
+ }
65
+ async ensureAgent(navigateToUrl) {
66
+ if (this.agent && navigateToUrl) {
67
+ try {
68
+ await this.agent?.destroy?.();
69
+ } catch (error) {
70
+ console.debug('Failed to destroy agent during re-init:', error);
71
+ }
72
+ this.agent = void 0;
73
+ }
74
+ if (this.agent) return this.agent;
75
+ if (!this.activeBrowser) this.activeBrowser = await external_puppeteer_core_default().connect({
76
+ browserWSEndpoint: this.cdpEndpoint,
77
+ defaultViewport: null
78
+ });
79
+ const browser = this.activeBrowser;
80
+ const pages = await browser.pages();
81
+ const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
82
+ let page;
83
+ if (navigateToUrl) if (webPages.length > 0) {
84
+ page = webPages[webPages.length - 1];
85
+ await page.bringToFront();
86
+ await page.goto(navigateToUrl, {
87
+ timeout: 30000,
88
+ waitUntil: 'domcontentloaded'
89
+ });
90
+ } else {
91
+ page = await browser.newPage();
92
+ await page.goto(navigateToUrl, {
93
+ timeout: 30000,
94
+ waitUntil: 'domcontentloaded'
95
+ });
96
+ }
97
+ else {
98
+ page = webPages.length > 0 ? webPages[webPages.length - 1] : pages[pages.length - 1] || await browser.newPage();
99
+ await page.bringToFront();
100
+ }
101
+ this.agent = new index_js_namespaceObject.PuppeteerAgent(page);
102
+ return this.agent;
103
+ }
104
+ async destroy() {
105
+ await super.destroy();
106
+ if (this.activeBrowser) {
107
+ this.activeBrowser.disconnect();
108
+ this.activeBrowser = null;
109
+ }
110
+ }
111
+ preparePlatformTools() {
112
+ return [
113
+ {
114
+ name: 'web_connect',
115
+ description: 'Connect to a web page via CDP. Opens a new tab with the given URL, or reuses the current page.',
116
+ schema: {
117
+ url: core_namespaceObject.z.string().url().optional().describe('URL to open in new tab (omit to use current page)')
118
+ },
119
+ handler: async (args)=>{
120
+ const { url } = args;
121
+ if (this.agent) {
122
+ try {
123
+ await this.agent.destroy?.();
124
+ } catch {}
125
+ this.agent = void 0;
126
+ }
127
+ this.agent = await this.ensureAgent(url);
128
+ const screenshot = await this.agent.page?.screenshotBase64();
129
+ const label = url ?? 'current page';
130
+ return {
131
+ content: [
132
+ {
133
+ type: 'text',
134
+ text: `Connected via CDP to: ${label}`
135
+ },
136
+ ...screenshot ? this.buildScreenshotContent(screenshot) : []
137
+ ]
138
+ };
139
+ }
140
+ },
141
+ {
142
+ name: 'web_disconnect',
143
+ description: 'Disconnect from current web page. The browser stays running (managed externally).',
144
+ schema: {},
145
+ handler: async ()=>{
146
+ if (this.agent) {
147
+ try {
148
+ await this.agent.destroy?.();
149
+ } catch {}
150
+ this.agent = void 0;
151
+ }
152
+ if (this.activeBrowser) {
153
+ this.activeBrowser.disconnect();
154
+ this.activeBrowser = null;
155
+ }
156
+ return this.buildTextResult('Disconnected from web page (browser still running externally)');
157
+ }
158
+ }
159
+ ];
160
+ }
161
+ constructor(cdpEndpoint){
162
+ super(), _define_property(this, "cdpEndpoint", void 0), _define_property(this, "activeBrowser", null);
163
+ this.cdpEndpoint = cdpEndpoint;
164
+ }
165
+ }
166
+ exports.WebCdpMidsceneTools = __webpack_exports__.WebCdpMidsceneTools;
167
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
168
+ "WebCdpMidsceneTools"
169
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
170
+ Object.defineProperty(exports, '__esModule', {
171
+ value: true
172
+ });
173
+
174
+ //# sourceMappingURL=mcp-tools-cdp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools-cdp.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/mcp-tools-cdp.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 { ScreenshotItem, z } from '@midscene/core';\nimport { BaseMidsceneTools, type ToolDefinition } from '@midscene/shared/mcp';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport puppeteer from 'puppeteer-core';\nimport type { Browser, Page } from 'puppeteer-core';\nimport { PuppeteerAgent } from './puppeteer';\nimport { StaticPage } from './static';\n\n/**\n * Tools manager for Web CDP-mode MCP.\n * Connects to an existing Chrome browser via CDP (Chrome DevTools Protocol) endpoint.\n * Unlike WebPuppeteerMidsceneTools which launches its own Chrome, this connects\n * to a browser that is already running with remote debugging enabled.\n */\nexport class WebCdpMidsceneTools extends BaseMidsceneTools<PuppeteerAgent> {\n private cdpEndpoint: string;\n private activeBrowser: Browser | null = null;\n\n constructor(cdpEndpoint: string) {\n super();\n this.cdpEndpoint = cdpEndpoint;\n }\n\n protected createTemporaryDevice() {\n return new StaticPage({\n screenshot: ScreenshotItem.create('', Date.now()),\n shotSize: { width: 1920, height: 1080 },\n shrunkShotToLogicalRatio: 1,\n });\n }\n\n protected async ensureAgent(navigateToUrl?: string): Promise<PuppeteerAgent> {\n // Re-init if URL provided\n if (this.agent && navigateToUrl) {\n try {\n await this.agent?.destroy?.();\n } catch (error) {\n console.debug('Failed to destroy agent during re-init:', error);\n }\n this.agent = undefined;\n }\n\n if (this.agent) return this.agent;\n\n // Connect to the existing browser via CDP endpoint\n if (!this.activeBrowser) {\n this.activeBrowser = await puppeteer.connect({\n browserWSEndpoint: this.cdpEndpoint,\n defaultViewport: null,\n });\n }\n\n const browser = this.activeBrowser;\n const pages = await browser.pages();\n const webPages = pages.filter((p) => /^https?:\\/\\//.test(p.url()));\n let page: Page;\n\n if (navigateToUrl) {\n if (webPages.length > 0) {\n // Reuse an existing page and navigate it — avoids creating invisible\n // tabs when Chrome uses settings-based remote debugging (no HTTP\n // discovery endpoints, /devtools/page/* returns 403).\n page = webPages[webPages.length - 1];\n await page.bringToFront();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n } else {\n // No existing web pages — fall back to creating a new tab\n page = await browser.newPage();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n }\n } else {\n // Reuse the last web page\n page =\n webPages.length > 0\n ? webPages[webPages.length - 1]\n : pages[pages.length - 1] || (await browser.newPage());\n\n await page.bringToFront();\n }\n\n this.agent = new PuppeteerAgent(page as unknown as PuppeteerPage);\n return this.agent;\n }\n\n public async destroy(): Promise<void> {\n await super.destroy();\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n }\n\n protected preparePlatformTools(): ToolDefinition[] {\n return [\n {\n name: 'web_connect',\n description:\n 'Connect to a web page via CDP. Opens a new tab with the given URL, or reuses the current page.',\n schema: {\n url: z\n .string()\n .url()\n .optional()\n .describe('URL to open in new tab (omit to use current page)'),\n },\n handler: async (args) => {\n const { url } = args as { url?: string };\n\n // Destroy existing agent\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n }\n\n this.agent = await this.ensureAgent(url);\n\n const screenshot = await this.agent.page?.screenshotBase64();\n const label = url ?? 'current page';\n\n return {\n content: [\n { type: 'text', text: `Connected via CDP to: ${label}` },\n ...(screenshot ? this.buildScreenshotContent(screenshot) : []),\n ],\n };\n },\n },\n {\n name: 'web_disconnect',\n description:\n 'Disconnect from current web page. The browser stays running (managed externally).',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n }\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n return this.buildTextResult(\n 'Disconnected from web page (browser still running externally)',\n );\n },\n },\n ];\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","WebCdpMidsceneTools","BaseMidsceneTools","StaticPage","ScreenshotItem","Date","navigateToUrl","error","console","undefined","puppeteer","browser","pages","webPages","p","page","PuppeteerAgent","z","args","url","screenshot","label","cdpEndpoint"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ webPlaygroundPlatform: ()=>webPlaygroundPlatform
28
+ });
29
+ const core_namespaceObject = require("@midscene/core");
30
+ const playground_namespaceObject = require("@midscene/playground");
31
+ const index_js_namespaceObject = require("./static/index.js");
32
+ function createDefaultWebAgent() {
33
+ const page = new index_js_namespaceObject.StaticPage({
34
+ shotSize: {
35
+ width: 800,
36
+ height: 600
37
+ },
38
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
39
+ shrunkShotToLogicalRatio: 1
40
+ });
41
+ return new index_js_namespaceObject.StaticPageAgent(page);
42
+ }
43
+ const webPlaygroundPlatform = (0, playground_namespaceObject.definePlaygroundPlatform)({
44
+ id: 'web',
45
+ title: 'Midscene Web Playground',
46
+ description: "Web playground platform descriptor",
47
+ async prepare (options) {
48
+ const agent = options?.agent || createDefaultWebAgent();
49
+ return {
50
+ platformId: 'web',
51
+ title: options?.title || 'Midscene Web Playground',
52
+ agent,
53
+ launchOptions: options?.launchOptions,
54
+ preview: options?.preview || (0, playground_namespaceObject.createScreenshotPreviewDescriptor)({
55
+ title: 'Web page preview'
56
+ }),
57
+ metadata: {
58
+ interfaceType: agent.interface?.interfaceType || 'web'
59
+ }
60
+ };
61
+ }
62
+ });
63
+ exports.webPlaygroundPlatform = __webpack_exports__.webPlaygroundPlatform;
64
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
65
+ "webPlaygroundPlatform"
66
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
67
+ Object.defineProperty(exports, '__esModule', {
68
+ value: true
69
+ });
70
+
71
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/platform.ts"],"sourcesContent":["__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 { ScreenshotItem } from '@midscene/core';\nimport type { Agent } from '@midscene/core/agent';\nimport {\n type LaunchPlaygroundOptions,\n type PlaygroundPreviewDescriptor,\n createScreenshotPreviewDescriptor,\n definePlaygroundPlatform,\n} from '@midscene/playground';\nimport { StaticPage, StaticPageAgent } from './static';\n\nexport interface WebPlatformOptions {\n agent?: Agent;\n title?: string;\n preview?: PlaygroundPreviewDescriptor;\n launchOptions?: LaunchPlaygroundOptions;\n}\n\nfunction createDefaultWebAgent(): StaticPageAgent {\n const page = new StaticPage({\n shotSize: { width: 800, height: 600 },\n screenshot: ScreenshotItem.create('', Date.now()),\n shrunkShotToLogicalRatio: 1,\n });\n\n return new StaticPageAgent(page);\n}\n\nexport const webPlaygroundPlatform = definePlaygroundPlatform<\n WebPlatformOptions | undefined\n>({\n id: 'web',\n title: 'Midscene Web Playground',\n description: 'Web playground platform descriptor',\n async prepare(options) {\n const agent = options?.agent || createDefaultWebAgent();\n\n return {\n platformId: 'web',\n title: options?.title || 'Midscene Web Playground',\n agent,\n launchOptions: options?.launchOptions,\n preview:\n options?.preview ||\n createScreenshotPreviewDescriptor({\n title: 'Web page preview',\n }),\n metadata: {\n interfaceType: agent.interface?.interfaceType || 'web',\n },\n };\n },\n});\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","createDefaultWebAgent","page","StaticPage","ScreenshotItem","Date","StaticPageAgent","webPlaygroundPlatform","definePlaygroundPlatform","options","agent","createScreenshotPreviewDescriptor"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;ACWA,SAASI;IACP,MAAMC,OAAO,IAAIC,yBAAAA,UAAUA,CAAC;QAC1B,UAAU;YAAE,OAAO;YAAK,QAAQ;QAAI;QACpC,YAAYC,qBAAAA,cAAAA,CAAAA,MAAqB,CAAC,IAAIC,KAAK,GAAG;QAC9C,0BAA0B;IAC5B;IAEA,OAAO,IAAIC,yBAAAA,eAAeA,CAACJ;AAC7B;AAEO,MAAMK,wBAAwBC,AAAAA,IAAAA,2BAAAA,wBAAAA,AAAAA,EAEnC;IACA,IAAI;IACJ,OAAO;IACP,aAAa;IACb,MAAM,SAAQC,OAAO;QACnB,MAAMC,QAAQD,SAAS,SAASR;QAEhC,OAAO;YACL,YAAY;YACZ,OAAOQ,SAAS,SAAS;YACzBC;YACA,eAAeD,SAAS;YACxB,SACEA,SAAS,WACTE,AAAAA,IAAAA,2BAAAA,iCAAAA,AAAAA,EAAkC;gBAChC,OAAO;YACT;YACF,UAAU;gBACR,eAAeD,MAAM,SAAS,EAAE,iBAAiB;YACnD;QACF;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"puppeteer/base-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/base-page.ts"],"sourcesContent":["__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 type { WebPageAgentOpt } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n} from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\nexport const BROWSER_NAVIGATION_ERROR_PATTERN =\n /execution context was destroyed|frame was detached|target closed|page has been closed|context was destroyed|net::ERR_ABORTED/i;\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface\n{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation(\n moment:\n | 'screenshot'\n | 'getElementsInfo'\n | 'getElementsNodeTree'\n | 'afterInvokeAction',\n actionName?: string,\n ) {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage(\n `waitForNavigation begin at moment ${moment} with timeout: ${this.waitForNavigationTimeout} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(\n moment: 'afterInvokeAction',\n actionName?: string,\n ): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n debugPage(\n `waitForNetworkIdle begin at moment ${moment} with timeout: ${this.waitForNetworkIdleTimeout} and concurrency: ${DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNetworkIdle end');\n } else {\n // TODO: implement playwright waitForNetworkIdle\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation('getElementsInfo');\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debugPage);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return { xpaths: sanitized };\n } catch (error) {\n debugPage('cacheFeatureForPoint failed: %s', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n return buildRectFromElementInfo(elementInfo);\n }\n debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation('getElementsNodeTree');\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg';\n const quality = 90;\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n element &&\n (await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n }));\n await backspace();\n }\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async reload(): Promise<void> {\n debugPage('reload page');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).reload();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).reload();\n } else {\n throw new Error('Unsupported page type for reload');\n }\n }\n\n async goBack(): Promise<void> {\n debugPage('go back');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goBack();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goBack();\n } else {\n throw new Error('Unsupported page type for go back');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([\n this.waitForNavigation('afterInvokeAction', name),\n this.waitForNetworkIdle('afterInvokeAction', name),\n ]);\n\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> {}\n\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n\n async pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration = 500,\n ): Promise<void> {\n const steps = 30;\n const delay = duration / steps;\n const halfStart = startDistance / 2;\n const halfEnd = endDistance / 2;\n\n // biome-ignore lint: CDP session types differ between Puppeteer and Playwright\n let client: any;\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n client = await page.target().createCDPSession();\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n // CDP is Chromium-only; Firefox/WebKit do not support it\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `Pinch gesture requires Chromium-based browser, but current browser is \"${browserName}\". CDP touch events are not supported in Firefox/WebKit.`,\n );\n }\n client = await page.context().newCDPSession(page);\n } else {\n return;\n }\n\n try {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [\n { x: Math.round(centerX), y: Math.round(centerY - halfStart), id: 0 },\n { x: Math.round(centerX), y: Math.round(centerY + halfStart), id: 1 },\n ],\n });\n\n for (let i = 1; i <= steps; i++) {\n const currentHalf = halfStart + (halfEnd - halfStart) * (i / steps);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [\n {\n x: Math.round(centerX),\n y: Math.round(centerY - currentHalf),\n id: 0,\n },\n {\n x: Math.round(centerX),\n y: Math.round(centerY + currentHalf),\n id: 1,\n },\n ],\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n } finally {\n await client.detach();\n }\n }\n\n private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n ({ id, content }: { id: string; content: string }) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n { id: styleId, content: styleContent },\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","BROWSER_NAVIGATION_ERROR_PATTERN","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","button","count","page","deltaX","deltaY","from","to","sleep","text","action","keys","Array","k","commands","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","resolve","setTimeout","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","client","browserName","currentHalf","session","handler","capturedError","event","undefined","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","document","style","err"],"mappings":"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"}
1
+ {"version":3,"file":"puppeteer/base-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/base-page.ts"],"sourcesContent":["__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 type { WebPageAgentOpt } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n} from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\nexport const BROWSER_NAVIGATION_ERROR_PATTERN =\n /execution context was destroyed|frame was detached|target closed|page has been closed|context was destroyed|net::ERR_ABORTED/i;\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface\n{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation(\n moment:\n | 'screenshot'\n | 'getElementsInfo'\n | 'getElementsNodeTree'\n | 'afterInvokeAction',\n actionName?: string,\n ) {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage(\n `waitForNavigation begin at moment ${moment} with timeout: ${this.waitForNavigationTimeout} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(\n moment: 'afterInvokeAction',\n actionName?: string,\n ): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n debugPage(\n `waitForNetworkIdle begin at moment ${moment} with timeout: ${this.waitForNetworkIdleTimeout} and concurrency: ${DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNetworkIdle end');\n } else {\n // TODO: implement playwright waitForNetworkIdle\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation('getElementsInfo');\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debugPage);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return { xpaths: sanitized };\n } catch (error) {\n debugPage('cacheFeatureForPoint failed: %s', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n return buildRectFromElementInfo(elementInfo);\n }\n debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation('getElementsNodeTree');\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg';\n const quality = 90;\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n element &&\n (await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n }));\n await backspace();\n }\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async reload(): Promise<void> {\n debugPage('reload page');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).reload();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).reload();\n } else {\n throw new Error('Unsupported page type for reload');\n }\n }\n\n async goBack(): Promise<void> {\n debugPage('go back');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goBack();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goBack();\n } else {\n throw new Error('Unsupported page type for go back');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([\n this.waitForNavigation('afterInvokeAction', name),\n this.waitForNetworkIdle('afterInvokeAction', name),\n ]);\n\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> {}\n\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n\n async pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration = 500,\n ): Promise<void> {\n const steps = 30;\n const delay = duration / steps;\n const halfStart = startDistance / 2;\n const halfEnd = endDistance / 2;\n\n type TouchClient = {\n send(\n method: 'Input.dispatchTouchEvent',\n params?: Protocol.Input.DispatchTouchEventRequest,\n ): Promise<unknown>;\n detach(): Promise<void>;\n };\n\n let client: TouchClient;\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n client = (await page.target().createCDPSession()) as TouchClient;\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n // CDP is Chromium-only; Firefox/WebKit do not support it\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `Pinch gesture requires Chromium-based browser, but current browser is \"${browserName}\". CDP touch events are not supported in Firefox/WebKit.`,\n );\n }\n client = (await page.context().newCDPSession(page)) as TouchClient;\n } else {\n return;\n }\n\n try {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [\n { x: Math.round(centerX), y: Math.round(centerY - halfStart), id: 0 },\n { x: Math.round(centerX), y: Math.round(centerY + halfStart), id: 1 },\n ],\n });\n\n for (let i = 1; i <= steps; i++) {\n const currentHalf = halfStart + (halfEnd - halfStart) * (i / steps);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [\n {\n x: Math.round(centerX),\n y: Math.round(centerY - currentHalf),\n id: 0,\n },\n {\n x: Math.round(centerX),\n y: Math.round(centerY + currentHalf),\n id: 1,\n },\n ],\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n } finally {\n await client.detach();\n }\n }\n\n private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n ({ id, content }: { id: string; content: string }) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n { id: styleId, content: styleContent },\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","BROWSER_NAVIGATION_ERROR_PATTERN","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","button","count","page","deltaX","deltaY","from","to","sleep","text","action","keys","Array","k","commands","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","resolve","setTimeout","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","client","browserName","currentHalf","session","handler","capturedError","event","undefined","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","document","style","err"],"mappings":"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"}
@@ -5,3 +5,5 @@ export { PuppeteerAgent } from './puppeteer';
5
5
  export { PlaywrightAgent } from './playwright';
6
6
  export { StaticPageAgent, StaticPage } from './static';
7
7
  export { WebMidsceneTools } from './mcp-tools';
8
+ export { webPlaygroundPlatform } from './platform';
9
+ export { WebCdpMidsceneTools } from './mcp-tools-cdp';
@@ -0,0 +1,18 @@
1
+ import { BaseMidsceneTools, type ToolDefinition } from '@midscene/shared/mcp';
2
+ import { PuppeteerAgent } from './puppeteer';
3
+ import { StaticPage } from './static';
4
+ /**
5
+ * Tools manager for Web CDP-mode MCP.
6
+ * Connects to an existing Chrome browser via CDP (Chrome DevTools Protocol) endpoint.
7
+ * Unlike WebPuppeteerMidsceneTools which launches its own Chrome, this connects
8
+ * to a browser that is already running with remote debugging enabled.
9
+ */
10
+ export declare class WebCdpMidsceneTools extends BaseMidsceneTools<PuppeteerAgent> {
11
+ private cdpEndpoint;
12
+ private activeBrowser;
13
+ constructor(cdpEndpoint: string);
14
+ protected createTemporaryDevice(): StaticPage;
15
+ protected ensureAgent(navigateToUrl?: string): Promise<PuppeteerAgent>;
16
+ destroy(): Promise<void>;
17
+ protected preparePlatformTools(): ToolDefinition[];
18
+ }