@sqaitech/web 0.5.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 (135) hide show
  1. package/README.md +9 -0
  2. package/bin/sqai-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 +38 -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 +627 -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 +483 -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 +90 -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 +88 -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 +661 -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 +523 -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 +130 -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 +47 -0
  134. package/dist/types/web-page.d.ts +59 -0
  135. package/package.json +172 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-extension\\page.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/chrome-extension/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};","/// <reference types=\"chrome\" />\r\n\r\n/*\r\n It is used to interact with the page tab from the chrome extension.\r\n The page must be active when interacting with it.\r\n*/\r\n\r\nimport { limitOpenNewTabScript } from '@/web-element';\r\nimport type { ElementTreeNode, Point, Size, UIContext } from '@sqaitech/core';\r\nimport type { AbstractInterface, DeviceAction } from '@sqaitech/core/device';\r\nimport type { ElementInfo } from '@sqaitech/shared/extractor';\r\nimport { treeToList } from '@sqaitech/shared/extractor';\r\nimport { createImgBase64ByFormat } from '@sqaitech/shared/img';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { Protocol as CDPTypes } from 'devtools-protocol';\r\nimport { WebPageContextParser } from '../web-element';\r\nimport {\r\n type KeyInput,\r\n type MouseButton,\r\n commonWebActionsForWebPage,\r\n} from '../web-page';\r\nimport { CdpKeyboard } from './cdpInput';\r\nimport {\r\n getHtmlElementScript,\r\n injectStopWaterFlowAnimation,\r\n injectWaterFlowAnimation,\r\n} from './dynamic-scripts';\r\n\r\nfunction sleep(ms: number) {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport default class ChromeExtensionProxyPage implements AbstractInterface {\r\n interfaceType = 'chrome-extension-proxy';\r\n\r\n public forceSameTabNavigation: boolean;\r\n\r\n private viewportSize?: Size;\r\n\r\n private activeTabId: number | null = null;\r\n\r\n private tabIdOfDebuggerAttached: number | null = null;\r\n\r\n private attachingDebugger: Promise<void> | null = null;\r\n\r\n private destroyed = false;\r\n\r\n private isMobileEmulation: boolean | null = null;\r\n\r\n public _continueWhenFailedToAttachDebugger = false;\r\n\r\n constructor(forceSameTabNavigation: boolean) {\r\n this.forceSameTabNavigation = forceSameTabNavigation;\r\n }\r\n\r\n actionSpace(): DeviceAction[] {\r\n return commonWebActionsForWebPage(this);\r\n }\r\n\r\n public async setActiveTabId(tabId: number) {\r\n if (this.activeTabId) {\r\n throw new Error(\r\n `Active tab id is already set, which is ${this.activeTabId}, cannot set it to ${tabId}`,\r\n );\r\n }\r\n await chrome.tabs.update(tabId, { active: true });\r\n this.activeTabId = tabId;\r\n }\r\n\r\n public async getActiveTabId() {\r\n return this.activeTabId;\r\n }\r\n\r\n /**\r\n * Get a list of current tabs\r\n * @returns {Promise<Array<{id: number, title: string, url: string}>>}\r\n */\r\n public async getBrowserTabList(): Promise<\r\n { id: string; title: string; url: string; currentActiveTab: boolean }[]\r\n > {\r\n const tabs = await chrome.tabs.query({ currentWindow: true });\r\n return tabs\r\n .map((tab) => ({\r\n id: `${tab.id}`,\r\n title: tab.title,\r\n url: tab.url,\r\n currentActiveTab: tab.active,\r\n }))\r\n .filter((tab) => tab.id && tab.title && tab.url) as {\r\n id: string;\r\n title: string;\r\n url: string;\r\n currentActiveTab: boolean;\r\n }[];\r\n }\r\n\r\n public async getTabIdOrConnectToCurrentTab() {\r\n if (this.activeTabId) {\r\n // alway keep on the connected tab\r\n return this.activeTabId;\r\n }\r\n const tabId = await chrome.tabs\r\n .query({ active: true, currentWindow: true })\r\n .then((tabs) => tabs[0]?.id);\r\n this.activeTabId = tabId || 0;\r\n return this.activeTabId;\r\n }\r\n\r\n private async attachDebugger() {\r\n assert(!this.destroyed, 'Page is destroyed');\r\n\r\n // If already attaching, wait for it to complete\r\n if (this.attachingDebugger) {\r\n await this.attachingDebugger;\r\n return;\r\n }\r\n\r\n // Create new attaching promise\r\n this.attachingDebugger = (async () => {\r\n const url = await this.url();\r\n let error: Error | null = null;\r\n if (url.startsWith('chrome://')) {\r\n throw new Error(\r\n 'Cannot attach debugger to chrome:// pages, please use Midscene in a normal page with http://, https:// or file://',\r\n );\r\n }\r\n\r\n try {\r\n const currentTabId = await this.getTabIdOrConnectToCurrentTab();\r\n\r\n if (this.tabIdOfDebuggerAttached === currentTabId) {\r\n // already attached\r\n return;\r\n }\r\n if (\r\n this.tabIdOfDebuggerAttached &&\r\n this.tabIdOfDebuggerAttached !== currentTabId\r\n ) {\r\n // detach the previous tab\r\n console.log(\r\n 'detach the previous tab',\r\n this.tabIdOfDebuggerAttached,\r\n '->',\r\n currentTabId,\r\n );\r\n try {\r\n await this.detachDebugger(this.tabIdOfDebuggerAttached);\r\n } catch (error) {\r\n console.error('Failed to detach debugger', error);\r\n }\r\n }\r\n\r\n // detach any debugger attached to the tab\r\n console.log('attaching debugger', currentTabId);\r\n try {\r\n await chrome.debugger.attach({ tabId: currentTabId }, '1.3');\r\n } catch (e) {\r\n if (this._continueWhenFailedToAttachDebugger) {\r\n console.warn(\r\n 'Failed to attach debugger, but the script will continue as if the debugger is attached since the _continueWhenFailedToAttachDebugger is true',\r\n e,\r\n );\r\n } else {\r\n throw e;\r\n }\r\n }\r\n\r\n // wait util the debugger banner in Chrome appears\r\n await sleep(500);\r\n\r\n this.tabIdOfDebuggerAttached = currentTabId;\r\n\r\n await this.enableWaterFlowAnimation();\r\n } catch (e) {\r\n console.error('Failed to attach debugger', e);\r\n error = e as Error;\r\n } finally {\r\n this.attachingDebugger = null;\r\n }\r\n if (error) {\r\n throw error;\r\n }\r\n })();\r\n\r\n await this.attachingDebugger;\r\n }\r\n\r\n private async showMousePointer(x: number, y: number) {\r\n // update mouse pointer while redirecting\r\n const pointerScript = `(() => {\r\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\r\n window.midsceneWaterFlowAnimation.enable();\r\n window.midsceneWaterFlowAnimation.showMousePointer(${x}, ${y});\r\n } else {\r\n console.log('midsceneWaterFlowAnimation is not defined');\r\n }\r\n })()`;\r\n\r\n await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `${pointerScript}`,\r\n });\r\n }\r\n\r\n private async hideMousePointer() {\r\n await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `(() => {\r\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\r\n window.midsceneWaterFlowAnimation.hideMousePointer();\r\n }\r\n })()`,\r\n });\r\n }\r\n\r\n private async detachDebugger(tabId?: number) {\r\n const tabIdToDetach = tabId || this.tabIdOfDebuggerAttached;\r\n console.log('detaching debugger', tabIdToDetach);\r\n if (!tabIdToDetach) {\r\n console.warn('No tab id to detach');\r\n return;\r\n }\r\n\r\n try {\r\n await this.disableWaterFlowAnimation(tabIdToDetach);\r\n await sleep(200); // wait for the animation to stop\r\n } catch (error) {\r\n console.warn('Failed to disable water flow animation', error);\r\n }\r\n\r\n try {\r\n await chrome.debugger.detach({ tabId: tabIdToDetach });\r\n } catch (error) {\r\n // maybe tab is closed ?\r\n console.warn('Failed to detach debugger', error);\r\n }\r\n this.tabIdOfDebuggerAttached = null;\r\n }\r\n\r\n private async enableWaterFlowAnimation() {\r\n // limit open page in new tab\r\n if (this.forceSameTabNavigation) {\r\n await chrome.debugger.sendCommand(\r\n { tabId: this.tabIdOfDebuggerAttached! },\r\n 'Runtime.evaluate',\r\n {\r\n expression: limitOpenNewTabScript,\r\n },\r\n );\r\n }\r\n\r\n const script = await injectWaterFlowAnimation();\r\n // we will call this function in sendCommandToDebugger, so we have to use the chrome.debugger.sendCommand\r\n await chrome.debugger.sendCommand(\r\n { tabId: this.tabIdOfDebuggerAttached! },\r\n 'Runtime.evaluate',\r\n {\r\n expression: script,\r\n },\r\n );\r\n }\r\n\r\n private async disableWaterFlowAnimation(tabId: number) {\r\n const script = await injectStopWaterFlowAnimation();\r\n\r\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\r\n expression: script,\r\n });\r\n }\r\n\r\n private async sendCommandToDebugger<ResponseType = any, RequestType = any>(\r\n command: string,\r\n params: RequestType,\r\n ): Promise<ResponseType> {\r\n await this.attachDebugger();\r\n\r\n assert(this.tabIdOfDebuggerAttached, 'Debugger is not attached');\r\n\r\n // wo don't have to await it\r\n this.enableWaterFlowAnimation();\r\n return (await chrome.debugger.sendCommand(\r\n { tabId: this.tabIdOfDebuggerAttached! },\r\n command,\r\n params as any,\r\n )) as ResponseType;\r\n }\r\n\r\n private async getPageContentByCDP() {\r\n const script = await getHtmlElementScript();\r\n\r\n // check tab url\r\n await this.sendCommandToDebugger<\r\n CDPTypes.Runtime.EvaluateResponse,\r\n CDPTypes.Runtime.EvaluateRequest\r\n >('Runtime.evaluate', {\r\n expression: script,\r\n });\r\n\r\n const expression = () => {\r\n (window as any).midscene_element_inspector.setNodeHashCacheListOnWindow();\r\n\r\n const tree = (\r\n window as any\r\n ).midscene_element_inspector.webExtractNodeTree();\r\n\r\n return {\r\n tree,\r\n size: {\r\n width: document.documentElement.clientWidth,\r\n height: document.documentElement.clientHeight,\r\n dpr: window.devicePixelRatio,\r\n },\r\n };\r\n };\r\n const returnValue = await this.sendCommandToDebugger<\r\n CDPTypes.Runtime.EvaluateResponse,\r\n CDPTypes.Runtime.EvaluateRequest\r\n >('Runtime.evaluate', {\r\n expression: `(${expression.toString()})()`,\r\n returnByValue: true,\r\n });\r\n\r\n if (!returnValue.result.value) {\r\n const errorDescription =\r\n returnValue.exceptionDetails?.exception?.description || '';\r\n if (!errorDescription) {\r\n console.error('returnValue from cdp', returnValue);\r\n }\r\n throw new Error(\r\n `Failed to get page content from page, error: ${errorDescription}`,\r\n );\r\n }\r\n\r\n return returnValue.result.value as {\r\n tree: ElementTreeNode<ElementInfo>;\r\n size: Size;\r\n };\r\n }\r\n\r\n public async evaluateJavaScript(script: string) {\r\n return this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: script,\r\n });\r\n }\r\n\r\n async beforeInvokeAction(): Promise<void> {\r\n // current implementation is wait until domReadyState is complete\r\n try {\r\n await this.waitUntilNetworkIdle();\r\n } catch (error) {\r\n // console.warn('Failed to wait until network idle', error);\r\n }\r\n }\r\n\r\n private async waitUntilNetworkIdle() {\r\n const timeout = 10000;\r\n const startTime = Date.now();\r\n let lastReadyState = '';\r\n while (Date.now() - startTime < timeout) {\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: 'document.readyState',\r\n });\r\n lastReadyState = result.result.value;\r\n if (lastReadyState === 'complete') {\r\n await new Promise((resolve) => setTimeout(resolve, 300));\r\n return;\r\n }\r\n await new Promise((resolve) => setTimeout(resolve, 300));\r\n }\r\n throw new Error(\r\n `Failed to wait until network idle, last readyState: ${lastReadyState}`,\r\n );\r\n }\r\n\r\n // @deprecated\r\n async getElementsInfo() {\r\n const tree = await this.getElementsNodeTree();\r\n return treeToList(tree);\r\n }\r\n\r\n async getXpathsById(id: string) {\r\n const script = await getHtmlElementScript();\r\n\r\n // check tab url\r\n await this.sendCommandToDebugger<\r\n CDPTypes.Runtime.EvaluateResponse,\r\n CDPTypes.Runtime.EvaluateRequest\r\n >('Runtime.evaluate', {\r\n expression: script,\r\n });\r\n\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `window.midscene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\r\n returnByValue: true,\r\n });\r\n return result.result.value;\r\n }\r\n\r\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\r\n const script = await getHtmlElementScript();\r\n\r\n await this.sendCommandToDebugger<\r\n CDPTypes.Runtime.EvaluateResponse,\r\n CDPTypes.Runtime.EvaluateRequest\r\n >('Runtime.evaluate', {\r\n expression: script,\r\n });\r\n\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `window.midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\r\n returnByValue: true,\r\n });\r\n return result.result.value;\r\n }\r\n\r\n async getElementInfoByXpath(xpath: string) {\r\n const script = await getHtmlElementScript();\r\n\r\n // check tab url\r\n await this.sendCommandToDebugger<\r\n CDPTypes.Runtime.EvaluateResponse,\r\n CDPTypes.Runtime.EvaluateRequest\r\n >('Runtime.evaluate', {\r\n expression: script,\r\n });\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `window.midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\r\n returnByValue: true,\r\n });\r\n return result.result.value;\r\n }\r\n\r\n async getElementsNodeTree() {\r\n await this.hideMousePointer();\r\n const content = await this.getPageContentByCDP();\r\n if (content?.size) {\r\n this.viewportSize = content.size;\r\n }\r\n\r\n return content?.tree || { node: null, children: [] };\r\n }\r\n\r\n async getContext(): Promise<UIContext> {\r\n return await WebPageContextParser(this, {});\r\n }\r\n\r\n async size() {\r\n if (this.viewportSize) return this.viewportSize;\r\n const content = await this.getPageContentByCDP();\r\n return content.size;\r\n }\r\n\r\n async screenshotBase64() {\r\n // screenshot by cdp\r\n await this.hideMousePointer();\r\n const format = 'jpeg';\r\n const base64 = await this.sendCommandToDebugger('Page.captureScreenshot', {\r\n format,\r\n quality: 90,\r\n });\r\n return createImgBase64ByFormat(format, base64.data);\r\n }\r\n\r\n async url() {\r\n const tabId = await this.getTabIdOrConnectToCurrentTab();\r\n const url = await chrome.tabs.get(tabId).then((tab) => tab.url);\r\n return url || '';\r\n }\r\n\r\n async scrollUntilTop(startingPoint?: Point) {\r\n if (startingPoint) {\r\n await this.mouse.move(startingPoint.left, startingPoint.top);\r\n }\r\n return this.mouse.wheel(0, -9999999);\r\n }\r\n\r\n async scrollUntilBottom(startingPoint?: Point) {\r\n if (startingPoint) {\r\n await this.mouse.move(startingPoint.left, startingPoint.top);\r\n }\r\n return this.mouse.wheel(0, 9999999);\r\n }\r\n\r\n async scrollUntilLeft(startingPoint?: Point) {\r\n if (startingPoint) {\r\n await this.mouse.move(startingPoint.left, startingPoint.top);\r\n }\r\n return this.mouse.wheel(-9999999, 0);\r\n }\r\n\r\n async scrollUntilRight(startingPoint?: Point) {\r\n if (startingPoint) {\r\n await this.mouse.move(startingPoint.left, startingPoint.top);\r\n }\r\n return this.mouse.wheel(9999999, 0);\r\n }\r\n\r\n async scrollUp(distance?: number, startingPoint?: Point) {\r\n const { height } = await this.size();\r\n const scrollDistance = distance || height * 0.7;\r\n return this.mouse.wheel(\r\n 0,\r\n -scrollDistance,\r\n startingPoint?.left,\r\n startingPoint?.top,\r\n );\r\n }\r\n\r\n async scrollDown(distance?: number, startingPoint?: Point) {\r\n const { height } = await this.size();\r\n const scrollDistance = distance || height * 0.7;\r\n return this.mouse.wheel(\r\n 0,\r\n scrollDistance,\r\n startingPoint?.left,\r\n startingPoint?.top,\r\n );\r\n }\r\n\r\n async scrollLeft(distance?: number, startingPoint?: Point) {\r\n const { width } = await this.size();\r\n const scrollDistance = distance || width * 0.7;\r\n return this.mouse.wheel(\r\n -scrollDistance,\r\n 0,\r\n startingPoint?.left,\r\n startingPoint?.top,\r\n );\r\n }\r\n\r\n async scrollRight(distance?: number, startingPoint?: Point) {\r\n const { width } = await this.size();\r\n const scrollDistance = distance || width * 0.7;\r\n return this.mouse.wheel(\r\n scrollDistance,\r\n 0,\r\n startingPoint?.left,\r\n startingPoint?.top,\r\n );\r\n }\r\n\r\n async clearInput(element: ElementInfo) {\r\n if (!element) {\r\n console.warn('No element to clear input');\r\n return;\r\n }\r\n\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n\r\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\r\n type: 'keyDown',\r\n commands: ['selectAll'],\r\n });\r\n\r\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\r\n type: 'keyUp',\r\n commands: ['selectAll'],\r\n });\r\n\r\n await sleep(100);\r\n\r\n await this.keyboard.press({\r\n key: 'Backspace',\r\n });\r\n }\r\n\r\n private latestMouseX = 100;\r\n private latestMouseY = 100;\r\n\r\n mouse = {\r\n click: async (\r\n x: number,\r\n y: number,\r\n options?: { button?: MouseButton; count?: number },\r\n ) => {\r\n const { button = 'left', count = 1 } = options || {};\r\n await this.mouse.move(x, y);\r\n // detect if the page is in mobile emulation mode\r\n if (this.isMobileEmulation === null) {\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `(() => {\r\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n })()`,\r\n returnByValue: true,\r\n });\r\n this.isMobileEmulation = result?.result?.value;\r\n }\r\n\r\n if (this.isMobileEmulation && button === 'left') {\r\n // in mobile emulation mode, directly inject click event\r\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchStart',\r\n touchPoints,\r\n modifiers: 0,\r\n });\r\n\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchEnd',\r\n touchPoints: [],\r\n modifiers: 0,\r\n });\r\n } else {\r\n // standard mousePressed + mouseReleased\r\n for (let i = 0; i < count; i++) {\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mousePressed',\r\n x,\r\n y,\r\n button,\r\n clickCount: 1,\r\n });\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseReleased',\r\n x,\r\n y,\r\n button,\r\n clickCount: 1,\r\n });\r\n await sleep(50);\r\n }\r\n }\r\n },\r\n wheel: async (\r\n deltaX: number,\r\n deltaY: number,\r\n startX?: number,\r\n startY?: number,\r\n ) => {\r\n const finalX = startX || this.latestMouseX;\r\n const finalY = startY || this.latestMouseY;\r\n await this.showMousePointer(finalX, finalY);\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseWheel',\r\n x: finalX,\r\n y: finalY,\r\n deltaX,\r\n deltaY,\r\n });\r\n this.latestMouseX = finalX;\r\n this.latestMouseY = finalY;\r\n },\r\n move: async (x: number, y: number) => {\r\n await this.showMousePointer(x, y);\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseMoved',\r\n x,\r\n y,\r\n });\r\n this.latestMouseX = x;\r\n this.latestMouseY = y;\r\n },\r\n drag: async (\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n ) => {\r\n await this.mouse.move(from.x, from.y);\r\n\r\n await sleep(200);\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mousePressed',\r\n x: from.x,\r\n y: from.y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n\r\n await sleep(300);\r\n\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseMoved',\r\n x: to.x,\r\n y: to.y,\r\n });\r\n\r\n await sleep(500);\r\n\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseReleased',\r\n x: to.x,\r\n y: to.y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n\r\n await sleep(200);\r\n\r\n await this.mouse.move(to.x, to.y);\r\n },\r\n };\r\n\r\n keyboard = {\r\n type: async (text: string) => {\r\n const cdpKeyboard = new CdpKeyboard({\r\n send: this.sendCommandToDebugger.bind(this),\r\n });\r\n await cdpKeyboard.type(text, { delay: 0 });\r\n },\r\n press: async (\r\n action:\r\n | { key: KeyInput; command?: string }\r\n | { key: KeyInput; command?: string }[],\r\n ) => {\r\n const cdpKeyboard = new CdpKeyboard({\r\n send: this.sendCommandToDebugger.bind(this),\r\n });\r\n const keys = Array.isArray(action) ? action : [action];\r\n for (const k of keys) {\r\n const commands = k.command ? [k.command] : [];\r\n await cdpKeyboard.down(k.key, { commands });\r\n }\r\n for (const k of [...keys].reverse()) {\r\n await cdpKeyboard.up(k.key);\r\n }\r\n },\r\n };\r\n\r\n async destroy(): Promise<void> {\r\n this.activeTabId = null;\r\n await this.detachDebugger();\r\n this.destroyed = true;\r\n }\r\n\r\n async longPress(x: number, y: number, duration?: number) {\r\n duration = duration || 500;\r\n const LONG_PRESS_THRESHOLD = 600;\r\n const MIN_PRESS_THRESHOLD = 300;\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n await this.mouse.move(x, y);\r\n\r\n if (this.isMobileEmulation === null) {\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `(() => {\r\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n })()`,\r\n returnByValue: true,\r\n });\r\n this.isMobileEmulation = result?.result?.value;\r\n }\r\n\r\n if (this.isMobileEmulation) {\r\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchStart',\r\n touchPoints,\r\n modifiers: 0,\r\n });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchEnd',\r\n touchPoints: [],\r\n modifiers: 0,\r\n });\r\n } else {\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mousePressed',\r\n x,\r\n y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseReleased',\r\n x,\r\n y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n }\r\n this.latestMouseX = x;\r\n this.latestMouseY = y;\r\n }\r\n\r\n async swipe(\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n duration?: number,\r\n ) {\r\n const LONG_PRESS_THRESHOLD = 500;\r\n const MIN_PRESS_THRESHOLD = 150;\r\n duration = duration || 300;\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n\r\n if (this.isMobileEmulation === null) {\r\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\r\n expression: `(() => {\r\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n })()`,\r\n returnByValue: true,\r\n });\r\n this.isMobileEmulation = result?.result?.value;\r\n }\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n\r\n if (this.isMobileEmulation) {\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchStart',\r\n touchPoints: [{ x: Math.round(from.x), y: Math.round(from.y) }],\r\n modifiers: 0,\r\n });\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchMove',\r\n touchPoints: [{ x: Math.round(x), y: Math.round(y) }],\r\n modifiers: 0,\r\n });\r\n await new Promise((res) => setTimeout(res, delay));\r\n }\r\n\r\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\r\n type: 'touchEnd',\r\n touchPoints: [],\r\n modifiers: 0,\r\n });\r\n } else {\r\n await this.mouse.move(from.x, from.y);\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mousePressed',\r\n x: from.x,\r\n y: from.y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await this.mouse.move(x, y);\r\n await new Promise((res) => setTimeout(res, delay));\r\n }\r\n\r\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\r\n type: 'mouseReleased',\r\n x: to.x,\r\n y: to.y,\r\n button: 'left',\r\n clickCount: 1,\r\n });\r\n }\r\n\r\n this.latestMouseX = to.x;\r\n this.latestMouseY = to.y;\r\n }\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","sleep","ms","Promise","resolve","setTimeout","ChromeExtensionProxyPage","commonWebActionsForWebPage","tabId","Error","chrome","tabs","tab","_tabs_","assert","url","error","currentTabId","console","e","x","y","pointerScript","tabIdToDetach","limitOpenNewTabScript","script","injectWaterFlowAnimation","injectStopWaterFlowAnimation","command","params","getHtmlElementScript","expression","window","tree","document","returnValue","_returnValue_exceptionDetails_exception","errorDescription","timeout","startTime","Date","lastReadyState","result","treeToList","id","JSON","point","isOrderSensitive","xpath","content","WebPageContextParser","format","base64","createImgBase64ByFormat","startingPoint","distance","height","scrollDistance","width","element","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","_result_result","touchPoints","Math","res","from","to","steps","delay","i","forceSameTabNavigation","options","button","count","deltaX","deltaY","startX","startY","finalX","finalY","text","cdpKeyboard","CdpKeyboard","action","keys","Array","k","commands"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ PlaywrightAgent: ()=>index_js_namespaceObject.PlaywrightAgent,
