@midscene/web 1.3.8 → 1.3.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"puppeteer/base-page.mjs","sources":["../../../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 '@midscene/core';\nimport {\n AiJudgeOrderSensitive,\n callAIWithObjectResponse,\n} from '@midscene/core/ai-model';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type 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{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation() {\n 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 '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(): 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 '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n } 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 private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: {\n targetDescription?: string;\n modelConfig?: IModelConfig;\n },\n ): Promise<ElementCacheFeature> {\n const point: Point = {\n left: center[0],\n top: center[1],\n };\n\n try {\n // Determine isOrderSensitive\n let isOrderSensitive = false;\n if (options?.targetDescription && options?.modelConfig) {\n try {\n const judgeResult = await AiJudgeOrderSensitive(\n options.targetDescription,\n callAIWithObjectResponse,\n options.modelConfig,\n );\n isOrderSensitive = judgeResult.isOrderSensitive;\n debugPage(\n 'judged isOrderSensitive=%s for description: %s',\n isOrderSensitive,\n options.targetDescription,\n );\n } catch (error) {\n debugPage('Failed to judge isOrderSensitive: %s', error);\n // Fall back to false on error\n }\n }\n\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return {\n xpaths: sanitized,\n };\n } catch (error) {\n debugPage('cacheFeatureForPoint 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 debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n 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 debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation();\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: 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 if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n element &&\n (await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n }));\n await backspace();\n }\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async reload(): Promise<void> {\n debugPage('reload page');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).reload();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).reload();\n } else {\n throw new Error('Unsupported page type for reload');\n }\n }\n\n async goBack(): Promise<void> {\n debugPage('go back');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goBack();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goBack();\n } else {\n throw new Error('Unsupported page type for go back');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await this.waitForNavigation();\n await 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 private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n (id, content) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n styleId,\n styleContent,\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","JSON","center","options","judgeResult","AiJudgeOrderSensitive","callAIWithObjectResponse","sanitized","feature","webFeature","elementInfo","matchedRect","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","button","count","page","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","key","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","Promise","resolve","setTimeout","res","session","handler","capturedError","event","undefined","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","style","err"],"mappings":"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"}
1
+ {"version":3,"file":"puppeteer/base-page.mjs","sources":["../../../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 '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface\n{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation() {\n 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 '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(): 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 '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n } 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 private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debugPage);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return { xpaths: sanitized };\n } catch (error) {\n debugPage('cacheFeatureForPoint failed: %s', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n return buildRectFromElementInfo(elementInfo, this.viewportSize?.dpr);\n }\n debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation();\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: 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 if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n element &&\n (await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n }));\n await backspace();\n }\n\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n element && (await this.mouse.click(element.center[0], element.center[1]));\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async reload(): Promise<void> {\n debugPage('reload page');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).reload();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).reload();\n } else {\n throw new Error('Unsupported page type for reload');\n }\n }\n\n async goBack(): Promise<void> {\n debugPage('go back');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goBack();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goBack();\n } else {\n throw new Error('Unsupported page type for go back');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await this.waitForNavigation();\n await 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 private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n (id, content) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n styleId,\n styleContent,\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["debugPage","getDebug","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","button","count","page","deltaX","deltaY","from","to","sleep","text","action","keys","Array","k","commands","key","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","Promise","resolve","setTimeout","res","session","handler","capturedError","event","undefined","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","style","err"],"mappings":"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"}
@@ -45,7 +45,7 @@ class BridgeClient {
45
45
  this.socket = (0, external_socket_io_client_namespaceObject.io)(this.endpoint, {
46
46
  reconnection: false,
47
47
  query: {
48
- version: "1.3.8"
48
+ version: "1.3.9"
49
49
  }
50
50
  });
51
51
  const timeout = setTimeout(()=>{
@@ -104,7 +104,7 @@ class BridgeServer {
104
104
  (0, shared_utils_namespaceObject.logMsg)('one client connected');
105
105
  this.socket = socket;
106
106
  const clientVersion = socket.handshake.query.version;
107
- (0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.3.8, browser-side version v${clientVersion}`);
107
+ (0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.3.9, browser-side version v${clientVersion}`);
108
108
  socket.on(external_common_js_namespaceObject.BridgeEvent.CallResponse, (params)=>{
109
109
  const id = params.id;
110
110
  const response = params.response;
@@ -129,7 +129,7 @@ class BridgeServer {
129
129
  setTimeout(()=>{
130
130
  this.onConnect?.();
131
131
  const payload = {
132
- version: "1.3.8"
132
+ version: "1.3.9"
133
133
  };
134
134
  socket.emit(external_common_js_namespaceObject.BridgeEvent.Connected, payload);
135
135
  Promise.resolve().then(()=>{
@@ -84,7 +84,7 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
84
84
  }
85
85
  }, ()=>this.destroy());
86
86
  await this.bridgeClient.connect();
87
- this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.3.8`, 'log');
87
+ this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.3.9`, 'log');
88
88
  }
89
89
  async connect() {
90
90
  return await this.setupBridgeClient();
@@ -29,7 +29,9 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const external_web_element_js_namespaceObject = require("../web-element.js");
30
30
  const extractor_namespaceObject = require("@midscene/shared/extractor");
31
31
  const img_namespaceObject = require("@midscene/shared/img");
32
+ const logger_namespaceObject = require("@midscene/shared/logger");
32
33
  const utils_namespaceObject = require("@midscene/shared/utils");
34
+ const cache_helper_js_namespaceObject = require("../common/cache-helper.js");
33
35
  const external_web_page_js_namespaceObject = require("../web-page.js");
34
36
  const external_cdpInput_js_namespaceObject = require("./cdpInput.js");
35
37
  const external_dynamic_scripts_js_namespaceObject = require("./dynamic-scripts.js");
@@ -43,6 +45,7 @@ function _define_property(obj, key, value) {
43
45
  else obj[key] = value;
44
46
  return obj;
45
47
  }
48
+ const debug = (0, logger_namespaceObject.getDebug)('web:chrome-extension:page');
46
49
  function sleep(ms) {
47
50
  return new Promise((resolve)=>setTimeout(resolve, ms));
48
51
  }
@@ -261,6 +264,34 @@ class ChromeExtensionProxyPage {
261
264
  });
262
265
  return result.result.value;
263
266
  }
267
+ async cacheFeatureForPoint(center, options) {
268
+ const point = {
269
+ left: center[0],
270
+ top: center[1]
271
+ };
272
+ try {
273
+ const isOrderSensitive = await (0, cache_helper_js_namespaceObject.judgeOrderSensitive)(options, debug);
274
+ const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);
275
+ return {
276
+ xpaths: (0, cache_helper_js_namespaceObject.sanitizeXpaths)(xpaths)
277
+ };
278
+ } catch (error) {
279
+ debug('cacheFeatureForPoint failed: %O', error);
280
+ return {
281
+ xpaths: []
282
+ };
283
+ }
284
+ }
285
+ async rectMatchesCacheFeature(feature) {
286
+ const xpaths = (0, cache_helper_js_namespaceObject.sanitizeXpaths)(feature.xpaths);
287
+ for (const xpath of xpaths)try {
288
+ const elementInfo = await this.getElementInfoByXpath(xpath);
289
+ if (elementInfo?.rect) return (0, cache_helper_js_namespaceObject.buildRectFromElementInfo)(elementInfo, this.viewportSize?.dpr);
290
+ } catch (error) {
291
+ debug('rectMatchesCacheFeature failed for xpath %s: %O', xpath, error);
292
+ }
293
+ throw new Error(`No matching element rect found for cache feature (tried ${xpaths.length} xpath(s))`);
294
+ }
264
295
  async getElementsNodeTree() {
265
296
  await this.hideMousePointer();
266
297
  const content = await this.getPageContentByCDP();
@@ -1 +1 @@
1
- {"version":3,"file":"chrome-extension/page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../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\" />\n\n/*\n It is used to interact with the page tab from the chrome extension.\n The page must be active when interacting with it.\n*/\n\nimport { limitOpenNewTabScript } from '@/web-element';\nimport type { ElementTreeNode, Point, Size, UIContext } from '@midscene/core';\nimport type { AbstractInterface, DeviceAction } from '@midscene/core/device';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { assert } from '@midscene/shared/utils';\nimport type { Protocol as CDPTypes } from 'devtools-protocol';\nimport { WebPageContextParser } from '../web-element';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\nimport { CdpKeyboard } from './cdpInput';\nimport {\n getHtmlElementScript,\n injectStopWaterFlowAnimation,\n injectWaterFlowAnimation,\n} from './dynamic-scripts';\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport default class ChromeExtensionProxyPage implements AbstractInterface {\n interfaceType = 'chrome-extension-proxy';\n\n public forceSameTabNavigation: boolean;\n\n private viewportSize?: Size;\n\n private activeTabId: number | null = null;\n\n private destroyed = false;\n\n private isMobileEmulation: boolean | null = null;\n\n public _continueWhenFailedToAttachDebugger = false;\n\n constructor(forceSameTabNavigation: boolean) {\n this.forceSameTabNavigation = forceSameTabNavigation;\n }\n\n actionSpace(): DeviceAction[] {\n return commonWebActionsForWebPage(this);\n }\n\n public async setActiveTabId(tabId: number) {\n if (this.activeTabId) {\n throw new Error(\n `Active tab id is already set, which is ${this.activeTabId}, cannot set it to ${tabId}`,\n );\n }\n await chrome.tabs.update(tabId, { active: true });\n this.activeTabId = tabId;\n }\n\n public async getActiveTabId() {\n return this.activeTabId;\n }\n\n /**\n * Get a list of current tabs\n * @returns {Promise<Array<{id: number, title: string, url: string}>>}\n */\n public async getBrowserTabList(): Promise<\n { id: string; title: string; url: string; currentActiveTab: boolean }[]\n > {\n const tabs = await chrome.tabs.query({ currentWindow: true });\n return tabs\n .map((tab) => ({\n id: `${tab.id}`,\n title: tab.title,\n url: tab.url,\n currentActiveTab: tab.active,\n }))\n .filter((tab) => tab.id && tab.title && tab.url) as {\n id: string;\n title: string;\n url: string;\n currentActiveTab: boolean;\n }[];\n }\n\n public async getTabIdOrConnectToCurrentTab() {\n if (this.activeTabId) {\n // alway keep on the connected tab\n return this.activeTabId;\n }\n const tabId = await chrome.tabs\n .query({ active: true, currentWindow: true })\n .then((tabs) => tabs[0]?.id);\n this.activeTabId = tabId || 0;\n return this.activeTabId;\n }\n\n /**\n * Ensure debugger is attached to the current tab.\n * Uses lazy attach pattern - only attaches when needed.\n */\n private async ensureDebuggerAttached() {\n assert(!this.destroyed, 'Page is destroyed');\n\n const url = await this.url();\n if (url.startsWith('chrome://')) {\n throw new Error(\n 'Cannot attach debugger to chrome:// pages, please use Midscene in a normal page with http://, https:// or file://',\n );\n }\n\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n try {\n await chrome.debugger.attach({ tabId }, '1.3');\n console.log('Debugger attached to tab:', tabId);\n } catch (error) {\n const errorMsg = (error as Error)?.message || '';\n // Already attached is OK, we can continue\n if (errorMsg.includes('Another debugger is already attached')) {\n console.log('Debugger already attached to tab:', tabId);\n return;\n }\n\n if (this._continueWhenFailedToAttachDebugger) {\n console.warn(\n 'Failed to attach debugger, but continuing due to _continueWhenFailedToAttachDebugger flag',\n error,\n );\n return;\n }\n\n throw error;\n }\n\n // Wait for debugger banner in Chrome to appear\n await sleep(500);\n\n // Enable water flow animation\n await this.enableWaterFlowAnimation();\n }\n\n private async showMousePointer(x: number, y: number) {\n // update mouse pointer while redirecting\n const pointerScript = `(() => {\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\n window.midsceneWaterFlowAnimation.enable();\n window.midsceneWaterFlowAnimation.showMousePointer(${x}, ${y});\n } else {\n console.log('midsceneWaterFlowAnimation is not defined');\n }\n })()`;\n\n await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `${pointerScript}`,\n });\n }\n\n private async hideMousePointer() {\n await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\n window.midsceneWaterFlowAnimation.hideMousePointer();\n }\n })()`,\n });\n }\n\n /**\n * Public method to detach debugger without destroying the page instance.\n * Useful for error recovery scenarios where we want to remove the debugger banner\n * without completely destroying the page.\n */\n public async detachDebugger(tabId?: number) {\n const tabIdToDetach = tabId || (await this.getTabIdOrConnectToCurrentTab());\n console.log('detaching debugger from tab:', tabIdToDetach);\n\n try {\n await this.disableWaterFlowAnimation(tabIdToDetach);\n await sleep(200); // wait for the animation to stop\n } catch (error) {\n console.warn('Failed to disable water flow animation', error);\n }\n\n try {\n await chrome.debugger.detach({ tabId: tabIdToDetach });\n console.log('Debugger detached successfully from tab:', tabIdToDetach);\n } catch (error) {\n // Tab might be closed or debugger already detached - this is OK\n console.warn(\n 'Failed to detach debugger (may already be detached):',\n error,\n );\n }\n }\n\n private async enableWaterFlowAnimation() {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n // limit open page in new tab\n if (this.forceSameTabNavigation) {\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: limitOpenNewTabScript,\n });\n }\n\n const script = await injectWaterFlowAnimation();\n // we will call this function in sendCommandToDebugger, so we have to use the chrome.debugger.sendCommand\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: script,\n });\n }\n\n private async disableWaterFlowAnimation(tabId: number) {\n const script = await injectStopWaterFlowAnimation();\n\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: script,\n });\n }\n\n /**\n * Send a command to the debugger with automatic attach and retry on detachment.\n * Uses lazy attach pattern - will automatically attach if not already attached.\n */\n private async sendCommandToDebugger<ResponseType = any, RequestType = any>(\n command: string,\n params: RequestType,\n retryCount = 0,\n ): Promise<ResponseType> {\n const MAX_RETRIES = 2;\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n try {\n // Try to send command directly first\n const result = (await chrome.debugger.sendCommand(\n { tabId },\n command,\n params as any,\n )) as ResponseType;\n\n // Enable water flow animation after successful command (don't await)\n this.enableWaterFlowAnimation().catch((err) => {\n console.warn('Failed to enable water flow animation:', err);\n });\n\n return result;\n } catch (error) {\n // If command failed, check if it's because debugger is not attached\n const errorMsg = (error as Error)?.message || '';\n const isDetachError =\n errorMsg.includes('Debugger is not attached') ||\n errorMsg.includes('Cannot access a Target') ||\n errorMsg.includes('No target with given id');\n\n if (isDetachError && retryCount < MAX_RETRIES) {\n console.log(\n `Debugger not attached for command \"${command}\", attempting to attach (retry ${retryCount + 1}/${MAX_RETRIES})`,\n );\n\n // Try to attach and retry\n await this.ensureDebuggerAttached();\n\n return this.sendCommandToDebugger<ResponseType, RequestType>(\n command,\n params,\n retryCount + 1,\n );\n }\n\n // Not a detach error or out of retries\n throw error;\n }\n }\n\n private async getPageContentByCDP() {\n const script = await getHtmlElementScript();\n\n // check tab url\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n\n const expression = () => {\n const tree = (\n window as any\n ).midscene_element_inspector.webExtractNodeTree();\n\n return {\n tree,\n size: {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n },\n };\n };\n const returnValue = await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: `(${expression.toString()})()`,\n returnByValue: true,\n });\n\n if (!returnValue.result.value) {\n const errorDescription =\n returnValue.exceptionDetails?.exception?.description || '';\n if (!errorDescription) {\n console.error('returnValue from cdp', returnValue);\n }\n throw new Error(\n `Failed to get page content from page, error: ${errorDescription}`,\n );\n }\n\n return returnValue.result.value as {\n tree: ElementTreeNode<ElementInfo>;\n size: Size;\n };\n }\n\n public async evaluateJavaScript(script: string) {\n return this.sendCommandToDebugger('Runtime.evaluate', {\n expression: script,\n awaitPromise: true,\n });\n }\n\n async beforeInvokeAction(): Promise<void> {\n // current implementation is wait until domReadyState is complete\n try {\n await this.waitUntilNetworkIdle();\n } catch (error) {\n // console.warn('Failed to wait until network idle', error);\n }\n }\n\n private async waitUntilNetworkIdle() {\n const timeout = 10000;\n const startTime = Date.now();\n let lastReadyState = '';\n while (Date.now() - startTime < timeout) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: 'document.readyState',\n });\n lastReadyState = result.result.value;\n if (lastReadyState === 'complete') {\n await new Promise((resolve) => setTimeout(resolve, 300));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n }\n throw new Error(\n `Failed to wait until network idle, last readyState: ${lastReadyState}`,\n );\n }\n\n // @deprecated\n async getElementsInfo() {\n const tree = await this.getElementsNodeTree();\n return treeToList(tree);\n }\n\n async getXpathsByPoint(point: Point, isOrderSensitive = false) {\n const script = await getHtmlElementScript();\n\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `window.midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n returnByValue: true,\n });\n return result.result.value;\n }\n\n async getElementInfoByXpath(xpath: string) {\n const script = await getHtmlElementScript();\n\n // check tab url\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `window.midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n returnByValue: true,\n });\n return result.result.value;\n }\n\n async getElementsNodeTree() {\n await this.hideMousePointer();\n const content = await this.getPageContentByCDP();\n if (content?.size) {\n this.viewportSize = content.size;\n }\n\n return content?.tree || { node: null, children: [] };\n }\n\n async getContext(): Promise<UIContext> {\n return await WebPageContextParser(this, {});\n }\n\n async size() {\n if (this.viewportSize) return this.viewportSize;\n\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression:\n '({width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, dpr: window.devicePixelRatio})',\n returnByValue: true,\n });\n\n const sizeInfo: Size = result.result.value;\n console.log('sizeInfo', sizeInfo);\n\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64() {\n // screenshot by cdp\n await this.hideMousePointer();\n const format = 'jpeg';\n const base64 = await this.sendCommandToDebugger('Page.captureScreenshot', {\n format,\n quality: 90,\n });\n return createImgBase64ByFormat(format, base64.data);\n }\n\n async url() {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n const url = await chrome.tabs.get(tabId).then((tab) => tab.url);\n return url || '';\n }\n\n async navigate(url: string): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.update(tabId, { url });\n // Wait for navigation to complete\n // Note: debugger will auto-reattach on next command if detached during navigation\n await this.waitUntilNetworkIdle();\n }\n\n async reload(): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.reload(tabId);\n // Wait for reload to complete\n await this.waitUntilNetworkIdle();\n }\n\n async goBack(): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.goBack(tabId);\n // Wait for navigation to complete\n await this.waitUntilNetworkIdle();\n }\n\n async scrollUntilTop(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point) {\n const { height } = await this.size();\n const scrollDistance = distance || height * 0.7;\n return this.mouse.wheel(\n 0,\n -scrollDistance,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollDown(distance?: number, startingPoint?: Point) {\n const { height } = await this.size();\n const scrollDistance = distance || height * 0.7;\n return this.mouse.wheel(\n 0,\n scrollDistance,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point) {\n const { width } = await this.size();\n const scrollDistance = distance || width * 0.7;\n return this.mouse.wheel(\n -scrollDistance,\n 0,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollRight(distance?: number, startingPoint?: Point) {\n const { width } = await this.size();\n const scrollDistance = distance || width * 0.7;\n return this.mouse.wheel(\n scrollDistance,\n 0,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async clearInput(element: ElementInfo) {\n if (!element) {\n console.warn('No element to clear input');\n return;\n }\n\n await this.mouse.click(element.center[0], element.center[1]);\n\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\n type: 'keyDown',\n commands: ['selectAll'],\n });\n\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\n type: 'keyUp',\n commands: ['selectAll'],\n });\n\n await sleep(100);\n\n await this.keyboard.press({\n key: 'Backspace',\n });\n }\n\n private latestMouseX = 100;\n private latestMouseY = 100;\n\n mouse = {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n const { button = 'left', count = 1 } = options || {};\n await this.mouse.move(x, y);\n // detect if the page is in mobile emulation mode\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n if (this.isMobileEmulation && button === 'left') {\n // in mobile emulation mode, directly inject click event\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints,\n modifiers: 0,\n });\n\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n // standard mousePressed + mouseReleased\n for (let i = 0; i < count; i++) {\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x,\n y,\n button,\n clickCount: 1,\n });\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x,\n y,\n button,\n clickCount: 1,\n });\n await sleep(50);\n }\n }\n },\n wheel: async (\n deltaX: number,\n deltaY: number,\n startX?: number,\n startY?: number,\n ) => {\n const finalX = startX || this.latestMouseX;\n const finalY = startY || this.latestMouseY;\n await this.showMousePointer(finalX, finalY);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseWheel',\n x: finalX,\n y: finalY,\n deltaX,\n deltaY,\n });\n this.latestMouseX = finalX;\n this.latestMouseY = finalY;\n },\n move: async (x: number, y: number) => {\n await this.showMousePointer(x, y);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseMoved',\n x,\n y,\n });\n this.latestMouseX = x;\n this.latestMouseY = y;\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n await this.mouse.move(from.x, from.y);\n\n await sleep(200);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n });\n\n await sleep(300);\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseMoved',\n x: to.x,\n y: to.y,\n });\n\n await sleep(500);\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n });\n\n await sleep(200);\n\n await this.mouse.move(to.x, to.y);\n },\n };\n\n keyboard = {\n type: async (text: string) => {\n const cdpKeyboard = new CdpKeyboard({\n send: this.sendCommandToDebugger.bind(this),\n });\n await cdpKeyboard.type(text, { delay: 0 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const cdpKeyboard = new CdpKeyboard({\n send: this.sendCommandToDebugger.bind(this),\n });\n const keys = Array.isArray(action) ? action : [action];\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await cdpKeyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await cdpKeyboard.up(k.key);\n }\n },\n };\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n this.activeTabId = null;\n await this.detachDebugger();\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 await this.mouse.move(x, y);\n\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n if (this.isMobileEmulation) {\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints,\n modifiers: 0,\n });\n await new Promise((res) => setTimeout(res, duration));\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x,\n y,\n button: 'left',\n clickCount: 1,\n });\n await new Promise((res) => setTimeout(res, duration));\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x,\n y,\n button: 'left',\n clickCount: 1,\n });\n }\n this.latestMouseX = x;\n this.latestMouseY = y;\n }\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 || 300;\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\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n const steps = 30;\n const delay = duration / steps;\n\n if (this.isMobileEmulation) {\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: Math.round(from.x), y: Math.round(from.y) }],\n modifiers: 0,\n });\n\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 this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x: Math.round(x), y: Math.round(y) }],\n modifiers: 0,\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n await this.mouse.move(from.x, from.y);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n });\n\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 this.mouse.move(x, y);\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n });\n }\n\n this.latestMouseX = to.x;\n this.latestMouseY = to.y;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","sleep","ms","Promise","resolve","setTimeout","ChromeExtensionProxyPage","commonWebActionsForWebPage","tabId","Error","chrome","tabs","tab","assert","url","console","error","errorMsg","x","y","pointerScript","tabIdToDetach","limitOpenNewTabScript","script","injectWaterFlowAnimation","injectStopWaterFlowAnimation","command","params","retryCount","MAX_RETRIES","result","err","isDetachError","getHtmlElementScript","expression","tree","window","document","returnValue","errorDescription","timeout","startTime","Date","lastReadyState","treeToList","point","isOrderSensitive","xpath","JSON","content","WebPageContextParser","sizeInfo","format","base64","createImgBase64ByFormat","startingPoint","distance","height","scrollDistance","width","element","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","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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"}
1
+ {"version":3,"file":"chrome-extension/page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../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\" />\n\n/*\n It is used to interact with the page tab from the chrome extension.\n The page must be active when interacting with it.\n*/\n\nimport { limitOpenNewTabScript } from '@/web-element';\nimport type {\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n UIContext,\n} from '@midscene/core';\nimport type { AbstractInterface, DeviceAction } from '@midscene/core/device';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { Protocol as CDPTypes } from 'devtools-protocol';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport { WebPageContextParser } from '../web-element';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\nimport { CdpKeyboard } from './cdpInput';\nimport {\n getHtmlElementScript,\n injectStopWaterFlowAnimation,\n injectWaterFlowAnimation,\n} from './dynamic-scripts';\n\nconst debug = getDebug('web:chrome-extension:page');\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport default class ChromeExtensionProxyPage implements AbstractInterface {\n interfaceType = 'chrome-extension-proxy';\n\n public forceSameTabNavigation: boolean;\n\n private viewportSize?: Size;\n\n private activeTabId: number | null = null;\n\n private destroyed = false;\n\n private isMobileEmulation: boolean | null = null;\n\n public _continueWhenFailedToAttachDebugger = false;\n\n constructor(forceSameTabNavigation: boolean) {\n this.forceSameTabNavigation = forceSameTabNavigation;\n }\n\n actionSpace(): DeviceAction[] {\n return commonWebActionsForWebPage(this);\n }\n\n public async setActiveTabId(tabId: number) {\n if (this.activeTabId) {\n throw new Error(\n `Active tab id is already set, which is ${this.activeTabId}, cannot set it to ${tabId}`,\n );\n }\n await chrome.tabs.update(tabId, { active: true });\n this.activeTabId = tabId;\n }\n\n public async getActiveTabId() {\n return this.activeTabId;\n }\n\n /**\n * Get a list of current tabs\n * @returns {Promise<Array<{id: number, title: string, url: string}>>}\n */\n public async getBrowserTabList(): Promise<\n { id: string; title: string; url: string; currentActiveTab: boolean }[]\n > {\n const tabs = await chrome.tabs.query({ currentWindow: true });\n return tabs\n .map((tab) => ({\n id: `${tab.id}`,\n title: tab.title,\n url: tab.url,\n currentActiveTab: tab.active,\n }))\n .filter((tab) => tab.id && tab.title && tab.url) as {\n id: string;\n title: string;\n url: string;\n currentActiveTab: boolean;\n }[];\n }\n\n public async getTabIdOrConnectToCurrentTab() {\n if (this.activeTabId) {\n // alway keep on the connected tab\n return this.activeTabId;\n }\n const tabId = await chrome.tabs\n .query({ active: true, currentWindow: true })\n .then((tabs) => tabs[0]?.id);\n this.activeTabId = tabId || 0;\n return this.activeTabId;\n }\n\n /**\n * Ensure debugger is attached to the current tab.\n * Uses lazy attach pattern - only attaches when needed.\n */\n private async ensureDebuggerAttached() {\n assert(!this.destroyed, 'Page is destroyed');\n\n const url = await this.url();\n if (url.startsWith('chrome://')) {\n throw new Error(\n 'Cannot attach debugger to chrome:// pages, please use Midscene in a normal page with http://, https:// or file://',\n );\n }\n\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n try {\n await chrome.debugger.attach({ tabId }, '1.3');\n console.log('Debugger attached to tab:', tabId);\n } catch (error) {\n const errorMsg = (error as Error)?.message || '';\n // Already attached is OK, we can continue\n if (errorMsg.includes('Another debugger is already attached')) {\n console.log('Debugger already attached to tab:', tabId);\n return;\n }\n\n if (this._continueWhenFailedToAttachDebugger) {\n console.warn(\n 'Failed to attach debugger, but continuing due to _continueWhenFailedToAttachDebugger flag',\n error,\n );\n return;\n }\n\n throw error;\n }\n\n // Wait for debugger banner in Chrome to appear\n await sleep(500);\n\n // Enable water flow animation\n await this.enableWaterFlowAnimation();\n }\n\n private async showMousePointer(x: number, y: number) {\n // update mouse pointer while redirecting\n const pointerScript = `(() => {\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\n window.midsceneWaterFlowAnimation.enable();\n window.midsceneWaterFlowAnimation.showMousePointer(${x}, ${y});\n } else {\n console.log('midsceneWaterFlowAnimation is not defined');\n }\n })()`;\n\n await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `${pointerScript}`,\n });\n }\n\n private async hideMousePointer() {\n await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n if(typeof window.midsceneWaterFlowAnimation !== 'undefined') {\n window.midsceneWaterFlowAnimation.hideMousePointer();\n }\n })()`,\n });\n }\n\n /**\n * Public method to detach debugger without destroying the page instance.\n * Useful for error recovery scenarios where we want to remove the debugger banner\n * without completely destroying the page.\n */\n public async detachDebugger(tabId?: number) {\n const tabIdToDetach = tabId || (await this.getTabIdOrConnectToCurrentTab());\n console.log('detaching debugger from tab:', tabIdToDetach);\n\n try {\n await this.disableWaterFlowAnimation(tabIdToDetach);\n await sleep(200); // wait for the animation to stop\n } catch (error) {\n console.warn('Failed to disable water flow animation', error);\n }\n\n try {\n await chrome.debugger.detach({ tabId: tabIdToDetach });\n console.log('Debugger detached successfully from tab:', tabIdToDetach);\n } catch (error) {\n // Tab might be closed or debugger already detached - this is OK\n console.warn(\n 'Failed to detach debugger (may already be detached):',\n error,\n );\n }\n }\n\n private async enableWaterFlowAnimation() {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n // limit open page in new tab\n if (this.forceSameTabNavigation) {\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: limitOpenNewTabScript,\n });\n }\n\n const script = await injectWaterFlowAnimation();\n // we will call this function in sendCommandToDebugger, so we have to use the chrome.debugger.sendCommand\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: script,\n });\n }\n\n private async disableWaterFlowAnimation(tabId: number) {\n const script = await injectStopWaterFlowAnimation();\n\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.evaluate', {\n expression: script,\n });\n }\n\n /**\n * Send a command to the debugger with automatic attach and retry on detachment.\n * Uses lazy attach pattern - will automatically attach if not already attached.\n */\n private async sendCommandToDebugger<ResponseType = any, RequestType = any>(\n command: string,\n params: RequestType,\n retryCount = 0,\n ): Promise<ResponseType> {\n const MAX_RETRIES = 2;\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n\n try {\n // Try to send command directly first\n const result = (await chrome.debugger.sendCommand(\n { tabId },\n command,\n params as any,\n )) as ResponseType;\n\n // Enable water flow animation after successful command (don't await)\n this.enableWaterFlowAnimation().catch((err) => {\n console.warn('Failed to enable water flow animation:', err);\n });\n\n return result;\n } catch (error) {\n // If command failed, check if it's because debugger is not attached\n const errorMsg = (error as Error)?.message || '';\n const isDetachError =\n errorMsg.includes('Debugger is not attached') ||\n errorMsg.includes('Cannot access a Target') ||\n errorMsg.includes('No target with given id');\n\n if (isDetachError && retryCount < MAX_RETRIES) {\n console.log(\n `Debugger not attached for command \"${command}\", attempting to attach (retry ${retryCount + 1}/${MAX_RETRIES})`,\n );\n\n // Try to attach and retry\n await this.ensureDebuggerAttached();\n\n return this.sendCommandToDebugger<ResponseType, RequestType>(\n command,\n params,\n retryCount + 1,\n );\n }\n\n // Not a detach error or out of retries\n throw error;\n }\n }\n\n private async getPageContentByCDP() {\n const script = await getHtmlElementScript();\n\n // check tab url\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n\n const expression = () => {\n const tree = (\n window as any\n ).midscene_element_inspector.webExtractNodeTree();\n\n return {\n tree,\n size: {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n },\n };\n };\n const returnValue = await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: `(${expression.toString()})()`,\n returnByValue: true,\n });\n\n if (!returnValue.result.value) {\n const errorDescription =\n returnValue.exceptionDetails?.exception?.description || '';\n if (!errorDescription) {\n console.error('returnValue from cdp', returnValue);\n }\n throw new Error(\n `Failed to get page content from page, error: ${errorDescription}`,\n );\n }\n\n return returnValue.result.value as {\n tree: ElementTreeNode<ElementInfo>;\n size: Size;\n };\n }\n\n public async evaluateJavaScript(script: string) {\n return this.sendCommandToDebugger('Runtime.evaluate', {\n expression: script,\n awaitPromise: true,\n });\n }\n\n async beforeInvokeAction(): Promise<void> {\n // current implementation is wait until domReadyState is complete\n try {\n await this.waitUntilNetworkIdle();\n } catch (error) {\n // console.warn('Failed to wait until network idle', error);\n }\n }\n\n private async waitUntilNetworkIdle() {\n const timeout = 10000;\n const startTime = Date.now();\n let lastReadyState = '';\n while (Date.now() - startTime < timeout) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: 'document.readyState',\n });\n lastReadyState = result.result.value;\n if (lastReadyState === 'complete') {\n await new Promise((resolve) => setTimeout(resolve, 300));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n }\n throw new Error(\n `Failed to wait until network idle, last readyState: ${lastReadyState}`,\n );\n }\n\n // @deprecated\n async getElementsInfo() {\n const tree = await this.getElementsNodeTree();\n return treeToList(tree);\n }\n\n async getXpathsByPoint(point: Point, isOrderSensitive = false) {\n const script = await getHtmlElementScript();\n\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `window.midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n returnByValue: true,\n });\n return result.result.value;\n }\n\n async getElementInfoByXpath(xpath: string) {\n const script = await getHtmlElementScript();\n\n // check tab url\n await this.sendCommandToDebugger<\n CDPTypes.Runtime.EvaluateResponse,\n CDPTypes.Runtime.EvaluateRequest\n >('Runtime.evaluate', {\n expression: script,\n });\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `window.midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n returnByValue: true,\n });\n return result.result.value;\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debug);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n return { xpaths: sanitizeXpaths(xpaths) };\n } catch (error) {\n debug('cacheFeatureForPoint failed: %O', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n\n for (const xpath of xpaths) {\n try {\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n return buildRectFromElementInfo(elementInfo, this.viewportSize?.dpr);\n }\n } catch (error) {\n debug('rectMatchesCacheFeature failed for xpath %s: %O', xpath, error);\n }\n }\n\n throw new Error(\n `No matching element rect found for cache feature (tried ${xpaths.length} xpath(s))`,\n );\n }\n\n async getElementsNodeTree() {\n await this.hideMousePointer();\n const content = await this.getPageContentByCDP();\n if (content?.size) {\n this.viewportSize = content.size;\n }\n\n return content?.tree || { node: null, children: [] };\n }\n\n async getContext(): Promise<UIContext> {\n return await WebPageContextParser(this, {});\n }\n\n async size() {\n if (this.viewportSize) return this.viewportSize;\n\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression:\n '({width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, dpr: window.devicePixelRatio})',\n returnByValue: true,\n });\n\n const sizeInfo: Size = result.result.value;\n console.log('sizeInfo', sizeInfo);\n\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64() {\n // screenshot by cdp\n await this.hideMousePointer();\n const format = 'jpeg';\n const base64 = await this.sendCommandToDebugger('Page.captureScreenshot', {\n format,\n quality: 90,\n });\n return createImgBase64ByFormat(format, base64.data);\n }\n\n async url() {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n const url = await chrome.tabs.get(tabId).then((tab) => tab.url);\n return url || '';\n }\n\n async navigate(url: string): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.update(tabId, { url });\n // Wait for navigation to complete\n // Note: debugger will auto-reattach on next command if detached during navigation\n await this.waitUntilNetworkIdle();\n }\n\n async reload(): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.reload(tabId);\n // Wait for reload to complete\n await this.waitUntilNetworkIdle();\n }\n\n async goBack(): Promise<void> {\n const tabId = await this.getTabIdOrConnectToCurrentTab();\n await chrome.tabs.goBack(tabId);\n // Wait for navigation to complete\n await this.waitUntilNetworkIdle();\n }\n\n async scrollUntilTop(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point) {\n if (startingPoint) {\n await this.mouse.move(startingPoint.left, startingPoint.top);\n }\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point) {\n const { height } = await this.size();\n const scrollDistance = distance || height * 0.7;\n return this.mouse.wheel(\n 0,\n -scrollDistance,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollDown(distance?: number, startingPoint?: Point) {\n const { height } = await this.size();\n const scrollDistance = distance || height * 0.7;\n return this.mouse.wheel(\n 0,\n scrollDistance,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point) {\n const { width } = await this.size();\n const scrollDistance = distance || width * 0.7;\n return this.mouse.wheel(\n -scrollDistance,\n 0,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async scrollRight(distance?: number, startingPoint?: Point) {\n const { width } = await this.size();\n const scrollDistance = distance || width * 0.7;\n return this.mouse.wheel(\n scrollDistance,\n 0,\n startingPoint?.left,\n startingPoint?.top,\n );\n }\n\n async clearInput(element: ElementInfo) {\n if (!element) {\n console.warn('No element to clear input');\n return;\n }\n\n await this.mouse.click(element.center[0], element.center[1]);\n\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\n type: 'keyDown',\n commands: ['selectAll'],\n });\n\n await this.sendCommandToDebugger('Input.dispatchKeyEvent', {\n type: 'keyUp',\n commands: ['selectAll'],\n });\n\n await sleep(100);\n\n await this.keyboard.press({\n key: 'Backspace',\n });\n }\n\n private latestMouseX = 100;\n private latestMouseY = 100;\n\n mouse = {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n const { button = 'left', count = 1 } = options || {};\n await this.mouse.move(x, y);\n // detect if the page is in mobile emulation mode\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n if (this.isMobileEmulation && button === 'left') {\n // in mobile emulation mode, directly inject click event\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints,\n modifiers: 0,\n });\n\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n // standard mousePressed + mouseReleased\n for (let i = 0; i < count; i++) {\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x,\n y,\n button,\n clickCount: 1,\n });\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x,\n y,\n button,\n clickCount: 1,\n });\n await sleep(50);\n }\n }\n },\n wheel: async (\n deltaX: number,\n deltaY: number,\n startX?: number,\n startY?: number,\n ) => {\n const finalX = startX || this.latestMouseX;\n const finalY = startY || this.latestMouseY;\n await this.showMousePointer(finalX, finalY);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseWheel',\n x: finalX,\n y: finalY,\n deltaX,\n deltaY,\n });\n this.latestMouseX = finalX;\n this.latestMouseY = finalY;\n },\n move: async (x: number, y: number) => {\n await this.showMousePointer(x, y);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseMoved',\n x,\n y,\n });\n this.latestMouseX = x;\n this.latestMouseY = y;\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n await this.mouse.move(from.x, from.y);\n\n await sleep(200);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n });\n\n await sleep(300);\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseMoved',\n x: to.x,\n y: to.y,\n });\n\n await sleep(500);\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n });\n\n await sleep(200);\n\n await this.mouse.move(to.x, to.y);\n },\n };\n\n keyboard = {\n type: async (text: string) => {\n const cdpKeyboard = new CdpKeyboard({\n send: this.sendCommandToDebugger.bind(this),\n });\n await cdpKeyboard.type(text, { delay: 0 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const cdpKeyboard = new CdpKeyboard({\n send: this.sendCommandToDebugger.bind(this),\n });\n const keys = Array.isArray(action) ? action : [action];\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await cdpKeyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await cdpKeyboard.up(k.key);\n }\n },\n };\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n this.activeTabId = null;\n await this.detachDebugger();\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 await this.mouse.move(x, y);\n\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n if (this.isMobileEmulation) {\n const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints,\n modifiers: 0,\n });\n await new Promise((res) => setTimeout(res, duration));\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x,\n y,\n button: 'left',\n clickCount: 1,\n });\n await new Promise((res) => setTimeout(res, duration));\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x,\n y,\n button: 'left',\n clickCount: 1,\n });\n }\n this.latestMouseX = x;\n this.latestMouseY = y;\n }\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 || 300;\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\n if (this.isMobileEmulation === null) {\n const result = await this.sendCommandToDebugger('Runtime.evaluate', {\n expression: `(() => {\n return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\n })()`,\n returnByValue: true,\n });\n this.isMobileEmulation = result?.result?.value;\n }\n\n const steps = 30;\n const delay = duration / steps;\n\n if (this.isMobileEmulation) {\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [{ x: Math.round(from.x), y: Math.round(from.y) }],\n modifiers: 0,\n });\n\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 this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [{ x: Math.round(x), y: Math.round(y) }],\n modifiers: 0,\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await this.sendCommandToDebugger('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n modifiers: 0,\n });\n } else {\n await this.mouse.move(from.x, from.y);\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mousePressed',\n x: from.x,\n y: from.y,\n button: 'left',\n clickCount: 1,\n });\n\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 this.mouse.move(x, y);\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await this.sendCommandToDebugger('Input.dispatchMouseEvent', {\n type: 'mouseReleased',\n x: to.x,\n y: to.y,\n button: 'left',\n clickCount: 1,\n });\n }\n\n this.latestMouseX = to.x;\n this.latestMouseY = to.y;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","sleep","ms","Promise","resolve","setTimeout","ChromeExtensionProxyPage","commonWebActionsForWebPage","tabId","Error","chrome","tabs","tab","assert","url","console","error","errorMsg","x","y","pointerScript","tabIdToDetach","limitOpenNewTabScript","script","injectWaterFlowAnimation","injectStopWaterFlowAnimation","command","params","retryCount","MAX_RETRIES","result","err","isDetachError","getHtmlElementScript","expression","tree","window","document","returnValue","errorDescription","timeout","startTime","Date","lastReadyState","treeToList","point","isOrderSensitive","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","content","WebPageContextParser","sizeInfo","format","base64","createImgBase64ByFormat","startingPoint","distance","height","scrollDistance","width","element","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","touchPoints","Math","res","from","to","steps","delay","i","forceSameTabNavigation","button","count","deltaX","deltaY","startX","startY","finalX","finalY","text","cdpKeyboard","CdpKeyboard","action","keys","Array","k","commands"],"mappings":"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"}