@midscene/web 1.9.8-beta-20260618091332.0 → 1.10.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 (83) hide show
  1. package/dist/es/{mcp-agent-init-args.mjs → agent-init-args.mjs} +2 -2
  2. package/dist/es/{mcp-agent-init-args.mjs.map → agent-init-args.mjs.map} +1 -1
  3. package/dist/es/{mcp-tools-cdp.mjs → agent-tools-cdp.mjs} +5 -5
  4. package/dist/es/agent-tools-cdp.mjs.map +1 -0
  5. package/dist/es/{mcp-tools-puppeteer.mjs → agent-tools-puppeteer.mjs} +7 -7
  6. package/dist/es/agent-tools-puppeteer.mjs.map +1 -0
  7. package/dist/es/{mcp-tools.mjs → agent-tools.mjs} +4 -4
  8. package/dist/es/agent-tools.mjs.map +1 -0
  9. package/dist/es/bridge-mode/io-client.mjs +1 -1
  10. package/dist/es/bridge-mode/io-server.mjs +2 -2
  11. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  12. package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
  13. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  14. package/dist/es/cdp-proxy-constants.mjs.map +1 -1
  15. package/dist/es/cdp-proxy-manager.mjs +1 -1
  16. package/dist/es/cdp-proxy-manager.mjs.map +1 -1
  17. package/dist/es/cdp-proxy.mjs.map +1 -1
  18. package/dist/es/cdp-target-store.mjs +1 -1
  19. package/dist/es/cdp-target-store.mjs.map +1 -1
  20. package/dist/es/chrome-extension/page.mjs +1 -0
  21. package/dist/es/chrome-extension/page.mjs.map +1 -1
  22. package/dist/es/cli.mjs +4 -4
  23. package/dist/es/cli.mjs.map +1 -1
  24. package/dist/es/index.mjs +2 -2
  25. package/dist/es/playwright/index.mjs +5 -3
  26. package/dist/es/playwright/index.mjs.map +1 -1
  27. package/dist/es/puppeteer/base-page.mjs +24 -38
  28. package/dist/es/puppeteer/base-page.mjs.map +1 -1
  29. package/dist/es/puppeteer/index.mjs +5 -3
  30. package/dist/es/puppeteer/index.mjs.map +1 -1
  31. package/dist/es/web-element.mjs.map +1 -1
  32. package/dist/lib/{mcp-agent-init-args.js → agent-init-args.js} +2 -2
  33. package/dist/lib/{mcp-agent-init-args.js.map → agent-init-args.js.map} +1 -1
  34. package/dist/lib/{mcp-tools-cdp.js → agent-tools-cdp.js} +7 -7
  35. package/dist/lib/agent-tools-cdp.js.map +1 -0
  36. package/dist/lib/{mcp-tools-puppeteer.js → agent-tools-puppeteer.js} +9 -9
  37. package/dist/lib/agent-tools-puppeteer.js.map +1 -0
  38. package/dist/lib/{mcp-tools.js → agent-tools.js} +6 -6
  39. package/dist/lib/agent-tools.js.map +1 -0
  40. package/dist/lib/bridge-mode/io-client.js +1 -1
  41. package/dist/lib/bridge-mode/io-server.js +2 -2
  42. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  43. package/dist/lib/bridge-mode/page-browser-side.js +1 -1
  44. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  45. package/dist/lib/cdp-proxy-constants.js.map +1 -1
  46. package/dist/lib/cdp-proxy-manager.js +1 -1
  47. package/dist/lib/cdp-proxy-manager.js.map +1 -1
  48. package/dist/lib/cdp-proxy.js.map +1 -1
  49. package/dist/lib/cdp-target-store.js +1 -1
  50. package/dist/lib/cdp-target-store.js.map +1 -1
  51. package/dist/lib/chrome-extension/page.js +1 -0
  52. package/dist/lib/chrome-extension/page.js.map +1 -1
  53. package/dist/lib/cli.js +5 -5
  54. package/dist/lib/cli.js.map +1 -1
  55. package/dist/lib/index.js +4 -4
  56. package/dist/lib/playwright/index.js +5 -3
  57. package/dist/lib/playwright/index.js.map +1 -1
  58. package/dist/lib/puppeteer/base-page.js +24 -38
  59. package/dist/lib/puppeteer/base-page.js.map +1 -1
  60. package/dist/lib/puppeteer/index.js +5 -3
  61. package/dist/lib/puppeteer/index.js.map +1 -1
  62. package/dist/lib/web-element.js.map +1 -1
  63. package/dist/types/{mcp-agent-init-args.d.ts → agent-init-args.d.ts} +1 -1
  64. package/dist/types/{mcp-tools-cdp.d.ts → agent-tools-cdp.d.ts} +4 -4
  65. package/dist/types/{mcp-tools-puppeteer.d.ts → agent-tools-puppeteer.d.ts} +4 -4
  66. package/dist/types/{mcp-tools.d.ts → agent-tools.d.ts} +4 -4
  67. package/dist/types/cdp-proxy-manager.d.ts +1 -1
  68. package/dist/types/cdp-proxy.d.ts +1 -1
  69. package/dist/types/index.d.ts +2 -2
  70. package/dist/types/puppeteer/base-page.d.ts +1 -10
  71. package/dist/types/web-element.d.ts +3 -0
  72. package/package.json +4 -9
  73. package/dist/es/mcp-server.mjs +0 -35
  74. package/dist/es/mcp-server.mjs.map +0 -1
  75. package/dist/es/mcp-tools-cdp.mjs.map +0 -1
  76. package/dist/es/mcp-tools-puppeteer.mjs.map +0 -1
  77. package/dist/es/mcp-tools.mjs.map +0 -1
  78. package/dist/lib/mcp-server.js +0 -75
  79. package/dist/lib/mcp-server.js.map +0 -1
  80. package/dist/lib/mcp-tools-cdp.js.map +0 -1
  81. package/dist/lib/mcp-tools-puppeteer.js.map +0 -1
  82. package/dist/lib/mcp-tools.js.map +0 -1
  83. package/dist/types/mcp-server.d.ts +0 -26
package/dist/lib/index.js CHANGED
@@ -31,16 +31,16 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  StaticPage: ()=>external_static_index_js_namespaceObject.StaticPage,
32
32
  PageAgent: ()=>agent_namespaceObject.Agent,
33
33
  webPlaygroundPlatform: ()=>external_platform_js_namespaceObject.webPlaygroundPlatform,
34
- WebCdpMidsceneTools: ()=>external_mcp_tools_cdp_js_namespaceObject.WebCdpMidsceneTools,
35
- WebMidsceneTools: ()=>external_mcp_tools_js_namespaceObject.WebMidsceneTools
34
+ WebCdpMidsceneTools: ()=>external_agent_tools_cdp_js_namespaceObject.WebCdpMidsceneTools,
35
+ WebMidsceneTools: ()=>external_agent_tools_js_namespaceObject.WebMidsceneTools
36
36
  });
