@rpascene/web 0.30.8

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 (135) hide show
  1. package/README.md +9 -0
  2. package/bin/midscene-playground +3 -0
  3. package/dist/es/bin.mjs +26 -0
  4. package/dist/es/bin.mjs.map +1 -0
  5. package/dist/es/bridge-mode/agent-cli-side.mjs +117 -0
  6. package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
  7. package/dist/es/bridge-mode/browser.mjs +2 -0
  8. package/dist/es/bridge-mode/common.mjs +37 -0
  9. package/dist/es/bridge-mode/common.mjs.map +1 -0
  10. package/dist/es/bridge-mode/index.mjs +4 -0
  11. package/dist/es/bridge-mode/io-client.mjs +101 -0
  12. package/dist/es/bridge-mode/io-client.mjs.map +1 -0
  13. package/dist/es/bridge-mode/io-server.mjs +208 -0
  14. package/dist/es/bridge-mode/io-server.mjs.map +1 -0
  15. package/dist/es/bridge-mode/page-browser-side.mjs +103 -0
  16. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
  17. package/dist/es/chrome-extension/agent.mjs +9 -0
  18. package/dist/es/chrome-extension/agent.mjs.map +1 -0
  19. package/dist/es/chrome-extension/cdpInput.mjs +174 -0
  20. package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
  21. package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
  22. package/dist/es/chrome-extension/dynamic-scripts.mjs +37 -0
  23. package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
  24. package/dist/es/chrome-extension/index.mjs +5 -0
  25. package/dist/es/chrome-extension/page.mjs +633 -0
  26. package/dist/es/chrome-extension/page.mjs.map +1 -0
  27. package/dist/es/index.mjs +6 -0
  28. package/dist/es/playwright/ai-fixture.mjs +325 -0
  29. package/dist/es/playwright/ai-fixture.mjs.map +1 -0
  30. package/dist/es/playwright/index.mjs +23 -0
  31. package/dist/es/playwright/index.mjs.map +1 -0
  32. package/dist/es/playwright/page.mjs +9 -0
  33. package/dist/es/playwright/page.mjs.map +1 -0
  34. package/dist/es/playwright/reporter/index.mjs +90 -0
  35. package/dist/es/playwright/reporter/index.mjs.map +1 -0
  36. package/dist/es/puppeteer/agent-launcher.mjs +132 -0
  37. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
  38. package/dist/es/puppeteer/base-page.mjs +491 -0
  39. package/dist/es/puppeteer/base-page.mjs.map +1 -0
  40. package/dist/es/puppeteer/index.mjs +17 -0
  41. package/dist/es/puppeteer/index.mjs.map +1 -0
  42. package/dist/es/puppeteer/page.mjs +9 -0
  43. package/dist/es/puppeteer/page.mjs.map +1 -0
  44. package/dist/es/static/index.mjs +3 -0
  45. package/dist/es/static/static-agent.mjs +10 -0
  46. package/dist/es/static/static-agent.mjs.map +1 -0
  47. package/dist/es/static/static-page.mjs +132 -0
  48. package/dist/es/static/static-page.mjs.map +1 -0
  49. package/dist/es/web-element.mjs +96 -0
  50. package/dist/es/web-element.mjs.map +1 -0
  51. package/dist/es/web-page.mjs +206 -0
  52. package/dist/es/web-page.mjs.map +1 -0
  53. package/dist/lib/bin.js +54 -0
  54. package/dist/lib/bin.js.map +1 -0
  55. package/dist/lib/bridge-mode/agent-cli-side.js +154 -0
  56. package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
  57. package/dist/lib/bridge-mode/browser.js +38 -0
  58. package/dist/lib/bridge-mode/browser.js.map +1 -0
  59. package/dist/lib/bridge-mode/common.js +95 -0
  60. package/dist/lib/bridge-mode/common.js.map +1 -0
  61. package/dist/lib/bridge-mode/index.js +46 -0
  62. package/dist/lib/bridge-mode/index.js.map +1 -0
  63. package/dist/lib/bridge-mode/io-client.js +135 -0
  64. package/dist/lib/bridge-mode/io-client.js.map +1 -0
  65. package/dist/lib/bridge-mode/io-server.js +245 -0
  66. package/dist/lib/bridge-mode/io-server.js.map +1 -0
  67. package/dist/lib/bridge-mode/page-browser-side.js +147 -0
  68. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
  69. package/dist/lib/chrome-extension/agent.js +43 -0
  70. package/dist/lib/chrome-extension/agent.js.map +1 -0
  71. package/dist/lib/chrome-extension/cdpInput.js +208 -0
  72. package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
  73. package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
  74. package/dist/lib/chrome-extension/dynamic-scripts.js +77 -0
  75. package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
  76. package/dist/lib/chrome-extension/index.js +60 -0
  77. package/dist/lib/chrome-extension/index.js.map +1 -0
  78. package/dist/lib/chrome-extension/page.js +667 -0
  79. package/dist/lib/chrome-extension/page.js.map +1 -0
  80. package/dist/lib/index.js +60 -0
  81. package/dist/lib/index.js.map +1 -0
  82. package/dist/lib/playwright/ai-fixture.js +362 -0
  83. package/dist/lib/playwright/ai-fixture.js.map +1 -0
  84. package/dist/lib/playwright/index.js +66 -0
  85. package/dist/lib/playwright/index.js.map +1 -0
  86. package/dist/lib/playwright/page.js +43 -0
  87. package/dist/lib/playwright/page.js.map +1 -0
  88. package/dist/lib/playwright/reporter/index.js +124 -0
  89. package/dist/lib/playwright/reporter/index.js.map +1 -0
  90. package/dist/lib/puppeteer/agent-launcher.js +194 -0
  91. package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
  92. package/dist/lib/puppeteer/base-page.js +531 -0
  93. package/dist/lib/puppeteer/base-page.js.map +1 -0
  94. package/dist/lib/puppeteer/index.js +57 -0
  95. package/dist/lib/puppeteer/index.js.map +1 -0
  96. package/dist/lib/puppeteer/page.js +43 -0
  97. package/dist/lib/puppeteer/page.js.map +1 -0
  98. package/dist/lib/static/index.js +52 -0
  99. package/dist/lib/static/index.js.map +1 -0
  100. package/dist/lib/static/static-agent.js +44 -0
  101. package/dist/lib/static/static-agent.js.map +1 -0
  102. package/dist/lib/static/static-page.js +166 -0
  103. package/dist/lib/static/static-page.js.map +1 -0
  104. package/dist/lib/web-element.js +136 -0
  105. package/dist/lib/web-element.js.map +1 -0
  106. package/dist/lib/web-page.js +256 -0
  107. package/dist/lib/web-page.js.map +1 -0
  108. package/dist/types/bin.d.ts +1 -0
  109. package/dist/types/bridge-mode/agent-cli-side.d.ts +32 -0
  110. package/dist/types/bridge-mode/browser.d.ts +2 -0
  111. package/dist/types/bridge-mode/common.d.ts +60 -0
  112. package/dist/types/bridge-mode/index.d.ts +4 -0
  113. package/dist/types/bridge-mode/io-client.d.ts +10 -0
  114. package/dist/types/bridge-mode/io-server.d.ts +26 -0
  115. package/dist/types/bridge-mode/page-browser-side.d.ts +18 -0
  116. package/dist/types/chrome-extension/agent.d.ts +5 -0
  117. package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
  118. package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
  119. package/dist/types/chrome-extension/index.d.ts +5 -0
  120. package/dist/types/chrome-extension/page.d.ts +95 -0
  121. package/dist/types/index.d.ts +9 -0
  122. package/dist/types/playwright/ai-fixture.d.ts +117 -0
  123. package/dist/types/playwright/index.d.ts +12 -0
  124. package/dist/types/playwright/page.d.ts +6 -0
  125. package/dist/types/playwright/reporter/index.d.ts +18 -0
  126. package/dist/types/puppeteer/agent-launcher.d.ts +29 -0
  127. package/dist/types/puppeteer/base-page.d.ts +90 -0
  128. package/dist/types/puppeteer/index.d.ts +9 -0
  129. package/dist/types/puppeteer/page.d.ts +6 -0
  130. package/dist/types/static/index.d.ts +2 -0
  131. package/dist/types/static/static-agent.d.ts +5 -0
  132. package/dist/types/static/static-page.d.ts +52 -0
  133. package/dist/types/web-element.d.ts +51 -0
  134. package/dist/types/web-page.d.ts +59 -0
  135. package/package.json +164 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer\\base-page.mjs","sources":["webpack://@rpascene/web/./src/puppeteer/base-page.ts"],"sourcesContent":["import { type WebPageAgentOpt, WebPageContextParser } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n UIContext,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { sleep } from '@rpascene/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 '@rpascene/shared/constants';\nimport type { ElementInfo } from '@rpascene/shared/extractor';\nimport { treeToList } from '@rpascene/shared/extractor';\nimport { createImgBase64ByFormat } from '@rpascene/shared/img';\nimport { type DebugFunction, getDebug } from '@rpascene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@rpascene/shared/node';\nimport { assert } from '@rpascene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\ntype WebElementCacheFeature = ElementCacheFeature & {\n xpaths?: string[];\n};\n\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\n if (!Array.isArray(xpaths)) {\n return [];\n }\n\n return xpaths.filter(\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\n );\n};\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface {\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\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(this);\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 }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation() {\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('waitForNavigation begin');\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\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 '[rpascene:warning] Waiting for the \"navigation\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.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(): 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 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 '[rpascene:warning] Waiting for the \"network idle\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n } else {\n // TODO: implement playwright waitForNetworkIdle\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation();\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n async getXpathsById(id: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\n );\n }\n\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForRect(\n rect: Rect,\n opt?: { _orderSensitive: boolean },\n ): Promise<ElementCacheFeature> {\n const center: Point = {\n left: Math.floor(rect.left + rect.width / 2),\n top: Math.floor(rect.top + rect.height / 2),\n };\n\n try {\n const orderSensitive = opt?._orderSensitive ?? false;\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\n }\n return {\n xpaths: sanitized,\n };\n } catch (error) {\n debugPage('cacheFeatureForRect failed: %s', error);\n return {\n xpaths: [],\n };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const webFeature = feature as WebElementCacheFeature;\n const xpaths = sanitizeXpaths(webFeature.xpaths);\n\n for (const xpath of xpaths) {\n try {\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n const matchedRect: Rect = {\n left: elementInfo.rect.left,\n top: elementInfo.rect.top,\n width: elementInfo.rect.width,\n height: elementInfo.rect.height,\n };\n\n if (this.viewportSize?.dpr) {\n matchedRect.dpr = this.viewportSize.dpr;\n }\n\n return matchedRect;\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',\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();\n\n // 先注入脚本\n const scriptContent = getElementInfosScriptContent()\n const frames = (this.underlyingPage as PuppeteerPage).frames();\n for (let frame of frames) {\n await frame.evaluate(scriptContent);\n }\n\n // 执行脚本\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: any = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\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: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg';\n const quality = 90;\n await this.waitForNavigation();\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else {\n if (this.interfaceType === 'puppeteer') {\n if (button === 'left' && count === 1) {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\n } else {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\n button,\n count,\n });\n }\n } else if (this.interfaceType === 'playwright') {\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\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 await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {\n if (!element) {\n console.warn('No element to clear input');\n return;\n }\n\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n });\n await backspace();\n }\n\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\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([this.waitForNavigation(), this.waitForNetworkIdle()]);\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> { }\n\n async getContext(): Promise<UIContext> {\n return await WebPageContextParser(this, {});\n }\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n}\n\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"],"names":["debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","id","elementInfosScriptContent","getElementInfosScriptContent","JSON","point","isOrderSensitive","rect","opt","center","Math","orderSensitive","sanitized","feature","webFeature","elementInfo","_this_viewportSize","matchedRect","Error","scriptContent","frames","frame","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","options","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","key","element","backspace","isMac","process","size","targetX","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","page","steps","delay","i","resolve","setTimeout","res","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Agent } from "@rpascene/core/agent";