28
+ WebPageContextParser: ()=>external_web_element_js_namespaceObject.WebPageContextParser,
29
+ PageAgent: ()=>agent_namespaceObject.Agent,
30
+ StaticPageAgent: ()=>external_static_index_js_namespaceObject.StaticPageAgent,
31
+ StaticPage: ()=>external_static_index_js_namespaceObject.StaticPage,
32
+ PuppeteerAgent: ()=>external_puppeteer_index_js_namespaceObject.PuppeteerAgent,
33
+ PlaywrightAiFixture: ()=>index_js_namespaceObject.PlaywrightAiFixture
34
+ });
35
+ const index_js_namespaceObject = require("./playwright/index.js");
36
+ const agent_namespaceObject = require("@sqaitech/core/agent");
37
+ const external_puppeteer_index_js_namespaceObject = require("./puppeteer/index.js");
38
+ const external_static_index_js_namespaceObject = require("./static/index.js");
39
+ const external_web_element_js_namespaceObject = require("./web-element.js");
40
+ exports.PageAgent = __webpack_exports__.PageAgent;
41
+ exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
42
+ exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
43
+ exports.PuppeteerAgent = __webpack_exports__.PuppeteerAgent;
44
+ exports.StaticPage = __webpack_exports__.StaticPage;
45
+ exports.StaticPageAgent = __webpack_exports__.StaticPageAgent;
46
+ exports.WebPageContextParser = __webpack_exports__.WebPageContextParser;
47
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
48
+ "PageAgent",
49
+ "PlaywrightAgent",
50
+ "PlaywrightAiFixture",
51
+ "PuppeteerAgent",
52
+ "StaticPage",
53
+ "StaticPageAgent",
54
+ "WebPageContextParser"
55
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
56
+ Object.defineProperty(exports, '__esModule', {
57
+ value: true
58
+ });
59
+
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object"],"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};"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ midsceneDumpAnnotationId: ()=>midsceneDumpAnnotationId,
28
+ PlaywrightAiFixture: ()=>PlaywrightAiFixture
29
+ });
30
+ const external_node_fs_namespaceObject = require("node:fs");
31
+ const external_node_os_namespaceObject = require("node:os");
32
+ const external_node_path_namespaceObject = require("node:path");
33
+ const external_index_js_namespaceObject = require("./index.js");
34
+ const utils_namespaceObject = require("@sqaitech/core/utils");
35
+ const constants_namespaceObject = require("@sqaitech/shared/constants");
36
+ const logger_namespaceObject = require("@sqaitech/shared/logger");
37
+ const shared_utils_namespaceObject = require("@sqaitech/shared/utils");
38
+ const test_namespaceObject = require("@playwright/test");
39
+ const debugPage = (0, logger_namespaceObject.getDebug)('web:playwright:ai-fixture');
40
+ const groupAndCaseForTest = (testInfo)=>{
41
+ let taskFile;
42
+ let taskTitle;
43
+ const titlePath = [
44
+ ...testInfo.titlePath
45
+ ];
46
+ if (titlePath.length > 1) {
47
+ taskFile = titlePath.shift() || 'unnamed';
48
+ taskTitle = titlePath.join('__');
49
+ } else if (1 === titlePath.length) {
50
+ taskTitle = titlePath[0];
51
+ taskFile = `${taskTitle}`;
52
+ } else {
53
+ taskTitle = 'unnamed';
54
+ taskFile = 'unnamed';
55
+ }
56
+ const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;
57
+ return {
58
+ file: taskFile,
59
+ id: (0, shared_utils_namespaceObject.replaceIllegalPathCharsAndSpace)(`${taskFile}(${taskTitle})`),
60
+ title: (0, shared_utils_namespaceObject.replaceIllegalPathCharsAndSpace)(taskTitleWithRetry)
61
+ };
62
+ };
63
+ const midsceneAgentKeyId = '_midsceneAgentId';
64
+ const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';
65
+ const PlaywrightAiFixture = (options)=>{
66
+ const { forceSameTabNavigation = true, waitForNetworkIdleTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT, waitForNavigationTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT, cache } = options ?? {};
67
+ const processTestCacheConfig = (testInfo)=>{
68
+ const { id } = groupAndCaseForTest(testInfo);
69
+ return (0, utils_namespaceObject.processCacheConfig)(cache, id);
70
+ };
71
+ const pageAgentMap = {};
72
+ const createOrReuseAgentForPage = (page, testInfo, opts)=>{
73
+ let idForPage = page[midsceneAgentKeyId];
74
+ if (!idForPage) {
75
+ idForPage = (0, shared_utils_namespaceObject.uuid)();
76
+ page[midsceneAgentKeyId] = idForPage;
77
+ const { testId } = testInfo;
78
+ const { file, title } = groupAndCaseForTest(testInfo);
79
+ const cacheConfig = processTestCacheConfig(testInfo);
80
+ pageAgentMap[idForPage] = new external_index_js_namespaceObject.PlaywrightAgent(page, {
81
+ testId: `playwright-${testId}-${idForPage}`,
82
+ forceSameTabNavigation,
83
+ cache: cacheConfig,
84
+ groupName: title,
85
+ groupDescription: file,
86
+ generateReport: false,
87
+ ...opts
88
+ });
89
+ pageAgentMap[idForPage].onDumpUpdate = (dump)=>{
90
+ updateDumpAnnotation(testInfo, dump);
91
+ };
92
+ page.on('close', ()=>{
93
+ debugPage('page closed');
94
+ pageAgentMap[idForPage].destroy();
95
+ delete pageAgentMap[idForPage];
96
+ });
97
+ }
98
+ return pageAgentMap[idForPage];
99
+ };
100
+ async function generateAiFunction(options) {
101
+ const { page, testInfo, use, aiActionType } = options;
102
+ const agent = createOrReuseAgentForPage(page, testInfo, {
103
+ waitForNavigationTimeout,
104
+ waitForNetworkIdleTimeout
105
+ });
106
+ await use(async (taskPrompt, ...args)=>new Promise((resolve, reject)=>{
107
+ test_namespaceObject.test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async ()=>{
108
+ try {
109
+ debugPage(`waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`);
110
+ await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);
111
+ } catch (error) {
112
+ console.warn('[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
113
+ }
114
+ try {
115
+ const result = await agent[aiActionType](taskPrompt, ...args || []);
116
+ resolve(result);
117
+ } catch (error) {
118
+ reject(error);
119
+ }
120
+ });
121
+ }));
122
+ }
123
+ const updateDumpAnnotation = (test, dump)=>{
124
+ const tempFileName = `midscene-dump-${test.testId || (0, shared_utils_namespaceObject.uuid)()}-${Date.now()}.json`;
125
+ const tempFilePath = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), tempFileName);
126
+ (0, external_node_fs_namespaceObject.writeFileSync)(tempFilePath, dump, 'utf-8');
127
+ debugPage(`Dump written to temp file: ${tempFilePath}`);
128
+ const currentAnnotation = test.annotations.find((item)=>item.type === midsceneDumpAnnotationId);
129
+ if (currentAnnotation) currentAnnotation.description = tempFilePath;
130
+ else test.annotations.push({
131
+ type: midsceneDumpAnnotationId,
132
+ description: tempFilePath
133
+ });
134
+ };
135
+ return {
136
+ agentForPage: async ({ page }, use, testInfo)=>{
137
+ await use(async (propsPage, opts)=>{
138
+ const cacheConfig = processTestCacheConfig(testInfo);
139
+ let finalCacheConfig = cacheConfig;
140
+ if ((null == opts ? void 0 : opts.cache) !== void 0) {
141
+ const userCache = opts.cache;
142
+ if (false === userCache) finalCacheConfig = false;
143
+ else if (true === userCache) {
144
+ const { id } = groupAndCaseForTest(testInfo);
145
+ finalCacheConfig = {
146
+ id
147
+ };
148
+ } else if ('object' == typeof userCache) if (userCache.id) finalCacheConfig = userCache;
149
+ else {
150
+ const { id } = groupAndCaseForTest(testInfo);
151
+ finalCacheConfig = {
152
+ ...userCache,
153
+ id
154
+ };
155
+ }
156
+ }
157
+ const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {
158
+ waitForNavigationTimeout,
159
+ waitForNetworkIdleTimeout,
160
+ cache: finalCacheConfig,
161
+ ...opts
162
+ });
163
+ return agent;
164
+ });
165
+ },
166
+ ai: async ({ page }, use, testInfo)=>{
167
+ await generateAiFunction({
168
+ page,
169
+ testInfo,
170
+ use,
171
+ aiActionType: 'ai'
172
+ });
173
+ },
174
+ aiAction: async ({ page }, use, testInfo)=>{
175
+ await generateAiFunction({
176
+ page,
177
+ testInfo,
178
+ use,
179
+ aiActionType: 'aiAction'
180
+ });
181
+ },
182
+ aiTap: async ({ page }, use, testInfo)=>{
183
+ await generateAiFunction({
184
+ page,
185
+ testInfo,
186
+ use,
187
+ aiActionType: 'aiTap'
188
+ });
189
+ },
190
+ aiRightClick: async ({ page }, use, testInfo)=>{
191
+ await generateAiFunction({
192
+ page,
193
+ testInfo,
194
+ use,
195
+ aiActionType: 'aiRightClick'
196
+ });
197
+ },
198
+ aiDoubleClick: async ({ page }, use, testInfo)=>{
199
+ await generateAiFunction({
200
+ page,
201
+ testInfo,
202
+ use,
203
+ aiActionType: 'aiDoubleClick'
204
+ });
205
+ },
206
+ aiHover: async ({ page }, use, testInfo)=>{
207
+ await generateAiFunction({
208
+ page,
209
+ testInfo,
210
+ use,
211
+ aiActionType: 'aiHover'
212
+ });
213
+ },
214
+ aiInput: async ({ page }, use, testInfo)=>{
215
+ await generateAiFunction({
216
+ page,
217
+ testInfo,
218
+ use,
219
+ aiActionType: 'aiInput'
220
+ });
221
+ },
222
+ aiKeyboardPress: async ({ page }, use, testInfo)=>{
223
+ await generateAiFunction({
224
+ page,
225
+ testInfo,
226
+ use,
227
+ aiActionType: 'aiKeyboardPress'
228
+ });
229
+ },
230
+ aiScroll: async ({ page }, use, testInfo)=>{
231
+ await generateAiFunction({
232
+ page,
233
+ testInfo,
234
+ use,
235
+ aiActionType: 'aiScroll'
236
+ });
237
+ },
238
+ aiQuery: async ({ page }, use, testInfo)=>{
239
+ await generateAiFunction({
240
+ page,
241
+ testInfo,
242
+ use,
243
+ aiActionType: 'aiQuery'
244
+ });
245
+ },
246
+ aiAssert: async ({ page }, use, testInfo)=>{
247
+ await generateAiFunction({
248
+ page,
249
+ testInfo,
250
+ use,
251
+ aiActionType: 'aiAssert'
252
+ });
253
+ },
254
+ aiWaitFor: async ({ page }, use, testInfo)=>{
255
+ await generateAiFunction({
256
+ page,
257
+ testInfo,
258
+ use,
259
+ aiActionType: 'aiWaitFor'
260
+ });
261
+ },
262
+ aiLocate: async ({ page }, use, testInfo)=>{
263
+ await generateAiFunction({
264
+ page,
265
+ testInfo,
266
+ use,
267
+ aiActionType: 'aiLocate'
268
+ });
269
+ },
270
+ aiNumber: async ({ page }, use, testInfo)=>{
271
+ await generateAiFunction({
272
+ page,
273
+ testInfo,
274
+ use,
275
+ aiActionType: 'aiNumber'
276
+ });
277
+ },
278
+ aiString: async ({ page }, use, testInfo)=>{
279
+ await generateAiFunction({
280
+ page,
281
+ testInfo,
282
+ use,
283
+ aiActionType: 'aiString'
284
+ });
285
+ },
286
+ aiBoolean: async ({ page }, use, testInfo)=>{
287
+ await generateAiFunction({
288
+ page,
289
+ testInfo,
290
+ use,
291
+ aiActionType: 'aiBoolean'
292
+ });
293
+ },
294
+ aiAsk: async ({ page }, use, testInfo)=>{
295
+ await generateAiFunction({
296
+ page,
297
+ testInfo,
298
+ use,
299
+ aiActionType: 'aiAsk'
300
+ });
301
+ },
302
+ runYaml: async ({ page }, use, testInfo)=>{
303
+ await generateAiFunction({
304
+ page,
305
+ testInfo,
306
+ use,
307
+ aiActionType: 'runYaml'
308
+ });
309
+ },
310
+ setAIActionContext: async ({ page }, use, testInfo)=>{
311
+ await generateAiFunction({
312
+ page,
313
+ testInfo,
314
+ use,
315
+ aiActionType: 'setAIActionContext'
316
+ });
317
+ },
318
+ evaluateJavaScript: async ({ page }, use, testInfo)=>{
319
+ await generateAiFunction({
320
+ page,
321
+ testInfo,
322
+ use,
323
+ aiActionType: 'evaluateJavaScript'
324
+ });
325
+ },
326
+ logScreenshot: async ({ page }, use, testInfo)=>{
327
+ await generateAiFunction({
328
+ page,
329
+ testInfo,
330
+ use,
331
+ aiActionType: 'logScreenshot'
332
+ });
333
+ },
334
+ freezePageContext: async ({ page }, use, testInfo)=>{
335
+ await generateAiFunction({
336
+ page,
337
+ testInfo,
338
+ use,
339
+ aiActionType: 'freezePageContext'
340
+ });
341
+ },
342
+ unfreezePageContext: async ({ page }, use, testInfo)=>{
343
+ await generateAiFunction({
344
+ page,
345
+ testInfo,
346
+ use,
347
+ aiActionType: 'unfreezePageContext'
348
+ });
349
+ }
350
+ };
351
+ };
352
+ exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
353
+ exports.midsceneDumpAnnotationId = __webpack_exports__.midsceneDumpAnnotationId;
354
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
355
+ "PlaywrightAiFixture",
356
+ "midsceneDumpAnnotationId"
357
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
358
+ Object.defineProperty(exports, '__esModule', {
359
+ value: true
360
+ });
361
+
362
+ //# sourceMappingURL=ai-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright\\ai-fixture.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/playwright/ai-fixture.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 { writeFileSync } from 'node:fs';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { PlaywrightAgent, type PlaywrightWebPage } from '@/playwright/index';\r\nimport type { WebPageAgentOpt } from '@/web-element';\r\nimport type { Cache } from '@sqaitech/core';\r\nimport type { AgentOpt, Agent as PageAgent } from '@sqaitech/core/agent';\r\nimport { processCacheConfig } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { replaceIllegalPathCharsAndSpace } from '@sqaitech/shared/utils';\r\nimport { type TestInfo, type TestType, test } from '@playwright/test';\r\nimport type { Page as OriginPlaywrightPage } from 'playwright';\r\nexport type APITestType = Pick<TestType<any, any>, 'step'>;\r\n\r\nconst debugPage = getDebug('web:playwright:ai-fixture');\r\n\r\nconst groupAndCaseForTest = (testInfo: TestInfo) => {\r\n let taskFile: string;\r\n let taskTitle: string;\r\n const titlePath = [...testInfo.titlePath];\r\n\r\n if (titlePath.length > 1) {\r\n taskFile = titlePath.shift() || 'unnamed';\r\n taskTitle = titlePath.join('__');\r\n } else if (titlePath.length === 1) {\r\n taskTitle = titlePath[0];\r\n taskFile = `${taskTitle}`;\r\n } else {\r\n taskTitle = 'unnamed';\r\n taskFile = 'unnamed';\r\n }\r\n\r\n const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;\r\n\r\n return {\r\n file: taskFile,\r\n id: replaceIllegalPathCharsAndSpace(`${taskFile}(${taskTitle})`),\r\n title: replaceIllegalPathCharsAndSpace(taskTitleWithRetry),\r\n };\r\n};\r\n\r\nconst midsceneAgentKeyId = '_midsceneAgentId';\r\nexport const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';\r\n\r\ntype PlaywrightCacheConfig = {\r\n strategy?: 'read-only' | 'read-write' | 'write-only';\r\n id?: string;\r\n};\r\ntype PlaywrightCache = false | true | PlaywrightCacheConfig;\r\n\r\nexport const PlaywrightAiFixture = (options?: {\r\n forceSameTabNavigation?: boolean;\r\n waitForNetworkIdleTimeout?: number;\r\n waitForNavigationTimeout?: number;\r\n cache?: PlaywrightCache;\r\n}) => {\r\n const {\r\n forceSameTabNavigation = true,\r\n waitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n waitForNavigationTimeout = DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n cache,\r\n } = options ?? {};\r\n\r\n // Helper function to process cache configuration and auto-generate ID from test info\r\n const processTestCacheConfig = (testInfo: TestInfo): Cache | undefined => {\r\n // Generate ID from test info\r\n const { id } = groupAndCaseForTest(testInfo);\r\n\r\n // Use shared processCacheConfig with generated ID as fallback\r\n return processCacheConfig(cache as Cache, id);\r\n };\r\n\r\n const pageAgentMap: Record<string, PageAgent<PlaywrightWebPage>> = {};\r\n const createOrReuseAgentForPage = (\r\n page: OriginPlaywrightPage,\r\n testInfo: TestInfo, // { testId: string; taskFile: string; taskTitle: string },\r\n opts?: WebPageAgentOpt,\r\n ) => {\r\n let idForPage = (page as any)[midsceneAgentKeyId];\r\n if (!idForPage) {\r\n idForPage = uuid();\r\n (page as any)[midsceneAgentKeyId] = idForPage;\r\n const { testId } = testInfo;\r\n const { file, title } = groupAndCaseForTest(testInfo);\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n pageAgentMap[idForPage] = new PlaywrightAgent(page, {\r\n testId: `playwright-${testId}-${idForPage}`,\r\n forceSameTabNavigation,\r\n cache: cacheConfig,\r\n groupName: title,\r\n groupDescription: file,\r\n generateReport: false, // we will generate it in the reporter\r\n ...opts,\r\n });\r\n\r\n pageAgentMap[idForPage].onDumpUpdate = (dump: string) => {\r\n updateDumpAnnotation(testInfo, dump);\r\n };\r\n\r\n page.on('close', () => {\r\n debugPage('page closed');\r\n pageAgentMap[idForPage].destroy();\r\n delete pageAgentMap[idForPage];\r\n });\r\n }\r\n\r\n return pageAgentMap[idForPage];\r\n };\r\n\r\n async function generateAiFunction(options: {\r\n page: OriginPlaywrightPage;\r\n testInfo: TestInfo;\r\n use: any;\r\n aiActionType:\r\n | 'ai'\r\n | 'aiAction'\r\n | 'aiHover'\r\n | 'aiInput'\r\n | 'aiKeyboardPress'\r\n | 'aiScroll'\r\n | 'aiTap'\r\n | 'aiRightClick'\r\n | 'aiDoubleClick'\r\n | 'aiQuery'\r\n | 'aiAssert'\r\n | 'aiWaitFor'\r\n | 'aiLocate'\r\n | 'aiNumber'\r\n | 'aiString'\r\n | 'aiBoolean'\r\n | 'aiAsk'\r\n | 'runYaml'\r\n | 'setAIActionContext'\r\n | 'evaluateJavaScript'\r\n | 'logScreenshot'\r\n | 'freezePageContext'\r\n | 'unfreezePageContext';\r\n }) {\r\n const { page, testInfo, use, aiActionType } = options;\r\n const agent = createOrReuseAgentForPage(page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n }) as PlaywrightAgent;\r\n\r\n await use(async (taskPrompt: string, ...args: any[]) => {\r\n return new Promise((resolve, reject) => {\r\n test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async () => {\r\n try {\r\n debugPage(\r\n `waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`,\r\n );\r\n await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);\r\n } catch (error) {\r\n console.warn(\r\n '[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n try {\r\n type AgentMethod = (\r\n prompt: string,\r\n ...restArgs: any[]\r\n ) => Promise<any>;\r\n const result = await (agent[aiActionType] as AgentMethod)(\r\n taskPrompt,\r\n ...(args || []),\r\n );\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n const updateDumpAnnotation = (test: TestInfo, dump: string) => {\r\n // Write dump to temporary file\r\n const tempFileName = `midscene-dump-${test.testId || uuid()}-${Date.now()}.json`;\r\n const tempFilePath = join(tmpdir(), tempFileName);\r\n\r\n writeFileSync(tempFilePath, dump, 'utf-8');\r\n debugPage(`Dump written to temp file: ${tempFilePath}`);\r\n\r\n // Store only the file path in annotation\r\n const currentAnnotation = test.annotations.find((item) => {\r\n return item.type === midsceneDumpAnnotationId;\r\n });\r\n if (currentAnnotation) {\r\n // Store file path instead of dump content\r\n currentAnnotation.description = tempFilePath;\r\n } else {\r\n test.annotations.push({\r\n type: midsceneDumpAnnotationId,\r\n description: tempFilePath,\r\n });\r\n }\r\n };\r\n\r\n return {\r\n agentForPage: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await use(\r\n async (\r\n propsPage?: OriginPlaywrightPage | undefined,\r\n opts?: AgentOpt,\r\n ) => {\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n // Handle cache configuration priority:\r\n // 1. If user provides cache in opts, use it (but auto-generate ID if missing)\r\n // 2. Otherwise use fixture's cache config\r\n let finalCacheConfig = cacheConfig;\r\n if (opts?.cache !== undefined) {\r\n const userCache = opts.cache;\r\n if (userCache === false) {\r\n finalCacheConfig = false;\r\n } else if (userCache === true) {\r\n // Auto-generate ID for user's cache: true\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { id };\r\n } else if (typeof userCache === 'object') {\r\n if (!userCache.id) {\r\n // Auto-generate ID for user's cache object without ID\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { ...userCache, id };\r\n } else {\r\n finalCacheConfig = userCache;\r\n }\r\n }\r\n }\r\n\r\n const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n cache: finalCacheConfig,\r\n ...opts,\r\n });\r\n return agent;\r\n },\r\n );\r\n },\r\n ai: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'ai',\r\n });\r\n },\r\n aiAction: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAction',\r\n });\r\n },\r\n aiTap: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiTap',\r\n });\r\n },\r\n aiRightClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiRightClick',\r\n });\r\n },\r\n aiDoubleClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiDoubleClick',\r\n });\r\n },\r\n aiHover: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiHover',\r\n });\r\n },\r\n aiInput: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiInput',\r\n });\r\n },\r\n aiKeyboardPress: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiKeyboardPress',\r\n });\r\n },\r\n aiScroll: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiScroll',\r\n });\r\n },\r\n aiQuery: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiQuery',\r\n });\r\n },\r\n aiAssert: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAssert',\r\n });\r\n },\r\n aiWaitFor: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiWaitFor',\r\n });\r\n },\r\n aiLocate: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiLocate',\r\n });\r\n },\r\n aiNumber: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiNumber',\r\n });\r\n },\r\n aiString: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiString',\r\n });\r\n },\r\n aiBoolean: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiBoolean',\r\n });\r\n },\r\n aiAsk: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAsk',\r\n });\r\n },\r\n runYaml: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'runYaml',\r\n });\r\n },\r\n setAIActionContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'setAIActionContext',\r\n });\r\n },\r\n evaluateJavaScript: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'evaluateJavaScript',\r\n });\r\n },\r\n logScreenshot: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'logScreenshot',\r\n });\r\n },\r\n freezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'freezePageContext',\r\n });\r\n },\r\n unfreezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'unfreezePageContext',\r\n });\r\n },\r\n };\r\n};\r\n\r\nexport type PlayWrightAiFixtureType = {\r\n agentForPage: (\r\n page?: any,\r\n opts?: any,\r\n ) => Promise<PageAgent<PlaywrightWebPage>>;\r\n ai: <T = any>(prompt: string) => Promise<T>;\r\n aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;\r\n aiTap: (\r\n ...args: Parameters<PageAgent['aiTap']>\r\n ) => ReturnType<PageAgent['aiTap']>;\r\n aiRightClick: (\r\n ...args: Parameters<PageAgent['aiRightClick']>\r\n ) => ReturnType<PageAgent['aiRightClick']>;\r\n aiDoubleClick: (\r\n ...args: Parameters<PageAgent['aiDoubleClick']>\r\n ) => ReturnType<PageAgent['aiDoubleClick']>;\r\n aiHover: (\r\n ...args: Parameters<PageAgent['aiHover']>\r\n ) => ReturnType<PageAgent['aiHover']>;\r\n aiInput: (\r\n ...args: Parameters<PageAgent['aiInput']>\r\n ) => ReturnType<PageAgent['aiInput']>;\r\n aiKeyboardPress: (\r\n ...args: Parameters<PageAgent['aiKeyboardPress']>\r\n ) => ReturnType<PageAgent['aiKeyboardPress']>;\r\n aiScroll: (\r\n ...args: Parameters<PageAgent['aiScroll']>\r\n ) => ReturnType<PageAgent['aiScroll']>;\r\n aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;\r\n aiAssert: (\r\n ...args: Parameters<PageAgent['aiAssert']>\r\n ) => ReturnType<PageAgent['aiAssert']>;\r\n aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;\r\n aiLocate: (\r\n ...args: Parameters<PageAgent['aiLocate']>\r\n ) => ReturnType<PageAgent['aiLocate']>;\r\n aiNumber: (\r\n ...args: Parameters<PageAgent['aiNumber']>\r\n ) => ReturnType<PageAgent['aiNumber']>;\r\n aiString: (\r\n ...args: Parameters<PageAgent['aiString']>\r\n ) => ReturnType<PageAgent['aiString']>;\r\n aiBoolean: (\r\n ...args: Parameters<PageAgent['aiBoolean']>\r\n ) => ReturnType<PageAgent['aiBoolean']>;\r\n aiAsk: (\r\n ...args: Parameters<PageAgent['aiAsk']>\r\n ) => ReturnType<PageAgent['aiAsk']>;\r\n runYaml: (\r\n ...args: Parameters<PageAgent['runYaml']>\r\n ) => ReturnType<PageAgent['runYaml']>;\r\n setAIActionContext: (\r\n ...args: Parameters<PageAgent['setAIActionContext']>\r\n ) => ReturnType<PageAgent['setAIActionContext']>;\r\n evaluateJavaScript: (\r\n ...args: Parameters<PageAgent['evaluateJavaScript']>\r\n ) => ReturnType<PageAgent['evaluateJavaScript']>;\r\n logScreenshot: (\r\n ...args: Parameters<PageAgent['logScreenshot']>\r\n ) => ReturnType<PageAgent['logScreenshot']>;\r\n freezePageContext: (\r\n ...args: Parameters<PageAgent['freezePageContext']>\r\n ) => ReturnType<PageAgent['freezePageContext']>;\r\n unfreezePageContext: (\r\n ...args: Parameters<PageAgent['unfreezePageContext']>\r\n ) => ReturnType<PageAgent['unfreezePageContext']>;\r\n};\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","groupAndCaseForTest","testInfo","taskFile","taskTitle","titlePath","taskTitleWithRetry","replaceIllegalPathCharsAndSpace","midsceneAgentKeyId","midsceneDumpAnnotationId","PlaywrightAiFixture","options","forceSameTabNavigation","waitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","waitForNavigationTimeout","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","cache","processTestCacheConfig","id","processCacheConfig","pageAgentMap","createOrReuseAgentForPage","page","opts","idForPage","uuid","testId","file","title","cacheConfig","PlaywrightAgent","dump","updateDumpAnnotation","generateAiFunction","use","aiActionType","agent","taskPrompt","args","Promise","resolve","reject","test","JSON","error","console","result","tempFileName","Date","tempFilePath","join","tmpdir","writeFileSync","currentAnnotation","item","propsPage","finalCacheConfig","undefined","userCache"],"mappings":"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ACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,OAAO,OACL,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,eAAe,OACb,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,mBAAmB,OACjB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,qBAAqB,OACnB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;IACF;AACF"}