@midscene/web 1.8.4 → 1.8.5-beta-20260522071402.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/io-server.mjs.map +1 -1
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
- package/dist/es/cli.mjs +1 -1
- package/dist/es/mcp-server.mjs +1 -1
- package/dist/es/puppeteer/base-page.mjs +31 -0
- package/dist/es/puppeteer/base-page.mjs.map +1 -1
- package/dist/es/web-page.mjs +4 -2
- package/dist/es/web-page.mjs.map +1 -1
- package/dist/lib/bridge-mode/io-client.js +1 -1
- package/dist/lib/bridge-mode/io-server.js +2 -2
- package/dist/lib/bridge-mode/io-server.js.map +1 -1
- package/dist/lib/bridge-mode/page-browser-side.js +1 -1
- package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
- package/dist/lib/cli.js +1 -1
- package/dist/lib/mcp-server.js +1 -1
- package/dist/lib/puppeteer/base-page.js +31 -0
- package/dist/lib/puppeteer/base-page.js.map +1 -1
- package/dist/lib/web-page.js +4 -2
- package/dist/lib/web-page.js.map +1 -1
- package/dist/types/puppeteer/base-page.d.ts +4 -0
- package/dist/types/web-page.d.ts +4 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/base-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/base-page.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { WebPageAgentOpt } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n} from '@midscene/core';\nimport type {\n AbstractInterface,\n MjpegStreamHandle,\n MjpegStreamOptions,\n} from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\nconst warnPage = getDebug('web:page', { console: true });\n\nexport const BROWSER_NAVIGATION_ERROR_PATTERN =\n /execution context was destroyed|frame was detached|target closed|page has been closed|context was destroyed|net::ERR_ABORTED/i;\n\nconst CDP_SCREENCAST_QUALITY = 70;\nconst CDP_SCREENCAST_EVERY_NTH_FRAME = 1;\n// Upper bound for the \"wait for browser repaint\" promise inside\n// flushPendingVisualUpdate so the call does not hang forever if the page\n// stops scheduling animation frames (e.g. backgrounded tab).\nconst FLUSH_VISUAL_UPDATE_TIMEOUT_MS = 50;\nconst DATA_URL_BASE64_PREFIX = /^data:image\\/\\w+;base64,/;\n\ntype ScreencastFrameEvent = {\n data: string;\n sessionId: number;\n};\n\ntype ScreencastCdpSession = {\n send(method: string, params?: Record<string, unknown>): Promise<unknown>;\n detach(): Promise<void>;\n on(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n off?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n removeListener?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n};\n\nfunction isClosedPageError(error: unknown) {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /target page, context or browser has been closed|page has been closed|target closed|browser has been closed/i.test(\n error.message,\n );\n}\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface\n{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n private playwrightNetworkIdleWarningShown = false;\n private activeMjpegStream?: {\n token: symbol;\n onFrame: MjpegStreamOptions['onFrame'];\n onError?: MjpegStreamOptions['onError'];\n };\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation(\n moment:\n | 'screenshot'\n | 'getElementsInfo'\n | 'getElementsNodeTree'\n | 'afterInvokeAction',\n actionName?: string,\n ) {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage(\n `waitForNavigation begin at moment ${moment} with timeout: ${this.waitForNavigationTimeout} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(\n moment: 'afterInvokeAction',\n actionName?: string,\n ): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n debugPage(\n `waitForNetworkIdle begin at moment ${moment} with timeout: ${this.waitForNetworkIdleTimeout} and concurrency: ${DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNetworkIdle end');\n } else {\n if (!this.playwrightNetworkIdleWarningShown) {\n this.playwrightNetworkIdleWarningShown = true;\n warnPage(\n '[midscene:warning] waitForNetworkIdle is skipped for Playwright. Playwright does not provide an equivalent underlying capability for the intended post-action network idle behavior here.',\n );\n }\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation('getElementsInfo');\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debugPage);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return { xpaths: sanitized };\n } catch (error) {\n debugPage('cacheFeatureForPoint failed: %s', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n return buildRectFromElementInfo(elementInfo);\n }\n debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation('getElementsNodeTree');\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg' as const;\n const quality = 90;\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n try {\n const buffer = await page.screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } catch (error) {\n if (isClosedPageError(error) || page.isClosed()) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(\n `[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`,\n );\n debugPage(\n 'playwright screenshot failed, trying CDP fallback: %s',\n error,\n );\n base64 = await this.screenshotBase64ByPlaywrightCdp(\n page,\n imgType,\n quality,\n );\n }\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n private async screenshotBase64ByPlaywrightCdp(\n page: PlaywrightPage,\n imgType: 'jpeg' | 'png',\n quality?: number,\n ) {\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screenshot fallback requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n\n const client = await page.context().newCDPSession(page);\n try {\n const result = (await new Promise<{\n data: string;\n }>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('CDP screenshot timeout after 10000ms.'));\n }, 10 * 1000);\n\n client\n .send('Page.captureScreenshot', {\n format: imgType,\n ...(quality ? { quality } : {}),\n })\n .then(\n (value) => {\n clearTimeout(timeoutId);\n resolve(value as { data: string });\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n );\n })) as {\n data: string;\n };\n return createImgBase64ByFormat(imgType, result.data);\n } finally {\n void client.detach().catch((error) => {\n debugPage('failed to detach CDP screenshot session: %s', error);\n });\n }\n }\n\n private async createScreencastCdpSession(): Promise<ScreencastCdpSession> {\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n return (await page.target().createCDPSession()) as ScreencastCdpSession;\n }\n\n const page = this.underlyingPage as PlaywrightPage;\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screencast requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n return (await page.context().newCDPSession(page)) as ScreencastCdpSession;\n }\n\n async flushPendingVisualUpdate(): Promise<void> {\n const activeStream = this.activeMjpegStream;\n if (!activeStream) return;\n\n try {\n await this.evaluate(\n (timeoutMs: number) =>\n new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n resolve();\n };\n setTimeout(finish, timeoutMs);\n requestAnimationFrame(() => requestAnimationFrame(finish));\n }),\n FLUSH_VISUAL_UPDATE_TIMEOUT_MS,\n );\n const dataUrl = await this.screenshotBase64();\n if (this.activeMjpegStream?.token !== activeStream.token) return;\n // MjpegStreamFrame.data is contractually bare base64; screenshotBase64()\n // returns a `data:image/...;base64,...` URL, so strip the prefix here.\n activeStream.onFrame({\n data: dataUrl.replace(DATA_URL_BASE64_PREFIX, ''),\n contentType: 'image/jpeg',\n });\n } catch (error) {\n debugPage('screencast visual refresh failed: %s', error);\n activeStream.onError?.(error);\n }\n }\n\n async startMjpegStream(\n options: MjpegStreamOptions,\n ): Promise<MjpegStreamHandle> {\n const { signal, onFrame, onError } = options;\n if (typeof this.underlyingPage.bringToFront === 'function') {\n await this.underlyingPage.bringToFront();\n }\n const client = await this.createScreencastCdpSession();\n let stopped = false;\n const streamToken = Symbol('mjpeg-stream');\n\n const reportStreamError = (error: unknown) => {\n try {\n onError?.(error);\n } catch (callbackError) {\n debugPage('mjpeg onError callback threw: %s', callbackError);\n }\n };\n\n const handleFrame = (event: ScreencastFrameEvent) => {\n void (async () => {\n if (stopped) return;\n try {\n onFrame({\n data: event.data,\n contentType: 'image/jpeg',\n });\n } catch (error) {\n reportStreamError(error);\n }\n\n try {\n await client.send('Page.screencastFrameAck', {\n sessionId: event.sessionId,\n });\n } catch (error) {\n if (!stopped) {\n reportStreamError(error);\n }\n }\n })();\n };\n\n const removeFrameListener = () => {\n if (client.off) {\n client.off('Page.screencastFrame', handleFrame);\n } else if (client.removeListener) {\n client.removeListener('Page.screencastFrame', handleFrame);\n }\n };\n\n const stop = async () => {\n if (stopped) return;\n stopped = true;\n if (this.activeMjpegStream?.token === streamToken) {\n this.activeMjpegStream = undefined;\n }\n signal?.removeEventListener('abort', abortHandler);\n removeFrameListener();\n await client.send('Page.stopScreencast').catch((error) => {\n debugPage('Page.stopScreencast failed: %s', error);\n });\n await client.detach().catch((error) => {\n debugPage('CDP screencast session detach failed: %s', error);\n });\n };\n\n const abortHandler = () => {\n void stop();\n };\n\n try {\n client.on('Page.screencastFrame', handleFrame);\n this.activeMjpegStream = {\n token: streamToken,\n onFrame,\n onError,\n };\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n if (signal?.aborted) {\n await stop();\n return { stop };\n }\n\n await client.send('Page.enable');\n try {\n const { width, height } = await this.size();\n await client.send('Emulation.setVisibleSize', { width, height });\n } catch (error) {\n debugPage('CDP screencast visible size sync failed: %s', error);\n }\n await client.send('Page.startScreencast', {\n format: 'jpeg',\n quality: CDP_SCREENCAST_QUALITY,\n everyNthFrame: CDP_SCREENCAST_EVERY_NTH_FRAME,\n });\n\n // CDP screencast only emits a frame when the page's compositor\n // produces one — for an idle page (no animation, post\n // waitForNetworkIdle) that may never happen, leaving freshly\n // attached subscribers staring at a blank canvas. Force-push one\n // manual screenshot so producer.lastFrame is populated before any\n // /mjpeg subscriber connects.\n void this.flushPendingVisualUpdate();\n\n return { stop };\n } catch (error) {\n await stop();\n throw error;\n }\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n 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 goForward(): Promise<void> {\n debugPage('go forward');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goForward();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goForward();\n } else {\n throw new Error('Unsupported page type for go forward');\n }\n }\n\n async stopLoading(): Promise<void> {\n debugPage('stop loading');\n if (this.interfaceType === 'puppeteer') {\n const client = await (this.underlyingPage as PuppeteerPage)\n .target()\n .createCDPSession();\n try {\n await client.send('Page.stopLoading');\n } finally {\n await client.detach();\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).evaluate(() =>\n window.stop(),\n );\n } else {\n throw new Error('Unsupported page type for stop loading');\n }\n }\n\n async navigationState(): Promise<{ isLoading: boolean }> {\n try {\n const readyState = await this.evaluate(() => document.readyState);\n return { isLoading: readyState !== 'complete' };\n } catch (error) {\n debugPage('failed to query navigation state: %s', error);\n return { isLoading: false };\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([\n this.waitForNavigation('afterInvokeAction', name),\n this.waitForNetworkIdle('afterInvokeAction', name),\n ]);\n\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> {}\n\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n\n async pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration = 500,\n ): Promise<void> {\n const steps = 30;\n const delay = duration / steps;\n const halfStart = startDistance / 2;\n const halfEnd = endDistance / 2;\n\n type TouchClient = {\n send(\n method: 'Input.dispatchTouchEvent',\n params?: Protocol.Input.DispatchTouchEventRequest,\n ): Promise<unknown>;\n detach(): Promise<void>;\n };\n\n let client: TouchClient;\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n client = (await page.target().createCDPSession()) as TouchClient;\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n // CDP is Chromium-only; Firefox/WebKit do not support it\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `Pinch gesture requires Chromium-based browser, but current browser is \"${browserName}\". CDP touch events are not supported in Firefox/WebKit.`,\n );\n }\n client = (await page.context().newCDPSession(page)) as TouchClient;\n } else {\n return;\n }\n\n try {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [\n { x: Math.round(centerX), y: Math.round(centerY - halfStart), id: 0 },\n { x: Math.round(centerX), y: Math.round(centerY + halfStart), id: 1 },\n ],\n });\n\n for (let i = 1; i <= steps; i++) {\n const currentHalf = halfStart + (halfEnd - halfStart) * (i / steps);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [\n {\n x: Math.round(centerX),\n y: Math.round(centerY - currentHalf),\n id: 0,\n },\n {\n x: Math.round(centerX),\n y: Math.round(centerY + currentHalf),\n id: 1,\n },\n ],\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n } finally {\n await client.detach();\n }\n }\n\n private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n ({ id, content }: { id: string; content: string }) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n { id: styleId, content: styleContent },\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","warnPage","BROWSER_NAVIGATION_ERROR_PATTERN","CDP_SCREENCAST_QUALITY","CDP_SCREENCAST_EVERY_NTH_FRAME","FLUSH_VISUAL_UPDATE_TIMEOUT_MS","DATA_URL_BASE64_PREFIX","isClosedPageError","error","Error","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","page","buffer","errorMsg","String","browserName","client","Promise","resolve","reject","timeoutId","setTimeout","value","clearTimeout","activeStream","timeoutMs","done","finish","requestAnimationFrame","dataUrl","signal","onFrame","onError","stopped","streamToken","reportStreamError","callbackError","handleFrame","event","removeFrameListener","stop","undefined","abortHandler","width","height","url","x","y","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","Array","k","commands","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","readyState","document","name","param","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","currentHalf","session","handler","capturedError","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.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/puppeteer/base-page.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { WebPageAgentOpt } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n} from '@midscene/core';\nimport type {\n AbstractInterface,\n MjpegStreamHandle,\n MjpegStreamOptions,\n} from '@midscene/core/device';\nimport { sleep } from '@midscene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@midscene/shared/constants';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { createImgBase64ByFormat } from '@midscene/shared/img';\nimport { type DebugFunction, getDebug } from '@midscene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@midscene/shared/node';\nimport { assert } from '@midscene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { CDPSession, Protocol, Page as PuppeteerPage } from 'puppeteer';\nimport {\n type CacheFeatureOptions,\n type WebElementCacheFeature,\n buildRectFromElementInfo,\n judgeOrderSensitive,\n sanitizeXpaths,\n} from '../common/cache-helper';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\nconst warnPage = getDebug('web:page', { console: true });\n\nexport const BROWSER_NAVIGATION_ERROR_PATTERN =\n /execution context was destroyed|frame was detached|target closed|page has been closed|context was destroyed|net::ERR_ABORTED/i;\n\nconst CDP_SCREENCAST_QUALITY = 70;\nconst CDP_SCREENCAST_EVERY_NTH_FRAME = 1;\n// Upper bound for the \"wait for browser repaint\" promise inside\n// flushPendingVisualUpdate so the call does not hang forever if the page\n// stops scheduling animation frames (e.g. backgrounded tab).\nconst FLUSH_VISUAL_UPDATE_TIMEOUT_MS = 50;\nconst DATA_URL_BASE64_PREFIX = /^data:image\\/\\w+;base64,/;\n\ntype ScreencastFrameEvent = {\n data: string;\n sessionId: number;\n};\n\ntype ScreencastCdpSession = {\n send(method: string, params?: Record<string, unknown>): Promise<unknown>;\n detach(): Promise<void>;\n on(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n off?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n removeListener?(\n event: 'Page.screencastFrame',\n handler: (event: ScreencastFrameEvent) => void,\n ): void;\n};\n\nfunction isClosedPageError(error: unknown) {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /target page, context or browser has been closed|page has been closed|target closed|browser has been closed/i.test(\n error.message,\n );\n}\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface\n{\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n private enableTouchEventsInActionSpace: boolean;\n private puppeteerFileChooserSession?: CDPSession;\n private puppeteerFileChooserHandler?: (\n event: Protocol.Page.FileChooserOpenedEvent,\n ) => Promise<void>;\n private playwrightNetworkIdleWarningShown = false;\n private activeMjpegStream?: {\n token: symbol;\n onFrame: MjpegStreamOptions['onFrame'];\n onError?: MjpegStreamOptions['onError'];\n };\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(\n this,\n this.enableTouchEventsInActionSpace,\n );\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n this.enableTouchEventsInActionSpace =\n opts?.enableTouchEventsInActionSpace ?? false;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation(\n moment:\n | 'screenshot'\n | 'getElementsInfo'\n | 'getElementsNodeTree'\n | 'afterInvokeAction',\n actionName?: string,\n ) {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage(\n `waitForNavigation begin at moment ${moment} with timeout: ${this.waitForNavigationTimeout} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(\n moment: 'afterInvokeAction',\n actionName?: string,\n ): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n debugPage(\n `waitForNetworkIdle begin at moment ${moment} with timeout: ${this.waitForNetworkIdleTimeout} and concurrency: ${DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY} and actionName: ${actionName}`,\n );\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNetworkIdle end');\n } else {\n if (!this.playwrightNetworkIdleWarningShown) {\n this.playwrightNetworkIdleWarningShown = true;\n warnPage(\n '[midscene:warning] waitForNetworkIdle is skipped for Playwright. Playwright does not provide an equivalent underlying capability for the intended post-action network idle behavior here.',\n );\n }\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation('getElementsInfo');\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n private async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n private async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForPoint(\n center: [number, number],\n options?: CacheFeatureOptions,\n ): Promise<ElementCacheFeature> {\n const point: Point = { left: center[0], top: center[1] };\n\n try {\n const isOrderSensitive = await judgeOrderSensitive(options, debugPage);\n const xpaths = await this.getXpathsByPoint(point, isOrderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForPoint: no xpath found at point %o', center);\n }\n return { xpaths: sanitized };\n } catch (error) {\n debugPage('cacheFeatureForPoint failed: %s', error);\n return { xpaths: [] };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const xpaths = sanitizeXpaths((feature as WebElementCacheFeature).xpaths);\n debugPage('rectMatchesCacheFeature: trying %d xpath(s)', xpaths.length);\n\n for (const xpath of xpaths) {\n try {\n debugPage('rectMatchesCacheFeature: evaluating xpath: %s', xpath);\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n debugPage(\n 'rectMatchesCacheFeature: found element, rect: %o',\n elementInfo.rect,\n );\n return buildRectFromElementInfo(elementInfo);\n }\n debugPage(\n 'rectMatchesCacheFeature: element found but no rect (elementInfo: %o)',\n elementInfo,\n );\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n `No matching element rect found for the provided cache feature (tried ${xpaths.length} xpath(s): ${xpaths.join(', ')})`,\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation('getElementsNodeTree');\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg' as const;\n const quality = 90;\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n try {\n const buffer = await page.screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } catch (error) {\n if (isClosedPageError(error) || page.isClosed()) {\n throw error;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(\n `[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`,\n );\n debugPage(\n 'playwright screenshot failed, trying CDP fallback: %s',\n error,\n );\n base64 = await this.screenshotBase64ByPlaywrightCdp(\n page,\n imgType,\n quality,\n );\n }\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n private async screenshotBase64ByPlaywrightCdp(\n page: PlaywrightPage,\n imgType: 'jpeg' | 'png',\n quality?: number,\n ) {\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screenshot fallback requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n\n const client = await page.context().newCDPSession(page);\n try {\n const result = (await new Promise<{\n data: string;\n }>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('CDP screenshot timeout after 10000ms.'));\n }, 10 * 1000);\n\n client\n .send('Page.captureScreenshot', {\n format: imgType,\n ...(quality ? { quality } : {}),\n })\n .then(\n (value) => {\n clearTimeout(timeoutId);\n resolve(value as { data: string });\n },\n (error) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n );\n })) as {\n data: string;\n };\n return createImgBase64ByFormat(imgType, result.data);\n } finally {\n void client.detach().catch((error) => {\n debugPage('failed to detach CDP screenshot session: %s', error);\n });\n }\n }\n\n private async createScreencastCdpSession(): Promise<ScreencastCdpSession> {\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n return (await page.target().createCDPSession()) as ScreencastCdpSession;\n }\n\n const page = this.underlyingPage as PlaywrightPage;\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `CDP screencast requires Chromium-based browser, but current browser is \"${browserName}\".`,\n );\n }\n return (await page.context().newCDPSession(page)) as ScreencastCdpSession;\n }\n\n async waitForDomQuiet(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n }): Promise<void> {\n const quietMs = opts?.quietMs ?? 100;\n const timeoutMs = opts?.timeoutMs ?? 500;\n try {\n await this.evaluate(\n ([q, total]: [number, number]) =>\n new Promise<void>((resolve) => {\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const done = () => {\n obs.disconnect();\n clearTimeout(hardTimer);\n if (settleTimer) clearTimeout(settleTimer);\n resolve();\n };\n const obs = new MutationObserver(() => {\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(done, q);\n });\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n const hardTimer = setTimeout(done, total);\n }),\n [quietMs, timeoutMs],\n );\n } catch (error) {\n debugPage('waitForDomQuiet failed: %s', error);\n }\n }\n\n async flushPendingVisualUpdate(): Promise<void> {\n const activeStream = this.activeMjpegStream;\n if (!activeStream) return;\n\n try {\n await this.evaluate(\n (timeoutMs: number) =>\n new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n resolve();\n };\n setTimeout(finish, timeoutMs);\n requestAnimationFrame(() => requestAnimationFrame(finish));\n }),\n FLUSH_VISUAL_UPDATE_TIMEOUT_MS,\n );\n const dataUrl = await this.screenshotBase64();\n if (this.activeMjpegStream?.token !== activeStream.token) return;\n // MjpegStreamFrame.data is contractually bare base64; screenshotBase64()\n // returns a `data:image/...;base64,...` URL, so strip the prefix here.\n activeStream.onFrame({\n data: dataUrl.replace(DATA_URL_BASE64_PREFIX, ''),\n contentType: 'image/jpeg',\n });\n } catch (error) {\n debugPage('screencast visual refresh failed: %s', error);\n activeStream.onError?.(error);\n }\n }\n\n async startMjpegStream(\n options: MjpegStreamOptions,\n ): Promise<MjpegStreamHandle> {\n const { signal, onFrame, onError } = options;\n if (typeof this.underlyingPage.bringToFront === 'function') {\n await this.underlyingPage.bringToFront();\n }\n const client = await this.createScreencastCdpSession();\n let stopped = false;\n const streamToken = Symbol('mjpeg-stream');\n\n const reportStreamError = (error: unknown) => {\n try {\n onError?.(error);\n } catch (callbackError) {\n debugPage('mjpeg onError callback threw: %s', callbackError);\n }\n };\n\n const handleFrame = (event: ScreencastFrameEvent) => {\n void (async () => {\n if (stopped) return;\n try {\n onFrame({\n data: event.data,\n contentType: 'image/jpeg',\n });\n } catch (error) {\n reportStreamError(error);\n }\n\n try {\n await client.send('Page.screencastFrameAck', {\n sessionId: event.sessionId,\n });\n } catch (error) {\n if (!stopped) {\n reportStreamError(error);\n }\n }\n })();\n };\n\n const removeFrameListener = () => {\n if (client.off) {\n client.off('Page.screencastFrame', handleFrame);\n } else if (client.removeListener) {\n client.removeListener('Page.screencastFrame', handleFrame);\n }\n };\n\n const stop = async () => {\n if (stopped) return;\n stopped = true;\n if (this.activeMjpegStream?.token === streamToken) {\n this.activeMjpegStream = undefined;\n }\n signal?.removeEventListener('abort', abortHandler);\n removeFrameListener();\n await client.send('Page.stopScreencast').catch((error) => {\n debugPage('Page.stopScreencast failed: %s', error);\n });\n await client.detach().catch((error) => {\n debugPage('CDP screencast session detach failed: %s', error);\n });\n };\n\n const abortHandler = () => {\n void stop();\n };\n\n try {\n client.on('Page.screencastFrame', handleFrame);\n this.activeMjpegStream = {\n token: streamToken,\n onFrame,\n onError,\n };\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n if (signal?.aborted) {\n await stop();\n return { stop };\n }\n\n await client.send('Page.enable');\n try {\n const { width, height } = await this.size();\n await client.send('Emulation.setVisibleSize', { width, height });\n } catch (error) {\n debugPage('CDP screencast visible size sync failed: %s', error);\n }\n await client.send('Page.startScreencast', {\n format: 'jpeg',\n quality: CDP_SCREENCAST_QUALITY,\n everyNthFrame: CDP_SCREENCAST_EVERY_NTH_FRAME,\n });\n\n // CDP screencast only emits a frame when the page's compositor\n // produces one — for an idle page (no animation, post\n // waitForNetworkIdle) that may never happen, leaving freshly\n // attached subscribers staring at a blank canvas. Force-push one\n // manual screenshot so producer.lastFrame is populated before any\n // /mjpeg subscriber connects.\n void this.flushPendingVisualUpdate();\n\n return { stop };\n } catch (error) {\n await stop();\n throw error;\n }\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n if (button === 'left' && count === 1) {\n await page.mouse.click(x, y);\n } else {\n await page.mouse.click(x, y, { button, count });\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y, {\n steps: 20,\n });\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n 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 goForward(): Promise<void> {\n debugPage('go forward');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goForward();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goForward();\n } else {\n throw new Error('Unsupported page type for go forward');\n }\n }\n\n async stopLoading(): Promise<void> {\n debugPage('stop loading');\n if (this.interfaceType === 'puppeteer') {\n const client = await (this.underlyingPage as PuppeteerPage)\n .target()\n .createCDPSession();\n try {\n await client.send('Page.stopLoading');\n } finally {\n await client.detach();\n }\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).evaluate(() =>\n window.stop(),\n );\n } else {\n throw new Error('Unsupported page type for stop loading');\n }\n }\n\n async navigationState(): Promise<{ isLoading: boolean }> {\n try {\n const readyState = await this.evaluate(() => document.readyState);\n return { isLoading: readyState !== 'complete' };\n } catch (error) {\n debugPage('failed to query navigation state: %s', error);\n return { isLoading: false };\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([\n this.waitForNavigation('afterInvokeAction', name),\n this.waitForNetworkIdle('afterInvokeAction', name),\n ]);\n\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> {}\n\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n\n async pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration = 500,\n ): Promise<void> {\n const steps = 30;\n const delay = duration / steps;\n const halfStart = startDistance / 2;\n const halfEnd = endDistance / 2;\n\n type TouchClient = {\n send(\n method: 'Input.dispatchTouchEvent',\n params?: Protocol.Input.DispatchTouchEventRequest,\n ): Promise<unknown>;\n detach(): Promise<void>;\n };\n\n let client: TouchClient;\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n client = (await page.target().createCDPSession()) as TouchClient;\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n // CDP is Chromium-only; Firefox/WebKit do not support it\n const browserName = page.context().browser()?.browserType().name();\n if (browserName && browserName !== 'chromium') {\n throw new Error(\n `Pinch gesture requires Chromium-based browser, but current browser is \"${browserName}\". CDP touch events are not supported in Firefox/WebKit.`,\n );\n }\n client = (await page.context().newCDPSession(page)) as TouchClient;\n } else {\n return;\n }\n\n try {\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchStart',\n touchPoints: [\n { x: Math.round(centerX), y: Math.round(centerY - halfStart), id: 0 },\n { x: Math.round(centerX), y: Math.round(centerY + halfStart), id: 1 },\n ],\n });\n\n for (let i = 1; i <= steps; i++) {\n const currentHalf = halfStart + (halfEnd - halfStart) * (i / steps);\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchMove',\n touchPoints: [\n {\n x: Math.round(centerX),\n y: Math.round(centerY - currentHalf),\n id: 0,\n },\n {\n x: Math.round(centerX),\n y: Math.round(centerY + currentHalf),\n id: 1,\n },\n ],\n });\n await new Promise((res) => setTimeout(res, delay));\n }\n\n await client.send('Input.dispatchTouchEvent', {\n type: 'touchEnd',\n touchPoints: [],\n });\n } finally {\n await client.detach();\n }\n }\n\n private async ensurePuppeteerFileChooserSession(\n page: PuppeteerPage,\n ): Promise<CDPSession> {\n if (this.puppeteerFileChooserSession) {\n return this.puppeteerFileChooserSession;\n }\n const session = await page.target().createCDPSession();\n await session.send('Page.enable');\n await session.send('DOM.enable');\n await session.send('Page.setInterceptFileChooserDialog', { enabled: true });\n this.puppeteerFileChooserSession = session;\n return session;\n }\n\n async registerFileChooserListener(\n handler: (\n chooser: import('@midscene/core/device').FileChooserHandler,\n ) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }> {\n if (this.interfaceType !== 'puppeteer') {\n throw new Error(\n 'registerFileChooserListener is only supported in Puppeteer',\n );\n }\n\n const page = this.underlyingPage as PuppeteerPage;\n const session = await this.ensurePuppeteerFileChooserSession(page);\n if (this.puppeteerFileChooserHandler) {\n session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n }\n\n let capturedError: Error | undefined;\n\n this.puppeteerFileChooserHandler = async (event) => {\n if (event.backendNodeId === undefined) {\n debugPage('puppeteer file chooser opened without backendNodeId, skip');\n return;\n }\n try {\n await handler({\n accept: async (files: string[]) => {\n // Get node information to check attributes\n const { node } = await session.send('DOM.describeNode', {\n backendNodeId: event.backendNodeId,\n });\n // attributes is a flat array: ['attr1', 'value1', 'attr2', 'value2', ...]\n\n // Check if input has webkitdirectory attribute (Puppeteer doesn't support directory upload)\n const hasWebkitDirectory =\n node.attributes?.includes('webkitdirectory') ||\n node.attributes?.includes('directory');\n if (hasWebkitDirectory) {\n throw new Error(\n 'Directory upload (webkitdirectory) is not supported in Puppeteer. Please use Playwright instead, which supports directory upload since version 1.45.',\n );\n }\n\n // Check if input supports multiple files\n if (files.length > 1) {\n const hasMultiple = node.attributes?.includes('multiple');\n if (!hasMultiple) {\n throw new Error(\n 'Non-multiple file input can only accept single file',\n );\n }\n }\n await session.send('DOM.setFileInputFiles', {\n files,\n backendNodeId: event.backendNodeId,\n });\n },\n });\n } catch (error) {\n capturedError = error as Error;\n }\n };\n session.on('Page.fileChooserOpened', this.puppeteerFileChooserHandler);\n return {\n dispose: () => {\n if (this.puppeteerFileChooserHandler) {\n session.off(\n 'Page.fileChooserOpened',\n this.puppeteerFileChooserHandler,\n );\n }\n void session.detach();\n this.puppeteerFileChooserHandler = undefined;\n if (this.puppeteerFileChooserSession === session) {\n this.puppeteerFileChooserSession = undefined;\n }\n },\n getError: () => capturedError,\n };\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n\n/**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * Adds a style tag with CSS rules to make all select elements use base-select appearance.\n */\nexport function forceChromeSelectRendering(\n page: PuppeteerPage | PlaywrightPage,\n): void {\n // Force Chrome to render select elements using base-select appearance\n // Reference: https://developer.chrome.com/blog/a-customizable-select\n const styleContent = `\n/* Add by Midscene because of forceChromeSelectRendering is enabled*/\nselect {\n &, &::picker(select) {\n appearance: base-select !important;\n }\n}`;\n const styleId = 'midscene-force-select-rendering';\n\n const injectStyle = async () => {\n try {\n await (page as PuppeteerPage & PlaywrightPage).evaluate(\n ({ id, content }: { id: string; content: string }) => {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = content;\n document.head.appendChild(style);\n },\n { id: styleId, content: styleContent },\n );\n debugPage(\n 'Midscene - Added base-select appearance style for select elements because of forceChromeSelectRendering is enabled',\n );\n } catch (err) {\n console.log(\n 'Midscene - Failed to add base-select appearance style:',\n err,\n );\n }\n };\n\n // Inject immediately for the current document\n void injectStyle();\n\n // Ensure the style is reapplied on future navigations/new documents\n (page as PuppeteerPage & PlaywrightPage).on('load', () => {\n void injectStyle();\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","warnPage","BROWSER_NAVIGATION_ERROR_PATTERN","CDP_SCREENCAST_QUALITY","CDP_SCREENCAST_EVERY_NTH_FRAME","FLUSH_VISUAL_UPDATE_TIMEOUT_MS","DATA_URL_BASE64_PREFIX","isClosedPageError","error","Error","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","moment","actionName","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","point","isOrderSensitive","elementInfosScriptContent","getElementInfosScriptContent","xpath","JSON","center","options","judgeOrderSensitive","xpaths","sanitized","sanitizeXpaths","feature","elementInfo","buildRectFromElementInfo","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","window","imgType","quality","base64","createImgBase64ByFormat","page","buffer","errorMsg","String","browserName","client","Promise","resolve","reject","timeoutId","setTimeout","value","clearTimeout","opts","quietMs","timeoutMs","q","total","settleTimer","done","obs","hardTimer","MutationObserver","document","activeStream","finish","requestAnimationFrame","dataUrl","signal","onFrame","onError","stopped","streamToken","reportStreamError","callbackError","handleFrame","event","removeFrameListener","stop","undefined","abortHandler","width","height","url","x","y","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","Array","k","commands","element","backspace","isMac","process","size","targetX","Math","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","readyState","name","param","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","steps","delay","i","res","centerX","centerY","startDistance","endDistance","halfStart","halfEnd","currentHalf","session","handler","capturedError","files","node","hasWebkitDirectory","hasMultiple","underlyingPage","interfaceType","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup","forceChromeSelectRendering","styleContent","styleId","injectStyle","id","content","style","err"],"mappings":"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"}
|
package/dist/lib/web-page.js
CHANGED
|
@@ -145,8 +145,10 @@ function createWebInputPrimitives(page) {
|
|
|
145
145
|
keyboard: {
|
|
146
146
|
typeText: async (value, opts)=>{
|
|
147
147
|
const element = opts?.target;
|
|
148
|
-
if (element && opts?.replace !== false)
|
|
149
|
-
|
|
148
|
+
if (element && opts?.replace !== false) {
|
|
149
|
+
await page.clearInput(element);
|
|
150
|
+
await page.waitForDomQuiet?.();
|
|
151
|
+
} else if (element) {
|
|
150
152
|
const target = element;
|
|
151
153
|
await page.mouse.click(target.center[0], target.center[1], {
|
|
152
154
|
button: 'left'
|
package/dist/lib/web-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n defineAction,\n defineActionsFromInputPrimitives,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n if (element && opts?.replace !== false) {\n await page.clearInput(element as ElementInfo);\n } else if (element) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n await page.keyboard.type(value);\n await page.flushPendingVisualUpdate?.();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n await page.flushPendingVisualUpdate?.();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n },\n }),\n defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n },\n }),\n ];\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","createWebInputPrimitives","page","opts","target","keyName","direction","times","arrowKey","i","sleep","param","startingPoint","undefined","scrollToEventName","Error","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n defineAction,\n defineActionsFromInputPrimitives,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(): Promise<void>;\n waitForDomQuiet?(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n }): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n if (element && opts?.replace !== false) {\n await page.clearInput(element as ElementInfo);\n // Frameworks (React/Vue/etc.) often re-render in response to\n // the `input` event fired by clearing. If that re-render lands\n // between clearInput returning and the first typed character,\n // the keypresses can be dropped. Wait for the DOM to settle\n // before starting to type.\n await page.waitForDomQuiet?.();\n } else if (element) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n await page.keyboard.type(value);\n await page.flushPendingVisualUpdate?.();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n await page.flushPendingVisualUpdate?.();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n },\n }),\n defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n },\n }),\n ];\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","createWebInputPrimitives","page","opts","target","keyName","direction","times","arrowKey","i","sleep","param","startingPoint","undefined","scrollToEventName","Error","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
|
|
@@ -39,6 +39,10 @@ export declare class Page<AgentType extends 'puppeteer' | 'playwright', Interfac
|
|
|
39
39
|
screenshotBase64(): Promise<string>;
|
|
40
40
|
private screenshotBase64ByPlaywrightCdp;
|
|
41
41
|
private createScreencastCdpSession;
|
|
42
|
+
waitForDomQuiet(opts?: {
|
|
43
|
+
quietMs?: number;
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
}): Promise<void>;
|
|
42
46
|
flushPendingVisualUpdate(): Promise<void>;
|
|
43
47
|
startMjpegStream(options: MjpegStreamOptions): Promise<MjpegStreamHandle>;
|
|
44
48
|
url(): Promise<string>;
|
package/dist/types/web-page.d.ts
CHANGED
|
@@ -45,6 +45,10 @@ export declare abstract class AbstractWebPage extends AbstractInterface {
|
|
|
45
45
|
isLoading: boolean;
|
|
46
46
|
}>;
|
|
47
47
|
flushPendingVisualUpdate?(): Promise<void>;
|
|
48
|
+
waitForDomQuiet?(opts?: {
|
|
49
|
+
quietMs?: number;
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
}): Promise<void>;
|
|
48
52
|
get mouse(): MouseAction;
|
|
49
53
|
get keyboard(): KeyboardAction;
|
|
50
54
|
clearInput(element?: ElementInfo): Promise<void>;
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"Browser use",
|
|
9
9
|
"Android use"
|
|
10
10
|
],
|
|
11
|
-
"version": "1.8.
|
|
11
|
+
"version": "1.8.5-beta-20260522071402.0",
|
|
12
12
|
"repository": "https://github.com/web-infra-dev/midscene",
|
|
13
13
|
"homepage": "https://midscenejs.com/",
|
|
14
14
|
"main": "./dist/lib/index.js",
|
|
@@ -111,9 +111,9 @@
|
|
|
111
111
|
"socket.io": "^4.8.1",
|
|
112
112
|
"socket.io-client": "4.8.1",
|
|
113
113
|
"ws": "^8.18.1",
|
|
114
|
-
"@midscene/core": "1.8.
|
|
115
|
-
"@midscene/playground": "1.8.
|
|
116
|
-
"@midscene/shared": "1.8.
|
|
114
|
+
"@midscene/core": "1.8.5-beta-20260522071402.0",
|
|
115
|
+
"@midscene/playground": "1.8.5-beta-20260522071402.0",
|
|
116
|
+
"@midscene/shared": "1.8.5-beta-20260522071402.0"
|
|
117
117
|
},
|
|
118
118
|
"devDependencies": {
|
|
119
119
|
"@playwright/test": "^1.45.0",
|