2
+ import { getDebug } from "@rpascene/shared/logger";
3
+ import { forceClosePopup } from "./base-page.mjs";
4
+ import { PuppeteerWebPage } from "./page.mjs";
5
+ import { overrideAIConfig } from "@rpascene/shared/env";
6
+ const debug = getDebug('puppeteer:agent');
7
+ class PuppeteerAgent extends Agent {
8
+ constructor(page, opts){
9
+ const webPage = new PuppeteerWebPage(page, opts);
10
+ super(webPage, opts);
11
+ const { forceSameTabNavigation = true } = opts ?? {};
12
+ if (forceSameTabNavigation) forceClosePopup(page, debug);
13
+ }
14
+ }
15
+ export { PuppeteerAgent, PuppeteerWebPage, overrideAIConfig };
16
+
17
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer\\index.mjs","sources":["webpack://@rpascene/web/./src/puppeteer/index.ts"],"sourcesContent":["import type { WebPageAgentOpt } from '@/web-element';\nimport { Agent as PageAgent } from '@rpascene/core/agent';\nimport { getDebug } from '@rpascene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport { PuppeteerWebPage } from './page';\n\nexport class PuppeteerAgent extends PageAgent<PuppeteerWebPage> {\n constructor(page: PuppeteerPage, opts?: WebPageAgentOpt) {\n const webPage = new PuppeteerWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation = true } = opts ?? {};\n\n if (forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n }\n}\n\nexport { overrideAIConfig } from '@rpascene/shared/env';\n\n// Do NOT export this since it requires puppeteer\n// export { puppeteerAgentForTarget } from './agent-launcher';\n"],"names":["debug","getDebug","PuppeteerAgent","PageAgent","page","opts","webPage","PuppeteerWebPage","forceSameTabNavigation","forceClosePopup"],"mappings":";;;;;AAOA,MAAMA,QAAQC,SAAS;AAIhB,MAAMC,uBAAuBC;IAClC,YAAYC,IAAmB,EAAEC,IAAsB,CAAE;QACvD,MAAMC,UAAU,IAAIC,iBAAiBH,MAAMC;QAC3C,KAAK,CAACC,SAASD;QAEf,MAAM,EAAEG,yBAAyB,IAAI,EAAE,GAAGH,QAAQ,CAAC;QAEnD,IAAIG,wBACFC,gBAAgBL,MAAMJ;IAE1B;AACF"}
@@ -0,0 +1,9 @@
1
+ import { Page } from "./base-page.mjs";
2
+ class PuppeteerWebPage extends Page {
3
+ constructor(page, opts){
4
+ super(page, 'puppeteer', opts);
5
+ }
6
+ }
7
+ export { PuppeteerWebPage };
8
+
9
+ //# sourceMappingURL=page.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer\\page.mjs","sources":["webpack://@rpascene/web/./src/puppeteer/page.ts"],"sourcesContent":["import type { WebPageOpt } from '@/web-element';\nimport type { Page as PuppeteerPageType } from 'puppeteer';\nimport { Page as BasePage } from './base-page';\n\nexport class PuppeteerWebPage extends BasePage<'puppeteer', PuppeteerPageType> {\n constructor(page: PuppeteerPageType, opts?: WebPageOpt) {\n super(page, 'puppeteer', opts);\n }\n}\n"],"names":["PuppeteerWebPage","BasePage","page","opts"],"mappings":";AAIO,MAAMA,yBAAyBC;IACpC,YAAYC,IAAuB,EAAEC,IAAiB,CAAE;QACtD,KAAK,CAACD,MAAM,aAAaC;IAC3B;AACF"}
@@ -0,0 +1,3 @@
1
+ import { StaticPageAgent } from "./static-agent.mjs";
2
+ import static_page from "./static-page.mjs";
3
+ export { static_page as StaticPage, StaticPageAgent };
@@ -0,0 +1,10 @@
1
+ import { Agent } from "@rpascene/core/agent";
2
+ class StaticPageAgent extends Agent {
3
+ constructor(page){
4
+ super(page, {});
5
+ this.dryMode = true;
6
+ }
7
+ }
8
+ export { StaticPageAgent };
9
+
10
+ //# sourceMappingURL=static-agent.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static\\static-agent.mjs","sources":["webpack://@rpascene/web/./src/static/static-agent.ts"],"sourcesContent":["import { Agent as PageAgent } from '@rpascene/core/agent';\nimport type StaticPage from './static-page';\n\nexport class StaticPageAgent extends PageAgent {\n constructor(page: StaticPage) {\n super(page, {});\n this.dryMode = true;\n }\n}\n"],"names":["StaticPageAgent","PageAgent","page"],"mappings":";AAGO,MAAMA,wBAAwBC;IACnC,YAAYC,IAAgB,CAAE;QAC5B,KAAK,CAACA,MAAM,CAAC;QACb,IAAI,CAAC,OAAO,GAAG;IACjB;AACF"}
@@ -0,0 +1,132 @@
1
+ import { defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionRightClick, defineActionScroll, defineActionTap } from "@rpascene/core/device";
2
+ import { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from "@rpascene/shared/common";
3
+ function _define_property(obj, key, value) {
4
+ if (key in obj) Object.defineProperty(obj, key, {
5
+ value: value,
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true
9
+ });
10
+ else obj[key] = value;
11
+ return obj;
12
+ }
13
+ const ThrowNotImplemented = (methodName)=>{
14
+ throw new Error(`The method "${methodName}" is not implemented as designed since this is a static UI context. (${ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED})`);
15
+ };
16
+ class StaticPage {
17
+ actionSpace() {
18
+ return [
19
+ defineActionTap(async (param)=>{
20
+ ThrowNotImplemented('Tap');
21
+ }),
22
+ defineActionRightClick(async (param)=>{
23
+ ThrowNotImplemented('RightClick');
24
+ }),
25
+ defineActionHover(async (param)=>{
26
+ ThrowNotImplemented('Hover');
27
+ }),
28
+ defineActionInput(async (param)=>{
29
+ ThrowNotImplemented('Input');
30
+ }),
31
+ defineActionKeyboardPress(async (param)=>{
32
+ ThrowNotImplemented('KeyboardPress');
33
+ }),
34
+ defineActionScroll(async (param)=>{
35
+ ThrowNotImplemented('Scroll');
36
+ }),
37
+ defineActionDragAndDrop(async (param)=>{
38
+ ThrowNotImplemented('DragAndDrop');
39
+ })
40
+ ];
41
+ }
42
+ async evaluateJavaScript(script) {
43
+ return ThrowNotImplemented('evaluateJavaScript');
44
+ }
45
+ async getElementsInfo() {
46
+ return ThrowNotImplemented('getElementsInfo');
47
+ }
48
+ async getElementsNodeTree() {
49
+ return ThrowNotImplemented('getElementsNodeTree');
50
+ }
51
+ async getXpathsById(id) {
52
+ return ThrowNotImplemented('getXpathsById');
53
+ }
54
+ async getXpathsByPoint(point) {
55
+ return ThrowNotImplemented('getXpathsByPoint');
56
+ }
57
+ async getElementInfoByXpath(xpath) {
58
+ return ThrowNotImplemented('getElementInfoByXpath');
59
+ }
60
+ async size() {
61
+ return {
62
+ ...this.uiContext.size,
63
+ dpr: this.uiContext.size.dpr || 1
64
+ };
65
+ }
66
+ async screenshotBase64() {
67
+ const base64 = this.uiContext.screenshotBase64;
68
+ if (!base64) throw new Error('screenshot base64 is empty');
69
+ return base64;
70
+ }
71
+ async url() {
72
+ return Promise.resolve('https://static_page_without_url');
73
+ }
74
+ async scrollUntilTop(startingPoint) {
75
+ return ThrowNotImplemented('scrollUntilTop');
76
+ }
77
+ async scrollUntilBottom(startingPoint) {
78
+ return ThrowNotImplemented('scrollUntilBottom');
79
+ }
80
+ async scrollUntilLeft(startingPoint) {
81
+ return ThrowNotImplemented('scrollUntilLeft');
82
+ }
83
+ async scrollUntilRight(startingPoint) {
84
+ return ThrowNotImplemented('scrollUntilRight');
85
+ }
86
+ async scrollUp(distance, startingPoint) {
87
+ return ThrowNotImplemented('scrollUp');
88
+ }
89
+ async scrollDown(distance, startingPoint) {
90
+ return ThrowNotImplemented('scrollDown');
91
+ }
92
+ async scrollLeft(distance, startingPoint) {
93
+ return ThrowNotImplemented('scrollLeft');
94
+ }
95
+ async scrollRight(distance, startingPoint) {
96
+ return ThrowNotImplemented('scrollRight');
97
+ }
98
+ async clearInput() {
99
+ return ThrowNotImplemented('clearInput');
100
+ }
101
+ async destroy() {}
102
+ async getContext() {
103
+ return this.uiContext;
104
+ }
105
+ updateContext(newContext) {
106
+ this.uiContext = newContext;
107
+ }
108
+ constructor(uiContext){
109
+ _define_property(this, "interfaceType", 'static');
110
+ _define_property(this, "uiContext", void 0);
111
+ _define_property(this, "mouse", {
112
+ click: ThrowNotImplemented.bind(null, 'mouse.click'),
113
+ wheel: ThrowNotImplemented.bind(null, 'mouse.wheel'),
114
+ move: ThrowNotImplemented.bind(null, 'mouse.move'),
115
+ drag: ThrowNotImplemented.bind(null, 'mouse.drag')
116
+ });
117
+ _define_property(this, "keyboard", {
118
+ type: ThrowNotImplemented.bind(null, 'keyboard.type'),
119
+ press: ThrowNotImplemented.bind(null, 'keyboard.press')
120
+ });
121
+ if (uiContext.tree) this.uiContext = uiContext;
122
+ else this.uiContext = Object.assign(uiContext, {
123
+ tree: {
124
+ node: null,
125
+ children: []
126
+ }
127
+ });
128
+ }
129
+ }
130
+ export { StaticPage as default };
131
+
132
+ //# sourceMappingURL=static-page.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static\\static-page.mjs","sources":["webpack://@rpascene/web/./src/static/static-page.ts"],"sourcesContent":["import type { DeviceAction, Point, UIContext } from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport {\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionTap,\n} from '@rpascene/core/device';\nimport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from '@rpascene/shared/common';\n\ntype WebUIContext = UIContext & {\n screenshotBase64?: string;\n size: { width: number; height: number; dpr?: number };\n};\n\nconst ThrowNotImplemented = (methodName: string) => {\n throw new Error(\n `The method \"${methodName}\" is not implemented as designed since this is a static UI context. (${ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED})`,\n );\n};\n\nexport default class StaticPage implements AbstractInterface {\n interfaceType = 'static';\n\n private uiContext: WebUIContext;\n\n constructor(uiContext: WebUIContext) {\n if (uiContext.tree) {\n this.uiContext = uiContext;\n } else {\n this.uiContext = Object.assign(uiContext, {\n tree: {\n node: null,\n children: [],\n },\n });\n }\n }\n\n actionSpace(): DeviceAction[] {\n // Return available actions for static page - they will throw \"not implemented\" errors when executed\n // but need to be available for planning phase\n return [\n defineActionTap(async (param) => {\n ThrowNotImplemented('Tap');\n }),\n defineActionRightClick(async (param) => {\n ThrowNotImplemented('RightClick');\n }),\n defineActionHover(async (param) => {\n ThrowNotImplemented('Hover');\n }),\n defineActionInput(async (param) => {\n ThrowNotImplemented('Input');\n }),\n defineActionKeyboardPress(async (param) => {\n ThrowNotImplemented('KeyboardPress');\n }),\n defineActionScroll(async (param) => {\n ThrowNotImplemented('Scroll');\n }),\n defineActionDragAndDrop(async (param) => {\n ThrowNotImplemented('DragAndDrop');\n }),\n ];\n }\n\n async evaluateJavaScript<T = unknown>(script: string): Promise<T> {\n return ThrowNotImplemented('evaluateJavaScript');\n }\n\n // @deprecated\n async getElementsInfo() {\n return ThrowNotImplemented('getElementsInfo');\n }\n\n async getElementsNodeTree() {\n return ThrowNotImplemented('getElementsNodeTree');\n }\n\n async getXpathsById(id: string) {\n return ThrowNotImplemented('getXpathsById');\n }\n\n async getXpathsByPoint(point: Point) {\n return ThrowNotImplemented('getXpathsByPoint');\n }\n\n async getElementInfoByXpath(xpath: string) {\n return ThrowNotImplemented('getElementInfoByXpath');\n }\n\n async size() {\n return {\n ...this.uiContext.size,\n dpr: this.uiContext.size.dpr || 1,\n };\n }\n\n async screenshotBase64() {\n const base64 = this.uiContext.screenshotBase64;\n if (!base64) {\n throw new Error('screenshot base64 is empty');\n }\n return base64;\n }\n\n async url() {\n return Promise.resolve('https://static_page_without_url');\n }\n\n async scrollUntilTop(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilTop');\n }\n\n async scrollUntilBottom(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilBottom');\n }\n\n async scrollUntilLeft(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilLeft');\n }\n\n async scrollUntilRight(startingPoint?: Point) {\n return ThrowNotImplemented('scrollUntilRight');\n }\n\n async scrollUp(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollUp');\n }\n\n async scrollDown(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollDown');\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollLeft');\n }\n\n async scrollRight(distance?: number, startingPoint?: Point) {\n return ThrowNotImplemented('scrollRight');\n }\n\n async clearInput() {\n return ThrowNotImplemented('clearInput');\n }\n\n mouse = {\n click: ThrowNotImplemented.bind(null, 'mouse.click'),\n wheel: ThrowNotImplemented.bind(null, 'mouse.wheel'),\n move: ThrowNotImplemented.bind(null, 'mouse.move'),\n drag: ThrowNotImplemented.bind(null, 'mouse.drag'),\n };\n\n keyboard = {\n type: ThrowNotImplemented.bind(null, 'keyboard.type'),\n press: ThrowNotImplemented.bind(null, 'keyboard.press'),\n };\n\n async destroy(): Promise<void> {\n //\n }\n\n async getContext(): Promise<UIContext> {\n return this.uiContext;\n }\n\n updateContext(newContext: WebUIContext): void {\n this.uiContext = newContext;\n }\n}\n"],"names":["ThrowNotImplemented","methodName","Error","ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED","StaticPage","defineActionTap","param","defineActionRightClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","defineActionDragAndDrop","script","id","point","xpath","base64","Promise","startingPoint","distance","newContext","uiContext","Object"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { traverseTree } from "@rpascene/shared/extractor";
2
+ import { getDebug } from "@rpascene/shared/logger";
3
+ import { commonContextParser } from "@rpascene/core/agent";
4
+ function _define_property(obj, key, value) {
5
+ if (key in obj) Object.defineProperty(obj, key, {
6
+ value: value,
7
+ enumerable: true,
8
+ configurable: true,
9
+ writable: true
10
+ });
11
+ else obj[key] = value;
12
+ return obj;
13
+ }
14
+ class WebElementInfoImpl {
15
+ constructor({ content, rect, id, attributes, indexId, xpaths, isVisible, allPaths, containerPaths }){
16
+ _define_property(this, "content", void 0);
17
+ _define_property(this, "rect", void 0);
18
+ _define_property(this, "center", void 0);
19
+ _define_property(this, "id", void 0);
20
+ _define_property(this, "indexId", void 0);
21
+ _define_property(this, "attributes", void 0);
22
+ _define_property(this, "xpaths", void 0);
23
+ _define_property(this, "isVisible", void 0);
24
+ _define_property(this, "allPaths", void 0);
25
+ _define_property(this, "containerPaths", void 0);
26
+ this.content = content;
27
+ this.rect = rect;
28
+ this.center = [
29
+ Math.floor(rect.left + rect.width / 2),
30
+ Math.floor(rect.top + rect.height / 2)
31
+ ];
32
+ this.id = id;
33
+ this.attributes = attributes;
34
+ this.indexId = indexId;
35
+ this.xpaths = xpaths;
36
+ this.isVisible = isVisible;
37
+ this.allPaths = allPaths;
38
+ this.containerPaths = containerPaths;
39
+ }
40
+ }
41
+ const debug = getDebug('web:parse-context');
42
+ async function WebPageContextParser(page, _opt) {
43
+ var _page_getElementsNodeTree;
44
+ const basicContext = await commonContextParser(page, {
45
+ uploadServerUrl: _opt.uploadServerUrl
46
+ });
47
+ debug('will traverse element tree');
48
+ const tree = await (null == (_page_getElementsNodeTree = page.getElementsNodeTree) ? void 0 : _page_getElementsNodeTree.call(page)) || {
49
+ node: null,
50
+ children: []
51
+ };
52
+ const webTree = traverseTree(tree, (elementInfo)=>{
53
+ const { rect, id, content, attributes, indexId, isVisible, allPaths, containerPaths } = elementInfo;
54
+ return new WebElementInfoImpl({
55
+ rect,
56
+ id,
57
+ content,
58
+ attributes,
59
+ indexId,
60
+ isVisible,
61
+ allPaths,
62
+ containerPaths
63
+ });
64
+ });
65
+ debug('traverse element tree end');
66
+ return {
67
+ ...basicContext,
68
+ tree: webTree
69
+ };
70
+ }
71
+ const limitOpenNewTabScript = `
72
+ if (!window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
73
+ window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;
74
+
75
+ // Intercept the window.open method (only once)
76
+ window.open = function(url) {
77
+ console.log('Blocked window.open:', url);
78
+ window.location.href = url;
79
+ return null;
80
+ };
81
+
82
+ // Block all a tag clicks with target="_blank" (only once)
83
+ document.addEventListener('click', function(e) {
84
+ const target = e.target.closest('a');
85
+ if (target && target.target === '_blank') {
86
+ e.preventDefault();
87
+ console.log('Blocked new tab:', target.href);
88
+ window.location.href = target.href;
89
+ target.removeAttribute('target');
90
+ }
91
+ }, true);
92
+ }
93
+ `;
94
+ export { WebElementInfoImpl, WebPageContextParser, limitOpenNewTabScript };
95
+
96
+ //# sourceMappingURL=web-element.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-element.mjs","sources":["webpack://@rpascene/web/./src/web-element.ts"],"sourcesContent":["import type {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { traverseTree } from '@rpascene/shared/extractor';\nimport { getDebug } from '@rpascene/shared/logger';\nimport { _keyDefinitions } from '@rpascene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@rpascene/core/agent';\nimport type { NodeType } from '@rpascene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n allPaths?: any;\n\n containerPaths?: any;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n allPaths,\n containerPaths\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n allPaths?: any;\n containerPaths?: any;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n this.allPaths = allPaths;\n this.containerPaths = containerPaths\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n debug('will traverse element tree');\n const tree = (await page.getElementsNodeTree?.()) || {\n node: null,\n children: [],\n };\n const webTree = traverseTree(tree!, (elementInfo) => {\n const { rect, id, content, attributes, indexId, isVisible, allPaths, containerPaths } = elementInfo;\n return new WebElementInfoImpl({\n rect,\n id,\n content,\n attributes,\n indexId,\n isVisible,\n allPaths,\n containerPaths\n });\n });\n debug('traverse element tree end');\n\n return {\n ...basicContext,\n tree: webTree,\n };\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__RPASCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","allPaths","containerPaths","Math","debug","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","tree","webTree","traverseTree","elementInfo","limitOpenNewTabScript"],"mappings":";;;;;;;;;;;;;AAoCO,MAAMA;IAwBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,cAAc,EAcf,CAAE;QA9CH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAEA;QAEA;QA0BE,IAAI,CAAC,OAAO,GAAGR;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZQ,KAAK,KAAK,CAACR,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCQ,KAAK,KAAK,CAACR,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,cAAc,GAAGC;IACxB;AACF;AAEA,MAAME,QAAQC,SAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,IAAkC;QAOdD;IALpB,MAAME,eAAe,MAAMC,oBAAoBH,MAAM;QACnD,iBAAiBC,KAAK,eAAe;IACvC;IAEAJ,MAAM;IACN,MAAMO,OAAQ,eAAMJ,CAAAA,4BAAAA,KAAK,mBAAmB,AAAD,IAAvBA,KAAAA,IAAAA,0BAAAA,IAAAA,CAAAA,KAAI,KAA6B;QACnD,MAAM;QACN,UAAU,EAAE;IACd;IACA,MAAMK,UAAUC,aAAaF,MAAO,CAACG;QACnC,MAAM,EAAEnB,IAAI,EAAEC,EAAE,EAAEF,OAAO,EAAEG,UAAU,EAAEC,OAAO,EAAEE,SAAS,EAAEC,QAAQ,EAAEC,cAAc,EAAE,GAAGY;QACxF,OAAO,IAAIrB,mBAAmB;YAC5BE;YACAC;YACAF;YACAG;YACAC;YACAE;YACAC;YACAC;QACF;IACF;IACAE,MAAM;IAEN,OAAO;QACL,GAAGK,YAAY;QACf,MAAMG;IACR;AACF;AAEO,MAAMG,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
@@ -0,0 +1,206 @@
1
+ import node_assert from "node:assert";
2
+ import { AbstractInterface, defineActionClearInput, defineActionDoubleClick, defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionLongPress, defineActionRightClick, defineActionScroll, defineActionSwipe, defineActionTap } from "@rpascene/core/device";
3
+ import { sleep } from "@rpascene/core/utils";
4
+ import { getDebug } from "@rpascene/shared/logger";
5
+ import { transformHotkeyInput } from "@rpascene/shared/us-keyboard-layout";
6
+ const debug = getDebug('web:page');
7
+ function normalizeKeyInputs(value) {
8
+ const inputs = Array.isArray(value) ? value : [
9
+ value
10
+ ];
11
+ const result = [];
12
+ for (const input of inputs){
13
+ if ('string' != typeof input) {
14
+ result.push(input);
15
+ continue;
16
+ }
17
+ const trimmed = input.trim();
18
+ if (!trimmed) {
19
+ result.push(input);
20
+ continue;
21
+ }
22
+ let normalized = trimmed;
23
+ if (normalized.length > 1 && normalized.includes('+')) normalized = normalized.replace(/\s*\+\s*/g, ' ');
24
+ if (/\s/.test(normalized)) normalized = normalized.replace(/\s+/g, ' ');
25
+ const transformed = transformHotkeyInput(normalized);
26
+ if (1 === transformed.length && '' === transformed[0] && '' !== trimmed) {
27
+ result.push(input);
28
+ continue;
29
+ }
30
+ if (0 === transformed.length) {
31
+ result.push(input);
32
+ continue;
33
+ }
34
+ result.push(...transformed);
35
+ }
36
+ return result;
37
+ }
38
+ function getKeyCommands(value) {
39
+ const keys = normalizeKeyInputs(value);
40
+ return keys.reduce((acc, k)=>{
41
+ const includeMeta = keys.includes('Meta') || keys.includes('Control');
42
+ if (includeMeta && ('a' === k || 'A' === k)) return acc.concat([
43
+ {
44
+ key: k,
45
+ command: 'SelectAll'
46
+ }
47
+ ]);
48
+ if (includeMeta && ('c' === k || 'C' === k)) return acc.concat([
49
+ {
50
+ key: k,
51
+ command: 'Copy'
52
+ }
53
+ ]);
54
+ if (includeMeta && ('v' === k || 'V' === k)) return acc.concat([
55
+ {
56
+ key: k,
57
+ command: 'Paste'
58
+ }
59
+ ]);
60
+ return acc.concat([
61
+ {
62
+ key: k
63
+ }
64
+ ]);
65
+ }, []);
66
+ }
67
+ class AbstractWebPage extends AbstractInterface {
68
+ get mouse() {
69
+ return {
70
+ click: async (x, y, options)=>{},
71
+ wheel: async (deltaX, deltaY)=>{},
72
+ move: async (x, y)=>{},
73
+ drag: async (from, to)=>{}
74
+ };
75
+ }
76
+ get keyboard() {
77
+ return {
78
+ type: async (text)=>{},
79
+ press: async (action)=>{}
80
+ };
81
+ }
82
+ async clearInput(element) {}
83
+ }
84
+ const commonWebActionsForWebPage = (page)=>[
85
+ defineActionTap(async (param)=>{
86
+ const element = param.locate;
87
+ node_assert(element, 'Element not found, cannot tap');
88
+ await page.mouse.click(element.center[0], element.center[1], {
89
+ button: 'left'
90
+ });
91
+ }),
92
+ defineActionRightClick(async (param)=>{
93
+ const element = param.locate;
94
+ node_assert(element, 'Element not found, cannot right click');
95
+ await page.mouse.click(element.center[0], element.center[1], {
96
+ button: 'right'
97
+ });
98
+ }),
99
+ defineActionDoubleClick(async (param)=>{
100
+ const element = param.locate;
101
+ node_assert(element, 'Element not found, cannot double click');
102
+ await page.mouse.click(element.center[0], element.center[1], {
103
+ button: 'left',
104
+ count: 2
105
+ });
106
+ }),
107
+ defineActionHover(async (param)=>{
108
+ const element = param.locate;
109
+ node_assert(element, 'Element not found, cannot hover');
110
+ await page.mouse.move(element.center[0], element.center[1]);
111
+ }),
112
+ defineActionInput(async (param)=>{
113
+ const element = param.locate;
114
+ if (element && 'append' !== param.mode) await page.clearInput(element);
115
+ if ('clear' === param.mode) return;
116
+ if (!param || !param.value) return;
117
+ await page.keyboard.type(param.value);
118
+ }),
119
+ defineActionKeyboardPress(async (param)=>{
120
+ const element = param.locate;
121
+ if (element) await page.mouse.click(element.center[0], element.center[1], {
122
+ button: 'left'
123
+ });
124
+ const keys = getKeyCommands(param.keyName);
125
+ await page.keyboard.press(keys);
126
+ }),
127
+ defineActionScroll(async (param)=>{
128
+ const element = param.locate;
129
+ const startingPoint = element ? {
130
+ left: element.center[0],
131
+ top: element.center[1]
132
+ } : void 0;
133
+ const scrollToEventName = null == param ? void 0 : param.scrollType;
134
+ if ('untilTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
135
+ else if ('untilBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
136
+ else if ('untilRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
137
+ else if ('untilLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
138
+ else if ('once' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
139
+ else {
140
+ if ((null == param ? void 0 : param.direction) !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
141
+ else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
142
+ else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
143
+ else throw new Error(`Unknown scroll direction: ${param.direction}`);
144
+ else await page.scrollDown((null == param ? void 0 : param.distance) || void 0, startingPoint);
145
+ await sleep(500);
146
+ }
147
+ }),
148
+ defineActionDragAndDrop(async (param)=>{
149
+ const from = param.from;
150
+ const to = param.to;
151
+ node_assert(from, 'missing "from" param for drag and drop');
152
+ node_assert(to, 'missing "to" param for drag and drop');
153
+ await page.mouse.drag({
154
+ x: from.center[0],
155
+ y: from.center[1]
156
+ }, {
157
+ x: to.center[0],
158
+ y: to.center[1]
159
+ });
160
+ }),
161
+ defineActionLongPress(async (param)=>{
162
+ const element = param.locate;
163
+ node_assert(element, 'Element not found, cannot long press');
164
+ const duration = null == param ? void 0 : param.duration;
165
+ await page.longPress(element.center[0], element.center[1], duration);
166
+ }),
167
+ defineActionSwipe(async (param)=>{
168
+ const { width, height } = await page.size();
169
+ const { start, end } = param;
170
+ const startPoint = start ? {
171
+ x: start.center[0],
172
+ y: start.center[1]
173
+ } : {
174
+ x: width / 2,
175
+ y: height / 2
176
+ };
177
+ let endPoint;
178
+ if (end) endPoint = {
179
+ x: end.center[0],
180
+ y: end.center[1]
181
+ };
182
+ else if (param.distance) {
183
+ const direction = param.direction;
184
+ if (!direction) throw new Error('direction is required for swipe gesture');
185
+ endPoint = {
186
+ x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
187
+ y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
188
+ };
189
+ } else throw new Error('Either end or distance must be specified for swipe gesture');
190
+ endPoint.x = Math.max(0, Math.min(endPoint.x, width));
191
+ endPoint.y = Math.max(0, Math.min(endPoint.y, height));
192
+ const duration = param.duration;
193
+ debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
194
+ let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
195
+ if (0 === repeat) repeat = 10;
196
+ for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
197
+ }),
198
+ defineActionClearInput(async (param)=>{
199
+ const element = param.locate;
200
+ node_assert(element, 'Element not found, cannot clear input');
201
+ await page.clearInput(element);
202
+ })
203
+ ];
204
+ export { AbstractWebPage, commonWebActionsForWebPage, getKeyCommands };
205
+
206
+ //# sourceMappingURL=web-page.mjs.map