37
37
  const index_js_namespaceObject = require("./playwright/index.js");
38
38
  const agent_namespaceObject = require("@midscene/core/agent");
39
39
  const external_puppeteer_index_js_namespaceObject = require("./puppeteer/index.js");
40
40
  const external_static_index_js_namespaceObject = require("./static/index.js");
41
- const external_mcp_tools_js_namespaceObject = require("./mcp-tools.js");
41
+ const external_agent_tools_js_namespaceObject = require("./agent-tools.js");
42
42
  const external_platform_js_namespaceObject = require("./platform.js");
43
- const external_mcp_tools_cdp_js_namespaceObject = require("./mcp-tools-cdp.js");
43
+ const external_agent_tools_cdp_js_namespaceObject = require("./agent-tools-cdp.js");
44
44
  exports.PageAgent = __webpack_exports__.PageAgent;
45
45
  exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
46
46
  exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
@@ -65,11 +65,13 @@ class PlaywrightAgent extends agent_namespaceObject.Agent {
65
65
  if (!page) throw new Error('[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.');
66
66
  const webPage = new external_page_js_namespaceObject.WebPage(page, opts);
67
67
  super(webPage, opts);
68
- const { forceSameTabNavigation = true, forceChromeSelectRendering } = opts ?? {};
68
+ const { forceSameTabNavigation = true, forceChromeSelectRendering = true } = opts ?? {};
69
69
  if (forceSameTabNavigation) (0, base_page_js_namespaceObject.forceClosePopup)(page, debug);
70
70
  if (forceChromeSelectRendering) {
71
- const playwrightVersion = getPlaywrightVersion();
72
- if (playwrightVersion && !external_semver_default().gte(playwrightVersion, '1.52.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`);
71
+ if (opts?.forceChromeSelectRendering === true) {
72
+ const playwrightVersion = getPlaywrightVersion();
73
+ if (playwrightVersion && !external_semver_default().gte(playwrightVersion, '1.52.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`);
74
+ }
73
75
  (0, base_page_js_namespaceObject.forceChromeSelectRendering)(page);
74
76
  }
75
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"playwright/index.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/playwright/index.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 { Agent as PageAgent } from '@midscene/core/agent';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport { WebPage as PlaywrightWebPage } from './page';\n\nexport type {\n PlayWrightAiFixtureType,\n PlaywrightAiFixtureOptions,\n} from './ai-fixture';\nexport { PlaywrightAiFixture } from './ai-fixture';\nexport { overrideAIConfig } from '@midscene/shared/env';\nexport { WebPage as PlaywrightWebPage } from './page';\nexport type { WebPageAgentOpt } from '@/web-element';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport semver from 'semver';\nimport {\n BROWSER_NAVIGATION_ERROR_PATTERN,\n forceChromeSelectRendering as applyChromeSelectRendering,\n forceClosePopup,\n} from '../puppeteer/base-page';\nimport { getWebpackRequire } from '../utils';\n\nconst debug = getDebug('playwright:agent');\n\n/**\n * Get Playwright version from package.json\n */\nfunction getPlaywrightVersion(): string | null {\n try {\n const playwrightPkg = getWebpackRequire()('playwright/package.json');\n return playwrightPkg.version || null;\n } catch (error) {\n console.error('[midscene:error] Failed to get Playwright version', error);\n return null;\n }\n}\n\nexport class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {\n protected isRetryableContextError(error: unknown): boolean {\n return (\n error instanceof Error &&\n BROWSER_NAVIGATION_ERROR_PATTERN.test(error.message)\n );\n }\n\n constructor(page: PlaywrightPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PlaywrightWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation = true, forceChromeSelectRendering } =\n opts ?? {};\n\n if (forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n if (forceChromeSelectRendering) {\n // Check Playwright version requirement (>= 1.52)\n const playwrightVersion = getPlaywrightVersion();\n if (playwrightVersion && !semver.gte(playwrightVersion, '1.52.0')) {\n console.warn(\n `[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`,\n );\n }\n applyChromeSelectRendering(page);\n }\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","getPlaywrightVersion","playwrightPkg","getWebpackRequire","error","console","PlaywrightAgent","PageAgent","Error","BROWSER_NAVIGATION_ERROR_PATTERN","page","opts","webPage","PlaywrightWebPage","forceSameTabNavigation","forceChromeSelectRendering","forceClosePopup","playwrightVersion","semver","applyChromeSelectRendering"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;ACgBA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKvB,SAASC;IACP,IAAI;QACF,MAAMC,gBAAgBC,AAAAA,IAAAA,kCAAAA,iBAAAA,AAAAA,IAAoB;QAC1C,OAAOD,cAAc,OAAO,IAAI;IAClC,EAAE,OAAOE,OAAO;QACdC,QAAQ,KAAK,CAAC,qDAAqDD;QACnE,OAAO;IACT;AACF;AAEO,MAAME,wBAAwBC,sBAAAA,KAASA;IAClC,wBAAwBH,KAAc,EAAW;QACzD,OACEA,iBAAiBI,SACjBC,6BAAAA,gCAAAA,CAAAA,IAAqC,CAACL,MAAM,OAAO;IAEvD;IAEA,YAAYM,IAAoB,EAAEC,IAAsB,CAAE;QACxD,IAAI,CAACD,MACH,MAAM,IAAIF,MACR;QAGJ,MAAMI,UAAU,IAAIC,iCAAAA,OAAiBA,CAACH,MAAMC;QAC5C,KAAK,CAACC,SAASD;QAEf,MAAM,EAAEG,yBAAyB,IAAI,EAAEC,0BAA0B,EAAE,GACjEJ,QAAQ,CAAC;QAEX,IAAIG,wBACFE,AAAAA,IAAAA,6BAAAA,eAAAA,AAAAA,EAAgBN,MAAMX;QAGxB,IAAIgB,4BAA4B;YAE9B,MAAME,oBAAoBhB;YAC1B,IAAIgB,qBAAqB,CAACC,0BAAAA,GAAU,CAACD,mBAAmB,WACtDZ,QAAQ,IAAI,CACV,CAAC,kGAAkG,EAAEY,kBAAkB,sCAAsC,CAAC;YAGlKE,IAAAA,6BAAAA,0BAAAA,AAAAA,EAA2BT;QAC7B;IACF;AACF"}
1
+ {"version":3,"file":"playwright/index.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/playwright/index.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 { Agent as PageAgent } from '@midscene/core/agent';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport { WebPage as PlaywrightWebPage } from './page';\n\nexport type {\n PlayWrightAiFixtureType,\n PlaywrightAiFixtureOptions,\n} from './ai-fixture';\nexport { PlaywrightAiFixture } from './ai-fixture';\nexport { overrideAIConfig } from '@midscene/shared/env';\nexport { WebPage as PlaywrightWebPage } from './page';\nexport type { WebPageAgentOpt } from '@/web-element';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport semver from 'semver';\nimport {\n BROWSER_NAVIGATION_ERROR_PATTERN,\n forceChromeSelectRendering as applyChromeSelectRendering,\n forceClosePopup,\n} from '../puppeteer/base-page';\nimport { getWebpackRequire } from '../utils';\n\nconst debug = getDebug('playwright:agent');\n\n/**\n * Get Playwright version from package.json\n */\nfunction getPlaywrightVersion(): string | null {\n try {\n const playwrightPkg = getWebpackRequire()('playwright/package.json');\n return playwrightPkg.version || null;\n } catch (error) {\n console.error('[midscene:error] Failed to get Playwright version', error);\n return null;\n }\n}\n\nexport class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {\n protected isRetryableContextError(error: unknown): boolean {\n return (\n error instanceof Error &&\n BROWSER_NAVIGATION_ERROR_PATTERN.test(error.message)\n );\n }\n\n constructor(page: PlaywrightPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PlaywrightWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation = true, forceChromeSelectRendering = true } =\n opts ?? {};\n\n if (forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n if (forceChromeSelectRendering) {\n // Only warn about version requirements when the user explicitly opted in;\n // it is on by default, so we should not nag users on older Playwright.\n if (opts?.forceChromeSelectRendering === true) {\n const playwrightVersion = getPlaywrightVersion();\n if (playwrightVersion && !semver.gte(playwrightVersion, '1.52.0')) {\n console.warn(\n `[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`,\n );\n }\n }\n applyChromeSelectRendering(page);\n }\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","getPlaywrightVersion","playwrightPkg","getWebpackRequire","error","console","PlaywrightAgent","PageAgent","Error","BROWSER_NAVIGATION_ERROR_PATTERN","page","opts","webPage","PlaywrightWebPage","forceSameTabNavigation","forceChromeSelectRendering","forceClosePopup","playwrightVersion","semver","applyChromeSelectRendering"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;ACgBA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKvB,SAASC;IACP,IAAI;QACF,MAAMC,gBAAgBC,AAAAA,IAAAA,kCAAAA,iBAAAA,AAAAA,IAAoB;QAC1C,OAAOD,cAAc,OAAO,IAAI;IAClC,EAAE,OAAOE,OAAO;QACdC,QAAQ,KAAK,CAAC,qDAAqDD;QACnE,OAAO;IACT;AACF;AAEO,MAAME,wBAAwBC,sBAAAA,KAASA;IAClC,wBAAwBH,KAAc,EAAW;QACzD,OACEA,iBAAiBI,SACjBC,6BAAAA,gCAAAA,CAAAA,IAAqC,CAACL,MAAM,OAAO;IAEvD;IAEA,YAAYM,IAAoB,EAAEC,IAAsB,CAAE;QACxD,IAAI,CAACD,MACH,MAAM,IAAIF,MACR;QAGJ,MAAMI,UAAU,IAAIC,iCAAAA,OAAiBA,CAACH,MAAMC;QAC5C,KAAK,CAACC,SAASD;QAEf,MAAM,EAAEG,yBAAyB,IAAI,EAAEC,6BAA6B,IAAI,EAAE,GACxEJ,QAAQ,CAAC;QAEX,IAAIG,wBACFE,AAAAA,IAAAA,6BAAAA,eAAAA,AAAAA,EAAgBN,MAAMX;QAGxB,IAAIgB,4BAA4B;YAG9B,IAAIJ,MAAM,+BAA+B,MAAM;gBAC7C,MAAMM,oBAAoBhB;gBAC1B,IAAIgB,qBAAqB,CAACC,0BAAAA,GAAU,CAACD,mBAAmB,WACtDZ,QAAQ,IAAI,CACV,CAAC,kGAAkG,EAAEY,kBAAkB,sCAAsC,CAAC;YAGpK;YACAE,IAAAA,6BAAAA,0BAAAA,AAAAA,EAA2BT;QAC7B;IACF;AACF"}
@@ -211,17 +211,15 @@ class Page {
211
211
  const errorMsg = error instanceof Error ? error.message : String(error);
212
212
  console.warn(`[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`);
213
213
  debugPage('playwright screenshot failed, trying CDP fallback: %s', error);
214
- base64 = await this.screenshotBase64ByPlaywrightCdp(page, imgType, quality);
214
+ base64 = await this.screenshotBase64ByPlaywrightCdp(imgType, quality);
215
215
  }
216
216
  } else throw new Error('Unsupported page type for screenshot');
217
217
  const endTime = Date.now();
218
218
  debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);
219
219
  return base64;
220
220
  }
221
- async screenshotBase64ByPlaywrightCdp(page, imgType, quality) {
222
- const browserName = page.context().browser()?.browserType().name();
223
- if (browserName && 'chromium' !== browserName) throw new Error(`CDP screenshot fallback requires Chromium-based browser, but current browser is "${browserName}".`);
224
- const client = await page.context().newCDPSession(page);
221
+ async screenshotBase64ByPlaywrightCdp(imgType, quality) {
222
+ const client = await this.createPageCdpSession('CDP screenshot fallback');
225
223
  try {
226
224
  const result = await new Promise((resolve, reject)=>{
227
225
  const timeoutId = setTimeout(()=>{
@@ -247,14 +245,18 @@ class Page {
247
245
  });
248
246
  }
249
247
  }
250
- async createScreencastCdpSession() {
248
+ async createPageCdpSession(featureName) {
251
249
  if ('puppeteer' === this.interfaceType) {
252
250
  const page = this.underlyingPage;
253
- return await page.target().createCDPSession();
251
+ const pageWithCdp = page;
252
+ if ('function' == typeof pageWithCdp.createCDPSession) return await pageWithCdp.createCDPSession();
253
+ const target = page.target?.();
254
+ if ('function' == typeof target?.createCDPSession) return await target.createCDPSession();
255
+ throw new Error(`${featureName} requires a browser page with CDP session support.`);
254
256
  }
255
257
  const page = this.underlyingPage;
256
258
  const browserName = page.context().browser()?.browserType().name();
257
- if (browserName && 'chromium' !== browserName) throw new Error(`CDP screencast requires Chromium-based browser, but current browser is "${browserName}".`);
259
+ if (browserName && 'chromium' !== browserName) throw new Error(`${featureName} requires Chromium-based browser, but current browser is "${browserName}".`);
258
260
  return await page.context().newCDPSession(page);
259
261
  }
260
262
  async waitForDomQuiet(opts) {
@@ -339,7 +341,7 @@ class Page {
339
341
  async startMjpegStream(options) {
340
342
  const { signal, onFrame, onError } = options;
341
343
  if ('function' == typeof this.underlyingPage.bringToFront) await this.underlyingPage.bringToFront();
342
- const client = await this.createScreencastCdpSession();
344
+ const client = await this.createPageCdpSession('CDP screencast');
343
345
  let stopped = false;
344
346
  const streamToken = Symbol('mjpeg-stream');
345
347
  const reportStreamError = (error)=>{
@@ -522,16 +524,8 @@ class Page {
522
524
  }
523
525
  };
524
526
  }
525
- async createInputCdpSession() {
526
- if ('puppeteer' === this.interfaceType) {
527
- const page = this.underlyingPage;
528
- return await ('function' == typeof page.createCDPSession ? page.createCDPSession() : page.target().createCDPSession());
529
- }
530
- const page = this.underlyingPage;
531
- return await page.context().newCDPSession(page);
532
- }
533
527
  async selectAllByCdp() {
534
- const client = await this.createInputCdpSession();
528
+ const client = await this.createPageCdpSession('clearInput');
535
529
  try {
536
530
  await client.send('Input.dispatchKeyEvent', {
537
531
  type: 'rawKeyDown',
@@ -560,12 +554,12 @@ class Page {
560
554
  try {
561
555
  await this.selectAllByCdp();
562
556
  await backspace();
563
- debugPage('clearInput end');
564
- return;
565
557
  } catch (error) {
566
- debugPage('clearInput cdp selectAll failed, fallback to shortcut', error);
558
+ debugPage('clearInput cdp selectAll failed', error);
559
+ throw error;
560
+ } finally{
561
+ debugPage('clearInput end');
567
562
  }
568
- debugPage('clearInput end');
569
563
  }
570
564
  async moveToPointBeforeScroll(point) {
571
565
  if (point) await this.mouse.move(point.left, point.top);
@@ -643,7 +637,7 @@ class Page {
643
637
  async stopLoading() {
644
638
  debugPage('stop loading');
645
639
  if ('puppeteer' === this.interfaceType) {
646
- const client = await this.underlyingPage.target().createCDPSession();
640
+ const client = await this.createPageCdpSession('stopLoading');
647
641
  try {
648
642
  await client.send('Page.stopLoading');
649
643
  } finally{
@@ -749,17 +743,7 @@ class Page {
749
743
  const delay = duration / steps;
750
744
  const halfStart = startDistance / 2;
751
745
  const halfEnd = endDistance / 2;
752
- let client;
753
- if ('puppeteer' === this.interfaceType) {
754
- const page = this.underlyingPage;
755
- client = await page.target().createCDPSession();
756
- } else {
757
- if ('playwright' !== this.interfaceType) return;
758
- const page = this.underlyingPage;
759
- const browserName = page.context().browser()?.browserType().name();
760
- if (browserName && 'chromium' !== browserName) throw new Error(`Pinch gesture requires Chromium-based browser, but current browser is "${browserName}". CDP touch events are not supported in Firefox/WebKit.`);
761
- client = await page.context().newCDPSession(page);
762
- }
746
+ const client = await this.createPageCdpSession('Pinch gesture');
763
747
  try {
764
748
  await client.send('Input.dispatchTouchEvent', {
765
749
  type: 'touchStart',
@@ -803,9 +787,9 @@ class Page {
803
787
  await client.detach();
804
788
  }
805
789
  }
806
- async ensurePuppeteerFileChooserSession(page) {
790
+ async ensurePuppeteerFileChooserSession() {
807
791
  if (this.puppeteerFileChooserSession) return this.puppeteerFileChooserSession;
808
- const session = await page.target().createCDPSession();
792
+ const session = await this.createPageCdpSession('Puppeteer file chooser');
809
793
  await session.send('Page.enable');
810
794
  await session.send('DOM.enable');
811
795
  await session.send('Page.setInterceptFileChooserDialog', {
@@ -816,8 +800,7 @@ class Page {
816
800
  }
817
801
  async registerFileChooserListener(handler) {
818
802
  if ('puppeteer' !== this.interfaceType) throw new Error('registerFileChooserListener is only supported in Puppeteer');
819
- const page = this.underlyingPage;
820
- const session = await this.ensurePuppeteerFileChooserSession(page);
803
+ const session = await this.ensurePuppeteerFileChooserSession();
821
804
  if (this.puppeteerFileChooserHandler) session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);
822
805
  let capturedError;
823
806
  this.puppeteerFileChooserHandler = async (event)=>{
@@ -903,7 +886,10 @@ function forceClosePopup(page, debugProfile) {
903
886
  }
904
887
  });
905
888
  }
889
+ const forceSelectRenderingPages = new WeakSet();
906
890
  function forceChromeSelectRendering(page) {
891
+ if (forceSelectRenderingPages.has(page)) return;
892
+ forceSelectRenderingPages.add(page);
907
893
  const styleContent = `
908
894
  /* Add by Midscene because of forceChromeSelectRendering is enabled*/
909
895
  select {
@@ -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 {\n AbstractInterface,\n MjpegStreamHandle,\n MjpegStreamOptions,\n} 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');\nconst warnPage = getDebug('web:page', { console: true });\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\nconst CDP_SCREENCAST_QUALITY = 70;\nconst CDP_SCREENCAST_EVERY_NTH_FRAME = 1;\n// Upper bound for the \"wait for browser repaint\" promise inside\n// flushPendingVisualUpdate so the call does not hang forever if the page\n// stops scheduling animation frames (e.g. backgrounded tab).\nconst FLUSH_VISUAL_UPDATE_TIMEOUT_MS = 50;\nconst DATA_URL_BASE64_PREFIX = /^data:image\\/\\w+;base64,/;\n\ntype ScreencastFrameEvent = {\n data: string;\n sessionId: number;\n};\n\ntype ScreencastCdpSession = {\n send(method: string, params?: Record<string, unknown>): Promise<unknown>;\n detach(): Promise<void>;\n on(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n off?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n removeListener?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n};\n\ntype InputCdpSession = {\n send(method: string, params?: Record<string, unknown>): Promise<unknown>;\n detach(): Promise<void>;\n};\n\nfunction isClosedPageError(error: unknown) {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /target page, context or browser has been closed|page has been closed|target closed|browser has been closed/i.test(\n error.message,\n );\n}\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 keyboardTypeDelay: number | undefined;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n private playwrightNetworkIdleWarningShown = false;\n private activeMjpegStream?: {\n token: symbol;\n onFrame: MjpegStreamOptions['onFrame'];\n onError?: MjpegStreamOptions['onError'];\n };\n private visualUpdateFlushInFlight: Promise<void> | null = null;\n private visualUpdateFlushQueued = false;\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 this.keyboardTypeDelay = opts?.keyboardTypeDelay;\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 if (!this.playwrightNetworkIdleWarningShown) {\n this.playwrightNetworkIdleWarningShown = true;\n warnPage(\n '[midscene:warning] waitForNetworkIdle is skipped for Playwright. Playwright does not provide an equivalent underlying capability for the intended post-action network idle behavior here.',\n );\n }\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' as const;\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 page = this.underlyingPage as PlaywrightPage;\n try {\n const buffer = await page.screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } catch (error) {\n if (isClosedPageError(error) || page.isClosed()) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(\n `[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`,\n );\n debugPage(\n 'playwright screenshot failed, trying CDP fallback: %s',\n error,\n );\n base64 = await this.screenshotBase64ByPlaywrightCdp(\n page,\n imgType,\n quality,\n );\n }\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 private async screenshotBase64ByPlaywrightCdp(\n page: PlaywrightPage,\n imgType: 'jpeg' | 'png',\n quality?: number,\n ) {\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screenshot fallback requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n\n const client = await page.context().newCDPSession(page);\n try {\n const result = (await new Promise<{\n data: string;\n }>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('CDP screenshot timeout after 10000ms.'));\n }, 10 * 1000);\n\n client\n .send('Page.captureScreenshot', {\n format: imgType,\n ...(quality ? { quality } : {}),\n })\n .then(\n (value) => {\n clearTimeout(timeoutId);\n resolve(value as { data: string });\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n );\n })) as {\n data: string;\n };\n return createImgBase64ByFormat(imgType, result.data);\n } finally {\n void client.detach().catch((error) => {\n debugPage('failed to detach CDP screenshot session: %s', error);\n });\n }\n }\n\n private async createScreencastCdpSession(): Promise<ScreencastCdpSession> {\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n return (await page.target().createCDPSession()) as ScreencastCdpSession;\n }\n\n const page = this.underlyingPage as PlaywrightPage;\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screencast requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n return (await page.context().newCDPSession(page)) as ScreencastCdpSession;\n }\n\n async waitForDomQuiet(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void> {\n const quietMs = opts?.quietMs ?? 100;\n const timeoutMs = opts?.timeoutMs ?? 500;\n const targetCenter = opts?.target?.center;\n try {\n await this.evaluate(\n ([q, total, center]: [number, number, [number, number] | undefined]) =>\n new Promise<void>((resolve) => {\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const done = () => {\n obs.disconnect();\n clearTimeout(hardTimer);\n if (settleTimer) clearTimeout(settleTimer);\n resolve();\n };\n const target =\n center && Number.isFinite(center[0]) && Number.isFinite(center[1])\n ? document.elementFromPoint(center[0], center[1])\n : null;\n const observeRoot =\n target?.closest('form') ?? target?.parentElement ?? document.body;\n const obs = new MutationObserver(() => {\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(done, q);\n });\n obs.observe(observeRoot, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n const hardTimer = setTimeout(done, total);\n }),\n [quietMs, timeoutMs, targetCenter],\n );\n } catch (error) {\n debugPage('waitForDomQuiet failed: %s', error);\n }\n }\n\n async flushPendingVisualUpdate(): Promise<void> {\n const activeStream = this.activeMjpegStream;\n if (!activeStream) return;\n\n try {\n await this.evaluate(\n (timeoutMs: number) =>\n new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n resolve();\n };\n setTimeout(finish, timeoutMs);\n requestAnimationFrame(() => requestAnimationFrame(finish));\n }),\n FLUSH_VISUAL_UPDATE_TIMEOUT_MS,\n );\n const dataUrl = await this.screenshotBase64();\n if (this.activeMjpegStream?.token !== activeStream.token) return;\n // MjpegStreamFrame.data is contractually bare base64; screenshotBase64()\n // returns a `data:image/...;base64,...` URL, so strip the prefix here.\n activeStream.onFrame({\n data: dataUrl.replace(DATA_URL_BASE64_PREFIX, ''),\n contentType: 'image/jpeg',\n });\n } catch (error) {\n debugPage('screencast visual refresh failed: %s', error);\n activeStream.onError?.(error);\n }\n }\n\n schedulePendingVisualUpdate(): void {\n if (!this.activeMjpegStream) {\n return;\n }\n\n if (this.visualUpdateFlushInFlight) {\n this.visualUpdateFlushQueued = true;\n return;\n }\n\n const flushTask = (async () => {\n do {\n this.visualUpdateFlushQueued = false;\n await this.flushPendingVisualUpdate();\n } while (this.visualUpdateFlushQueued);\n })()\n .catch((error) => {\n debugPage('scheduled screencast visual refresh failed: %s', error);\n })\n .finally(() => {\n if (this.visualUpdateFlushInFlight === flushTask) {\n this.visualUpdateFlushInFlight = null;\n }\n this.visualUpdateFlushQueued = false;\n });\n\n this.visualUpdateFlushInFlight = flushTask;\n }\n\n async startMjpegStream(\n options: MjpegStreamOptions,\n ): Promise<MjpegStreamHandle> {\n const { signal, onFrame, onError } = options;\n if (typeof this.underlyingPage.bringToFront === 'function') {\n await this.underlyingPage.bringToFront();\n }\n const client = await this.createScreencastCdpSession();\n let stopped = false;\n const streamToken = Symbol('mjpeg-stream');\n\n const reportStreamError = (error: unknown) => {\n try {\n onError?.(error);\n } catch (callbackError) {\n debugPage('mjpeg onError callback threw: %s', callbackError);\n }\n };\n\n const handleFrame = (event: ScreencastFrameEvent) => {\n void (async () => {\n if (stopped) return;\n try {\n onFrame({\n data: event.data,\n contentType: 'image/jpeg',\n });\n } catch (error) {\n reportStreamError(error);\n }\n\n try {\n await client.send('Page.screencastFrameAck', {\n sessionId: event.sessionId,\n });\n } catch (error) {\n if (!stopped) {\n reportStreamError(error);\n }\n }\n })();\n };\n\n const removeFrameListener = () => {\n if (client.off) {\n client.off('Page.screencastFrame', handleFrame);\n } else if (client.removeListener) {\n client.removeListener('Page.screencastFrame', handleFrame);\n }\n };\n\n const stop = async () => {\n if (stopped) return;\n stopped = true;\n if (this.activeMjpegStream?.token === streamToken) {\n this.activeMjpegStream = undefined;\n }\n signal?.removeEventListener('abort', abortHandler);\n removeFrameListener();\n await client.send('Page.stopScreencast').catch((error) => {\n debugPage('Page.stopScreencast failed: %s', error);\n });\n await client.detach().catch((error) => {\n debugPage('CDP screencast session detach failed: %s', error);\n });\n };\n\n const abortHandler = () => {\n void stop();\n };\n\n try {\n client.on('Page.screencastFrame', handleFrame);\n this.activeMjpegStream = {\n token: streamToken,\n onFrame,\n onError,\n };\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n if (signal?.aborted) {\n await stop();\n return { stop };\n }\n\n await client.send('Page.enable');\n try {\n const { width, height } = await this.size();\n await client.send('Emulation.setVisibleSize', { width, height });\n } catch (error) {\n debugPage('CDP screencast visible size sync failed: %s', error);\n }\n await client.send('Page.startScreencast', {\n format: 'jpeg',\n quality: CDP_SCREENCAST_QUALITY,\n everyNthFrame: CDP_SCREENCAST_EVERY_NTH_FRAME,\n });\n\n // CDP screencast only emits a frame when the page's compositor\n // produces one — for an idle page (no animation, post\n // waitForNetworkIdle) that may never happen, leaving freshly\n // attached subscribers staring at a blank canvas. Force-push one\n // manual screenshot so producer.lastFrame is populated before any\n // /mjpeg subscriber connects.\n void this.flushPendingVisualUpdate();\n\n return { stop };\n } catch (error) {\n await stop();\n throw error;\n }\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 const delay = this.keyboardTypeDelay;\n debugPage(\n `keyboard type ${text}${delay !== undefined ? ` (delay: ${delay}ms)` : ''}`,\n );\n return this.underlyingPage.keyboard.type(text, { delay });\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 private async createInputCdpSession(): Promise<InputCdpSession> {\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n return (await (typeof page.createCDPSession === 'function'\n ? page.createCDPSession()\n : page.target().createCDPSession())) as unknown as InputCdpSession;\n }\n\n const page = this.underlyingPage as PlaywrightPage;\n return (await page\n .context()\n .newCDPSession(page)) as unknown as InputCdpSession;\n }\n\n private async selectAllByCdp(): Promise<void> {\n const client = await this.createInputCdpSession();\n try {\n await client.send('Input.dispatchKeyEvent', {\n type: 'rawKeyDown',\n\n commands: ['selectAll'],\n });\n await client.send('Input.dispatchKeyEvent', {\n type: 'keyUp',\n });\n } finally {\n await client.detach().catch(() => undefined);\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 debugPage('clearInput begin');\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n try {\n await this.selectAllByCdp();\n await backspace();\n debugPage('clearInput end');\n return;\n } catch (error) {\n debugPage('clearInput cdp selectAll failed, fallback to shortcut', error);\n }\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 goForward(): Promise<void> {\n debugPage('go forward');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goForward();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goForward();\n } else {\n throw new Error('Unsupported page type for go forward');\n }\n }\n\n async stopLoading(): Promise<void> {\n debugPage('stop loading');\n if (this.interfaceType === 'puppeteer') {\n const client = await (this.underlyingPage as PuppeteerPage)\n .target()\n .createCDPSession();\n try {\n await client.send('Page.stopLoading');\n } finally {\n await client.detach();\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).evaluate(() =>\n window.stop(),\n );\n } else {\n throw new Error('Unsupported page type for stop loading');\n }\n }\n\n async navigationState(): Promise<{ isLoading: boolean }> {\n try {\n const readyState = await this.evaluate(() => document.readyState);\n return { isLoading: readyState !== 'complete' };\n } catch (error) {\n debugPage('failed to query navigation state: %s', error);\n return { isLoading: false };\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 // Keep a lower bound so the press is registered as a long press rather than\n // a click, but never cap the upper bound: the duration is the caller's\n // intent (e.g. \"hold for 6 seconds\").\n const MIN_LONG_PRESS_DURATION = 300;\n if (duration < MIN_LONG_PRESS_DURATION) {\n duration = MIN_LONG_PRESS_DURATION;\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","warnPage","BROWSER_NAVIGATION_ERROR_PATTERN","CDP_SCREENCAST_QUALITY","CDP_SCREENCAST_EVERY_NTH_FRAME","FLUSH_VISUAL_UPDATE_TIMEOUT_MS","DATA_URL_BASE64_PREFIX","isClosedPageError","error","Error","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","page","buffer","errorMsg","String","browserName","client","Promise","resolve","reject","timeoutId","setTimeout","value","clearTimeout","opts","quietMs","timeoutMs","targetCenter","q","total","settleTimer","done","obs","hardTimer","target","Number","document","observeRoot","MutationObserver","activeStream","finish","requestAnimationFrame","dataUrl","flushTask","signal","onFrame","onError","stopped","streamToken","reportStreamError","callbackError","handleFrame","event","removeFrameListener","stop","undefined","abortHandler","width","height","url","x","y","button","count","deltaX","deltaY","from","to","sleep","text","delay","action","keys","Array","k","commands","element","backspace","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","readyState","name","param","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","i","MIN_LONG_PRESS_DURATION","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","currentHalf","session","handler","capturedError","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","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 {\n AbstractInterface,\n MjpegStreamHandle,\n MjpegStreamOptions,\n} 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');\nconst warnPage = getDebug('web:page', { console: true });\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\nconst CDP_SCREENCAST_QUALITY = 70;\nconst CDP_SCREENCAST_EVERY_NTH_FRAME = 1;\n// Upper bound for the \"wait for browser repaint\" promise inside\n// flushPendingVisualUpdate so the call does not hang forever if the page\n// stops scheduling animation frames (e.g. backgrounded tab).\nconst FLUSH_VISUAL_UPDATE_TIMEOUT_MS = 50;\nconst DATA_URL_BASE64_PREFIX = /^data:image\\/\\w+;base64,/;\n\ntype ScreencastFrameEvent = {\n data: string;\n sessionId: number;\n};\n\ntype PageCdpSession = {\n send(method: string, params?: Record<string, unknown>): Promise<unknown>;\n detach(): Promise<void>;\n};\n\ntype ScreencastCdpSession = PageCdpSession & {\n on(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n off?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n removeListener?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n};\n\nfunction isClosedPageError(error: unknown) {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /target page, context or browser has been closed|page has been closed|target closed|browser has been closed/i.test(\n error.message,\n );\n}\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 keyboardTypeDelay: number | undefined;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n private playwrightNetworkIdleWarningShown = false;\n private activeMjpegStream?: {\n token: symbol;\n onFrame: MjpegStreamOptions['onFrame'];\n onError?: MjpegStreamOptions['onError'];\n };\n private visualUpdateFlushInFlight: Promise<void> | null = null;\n private visualUpdateFlushQueued = false;\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 this.keyboardTypeDelay = opts?.keyboardTypeDelay;\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 if (!this.playwrightNetworkIdleWarningShown) {\n this.playwrightNetworkIdleWarningShown = true;\n warnPage(\n '[midscene:warning] waitForNetworkIdle is skipped for Playwright. Playwright does not provide an equivalent underlying capability for the intended post-action network idle behavior here.',\n );\n }\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' as const;\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 page = this.underlyingPage as PlaywrightPage;\n try {\n const buffer = await page.screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } catch (error) {\n if (isClosedPageError(error) || page.isClosed()) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(\n `[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`,\n );\n debugPage(\n 'playwright screenshot failed, trying CDP fallback: %s',\n error,\n );\n base64 = await this.screenshotBase64ByPlaywrightCdp(imgType, quality);\n }\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 private async screenshotBase64ByPlaywrightCdp(\n imgType: 'jpeg' | 'png',\n quality?: number,\n ) {\n const client = await this.createPageCdpSession('CDP screenshot fallback');\n try {\n const result = (await new Promise<{\n data: string;\n }>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('CDP screenshot timeout after 10000ms.'));\n }, 10 * 1000);\n\n client\n .send('Page.captureScreenshot', {\n format: imgType,\n ...(quality ? { quality } : {}),\n })\n .then(\n (value) => {\n clearTimeout(timeoutId);\n resolve(value as { data: string });\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n );\n })) as {\n data: string;\n };\n return createImgBase64ByFormat(imgType, result.data);\n } finally {\n void client.detach().catch((error) => {\n debugPage('failed to detach CDP screenshot session: %s', error);\n });\n }\n }\n\n private async createPageCdpSession(\n featureName: string,\n ): Promise<PageCdpSession> {\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n // Puppeteer has exposed CDP sessions through both page.createCDPSession()\n // and the historical page.target().createCDPSession() API. Support both\n // here so CDP-backed actions work across Puppeteer versions and wrapped\n // page objects that may only expose one of the two shapes.\n const pageWithCdp = page as PuppeteerPage & {\n createCDPSession?: () => Promise<unknown>;\n };\n if (typeof pageWithCdp.createCDPSession === 'function') {\n return (await pageWithCdp.createCDPSession()) as unknown as PageCdpSession;\n }\n\n const target = page.target?.();\n if (typeof target?.createCDPSession === 'function') {\n return (await target.createCDPSession()) as unknown as PageCdpSession;\n }\n\n throw new Error(\n `${featureName} requires a browser page with CDP session support.`,\n );\n }\n\n const page = this.underlyingPage as PlaywrightPage;\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `${featureName} requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n\n return (await page\n .context()\n .newCDPSession(page)) as unknown as PageCdpSession;\n }\n\n async waitForDomQuiet(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void> {\n const quietMs = opts?.quietMs ?? 100;\n const timeoutMs = opts?.timeoutMs ?? 500;\n const targetCenter = opts?.target?.center;\n try {\n await this.evaluate(\n ([q, total, center]: [number, number, [number, number] | undefined]) =>\n new Promise<void>((resolve) => {\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const done = () => {\n obs.disconnect();\n clearTimeout(hardTimer);\n if (settleTimer) clearTimeout(settleTimer);\n resolve();\n };\n const target =\n center && Number.isFinite(center[0]) && Number.isFinite(center[1])\n ? document.elementFromPoint(center[0], center[1])\n : null;\n const observeRoot =\n target?.closest('form') ?? target?.parentElement ?? document.body;\n const obs = new MutationObserver(() => {\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(done, q);\n });\n obs.observe(observeRoot, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n const hardTimer = setTimeout(done, total);\n }),\n [quietMs, timeoutMs, targetCenter],\n );\n } catch (error) {\n debugPage('waitForDomQuiet failed: %s', error);\n }\n }\n\n async flushPendingVisualUpdate(): Promise<void> {\n const activeStream = this.activeMjpegStream;\n if (!activeStream) return;\n\n try {\n await this.evaluate(\n (timeoutMs: number) =>\n new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n resolve();\n };\n setTimeout(finish, timeoutMs);\n requestAnimationFrame(() => requestAnimationFrame(finish));\n }),\n FLUSH_VISUAL_UPDATE_TIMEOUT_MS,\n );\n const dataUrl = await this.screenshotBase64();\n if (this.activeMjpegStream?.token !== activeStream.token) return;\n // MjpegStreamFrame.data is contractually bare base64; screenshotBase64()\n // returns a `data:image/...;base64,...` URL, so strip the prefix here.\n activeStream.onFrame({\n data: dataUrl.replace(DATA_URL_BASE64_PREFIX, ''),\n contentType: 'image/jpeg',\n });\n } catch (error) {\n debugPage('screencast visual refresh failed: %s', error);\n activeStream.onError?.(error);\n }\n }\n\n schedulePendingVisualUpdate(): void {\n if (!this.activeMjpegStream) {\n return;\n }\n\n if (this.visualUpdateFlushInFlight) {\n this.visualUpdateFlushQueued = true;\n return;\n }\n\n const flushTask = (async () => {\n do {\n this.visualUpdateFlushQueued = false;\n await this.flushPendingVisualUpdate();\n } while (this.visualUpdateFlushQueued);\n })()\n .catch((error) => {\n debugPage('scheduled screencast visual refresh failed: %s', error);\n })\n .finally(() => {\n if (this.visualUpdateFlushInFlight === flushTask) {\n this.visualUpdateFlushInFlight = null;\n }\n this.visualUpdateFlushQueued = false;\n });\n\n this.visualUpdateFlushInFlight = flushTask;\n }\n\n async startMjpegStream(\n options: MjpegStreamOptions,\n ): Promise<MjpegStreamHandle> {\n const { signal, onFrame, onError } = options;\n if (typeof this.underlyingPage.bringToFront === 'function') {\n await this.underlyingPage.bringToFront();\n }\n const client = (await this.createPageCdpSession(\n 'CDP screencast',\n )) as ScreencastCdpSession;\n let stopped = false;\n const streamToken = Symbol('mjpeg-stream');\n\n const reportStreamError = (error: unknown) => {\n try {\n onError?.(error);\n } catch (callbackError) {\n debugPage('mjpeg onError callback threw: %s', callbackError);\n }\n };\n\n const handleFrame = (event: ScreencastFrameEvent) => {\n void (async () => {\n if (stopped) return;\n try {\n onFrame({\n data: event.data,\n contentType: 'image/jpeg',\n });\n } catch (error) {\n reportStreamError(error);\n }\n\n try {\n await client.send('Page.screencastFrameAck', {\n sessionId: event.sessionId,\n });\n } catch (error) {\n if (!stopped) {\n reportStreamError(error);\n }\n }\n })();\n };\n\n const removeFrameListener = () => {\n if (client.off) {\n client.off('Page.screencastFrame', handleFrame);\n } else if (client.removeListener) {\n client.removeListener('Page.screencastFrame', handleFrame);\n }\n };\n\n const stop = async () => {\n if (stopped) return;\n stopped = true;\n if (this.activeMjpegStream?.token === streamToken) {\n this.activeMjpegStream = undefined;\n }\n signal?.removeEventListener('abort', abortHandler);\n removeFrameListener();\n await client.send('Page.stopScreencast').catch((error) => {\n debugPage('Page.stopScreencast failed: %s', error);\n });\n await client.detach().catch((error) => {\n debugPage('CDP screencast session detach failed: %s', error);\n });\n };\n\n const abortHandler = () => {\n void stop();\n };\n\n try {\n client.on('Page.screencastFrame', handleFrame);\n this.activeMjpegStream = {\n token: streamToken,\n onFrame,\n onError,\n };\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n if (signal?.aborted) {\n await stop();\n return { stop };\n }\n\n await client.send('Page.enable');\n try {\n const { width, height } = await this.size();\n await client.send('Emulation.setVisibleSize', { width, height });\n } catch (error) {\n debugPage('CDP screencast visible size sync failed: %s', error);\n }\n await client.send('Page.startScreencast', {\n format: 'jpeg',\n quality: CDP_SCREENCAST_QUALITY,\n everyNthFrame: CDP_SCREENCAST_EVERY_NTH_FRAME,\n });\n\n // CDP screencast only emits a frame when the page's compositor\n // produces one — for an idle page (no animation, post\n // waitForNetworkIdle) that may never happen, leaving freshly\n // attached subscribers staring at a blank canvas. Force-push one\n // manual screenshot so producer.lastFrame is populated before any\n // /mjpeg subscriber connects.\n void this.flushPendingVisualUpdate();\n\n return { stop };\n } catch (error) {\n await stop();\n throw error;\n }\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 const delay = this.keyboardTypeDelay;\n debugPage(\n `keyboard type ${text}${delay !== undefined ? ` (delay: ${delay}ms)` : ''}`,\n );\n return this.underlyingPage.keyboard.type(text, { delay });\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 private async selectAllByCdp(): Promise<void> {\n const client = await this.createPageCdpSession('clearInput');\n try {\n // Use the browser editing command instead of Modifier+A. Playwright's\n // Chromium input layer derives the browser platform from\n // Browser.getVersion().userAgent, while Modifier+A shortcuts are often\n // chosen from local process.platform. If a Linux browser is launched with\n // a macOS browser-level UA, Chromium treats select-all as Cmd+A instead\n // of Ctrl+A, so the local-platform shortcut can fail.\n await client.send('Input.dispatchKeyEvent', {\n type: 'rawKeyDown',\n\n commands: ['selectAll'],\n });\n await client.send('Input.dispatchKeyEvent', {\n type: 'keyUp',\n });\n } finally {\n await client.detach().catch(() => undefined);\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 debugPage('clearInput begin');\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n try {\n await this.selectAllByCdp();\n await backspace();\n } catch (error) {\n debugPage('clearInput cdp selectAll failed', error);\n throw error;\n } finally {\n debugPage('clearInput end');\n }\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 goForward(): Promise<void> {\n debugPage('go forward');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goForward();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goForward();\n } else {\n throw new Error('Unsupported page type for go forward');\n }\n }\n\n async stopLoading(): Promise<void> {\n debugPage('stop loading');\n if (this.interfaceType === 'puppeteer') {\n const client = await this.createPageCdpSession('stopLoading');\n try {\n await client.send('Page.stopLoading');\n } finally {\n await client.detach();\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).evaluate(() =>\n window.stop(),\n );\n } else {\n throw new Error('Unsupported page type for stop loading');\n }\n }\n\n async navigationState(): Promise<{ isLoading: boolean }> {\n try {\n const readyState = await this.evaluate(() => document.readyState);\n return { isLoading: readyState !== 'complete' };\n } catch (error) {\n debugPage('failed to query navigation state: %s', error);\n return { isLoading: false };\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 // Keep a lower bound so the press is registered as a long press rather than\n // a click, but never cap the upper bound: the duration is the caller's\n // intent (e.g. \"hold for 6 seconds\").\n const MIN_LONG_PRESS_DURATION = 300;\n if (duration < MIN_LONG_PRESS_DURATION) {\n duration = MIN_LONG_PRESS_DURATION;\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 const client = (await this.createPageCdpSession(\n 'Pinch gesture',\n )) as TouchClient;\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(): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = (await this.createPageCdpSession(\n 'Puppeteer file chooser',\n )) as unknown as CDPSession;\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 session = await this.ensurePuppeteerFileChooserSession();\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 */\n// Track pages that already have the select-rendering style wired up so the\n// immediate injection and the `load` listener are only registered once per page,\n// even if multiple agents are created for the same page.\nconst forceSelectRenderingPages = new WeakSet<object>();\n\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Only inject once per page to avoid stacking duplicate `load` listeners.\n if (forceSelectRenderingPages.has(page)) {\n return;\n }\n forceSelectRenderingPages.add(page);\n\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","warnPage","BROWSER_NAVIGATION_ERROR_PATTERN","CDP_SCREENCAST_QUALITY","CDP_SCREENCAST_EVERY_NTH_FRAME","FLUSH_VISUAL_UPDATE_TIMEOUT_MS","DATA_URL_BASE64_PREFIX","isClosedPageError","error","Error","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","page","buffer","errorMsg","String","client","Promise","resolve","reject","timeoutId","setTimeout","value","clearTimeout","featureName","pageWithCdp","target","browserName","opts","quietMs","timeoutMs","targetCenter","q","total","settleTimer","done","obs","hardTimer","Number","document","observeRoot","MutationObserver","activeStream","finish","requestAnimationFrame","dataUrl","flushTask","signal","onFrame","onError","stopped","streamToken","reportStreamError","callbackError","handleFrame","event","removeFrameListener","stop","undefined","abortHandler","width","height","url","x","y","button","count","deltaX","deltaY","from","to","sleep","text","delay","action","keys","Array","k","commands","element","backspace","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","readyState","name","param","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","i","MIN_LONG_PRESS_DURATION","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","currentHalf","session","handler","capturedError","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceSelectRenderingPages","WeakSet","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","style","err"],"mappings":"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"}
@@ -63,11 +63,13 @@ class PuppeteerAgent extends agent_namespaceObject.Agent {
63
63
  if (!page) throw new Error('[midscene] PuppeteerAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.');
64
64
  const webPage = new external_page_js_namespaceObject.PuppeteerWebPage(page, opts);
65
65
  super(webPage, opts);
66
- const { forceSameTabNavigation = true, forceChromeSelectRendering } = opts ?? {};
66
+ const { forceSameTabNavigation = true, forceChromeSelectRendering = true } = opts ?? {};
67
67
  if (forceSameTabNavigation) (0, external_base_page_js_namespaceObject.forceClosePopup)(page, debug);
68
68
  if (forceChromeSelectRendering) {
69
- const puppeteerVersion = getPuppeteerVersion();
70
- if (puppeteerVersion && !external_semver_default().gte(puppeteerVersion, '24.6.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Puppeteer > 24.6.0, but current version is ${puppeteerVersion}. This feature may not work correctly.`);
69
+ if (opts?.forceChromeSelectRendering === true) {
70
+ const puppeteerVersion = getPuppeteerVersion();
71
+ if (puppeteerVersion && !external_semver_default().gte(puppeteerVersion, '24.6.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Puppeteer > 24.6.0, but current version is ${puppeteerVersion}. This feature may not work correctly.`);
72
+ }
71
73
  (0, external_base_page_js_namespaceObject.forceChromeSelectRendering)(page);
72
74
  }
73
75
  }