@rpascene/web 0.30.11 → 0.30.12
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/chrome-extension/page.mjs +36 -0
- package/dist/es/chrome-extension/page.mjs.map +1 -1
- package/dist/es/puppeteer/base-page.mjs +17 -0
- package/dist/es/puppeteer/base-page.mjs.map +1 -1
- package/dist/es/web-element.mjs +1 -1
- package/dist/es/web-element.mjs.map +1 -1
- package/dist/es/web-page.mjs +29 -1
- package/dist/es/web-page.mjs.map +1 -1
- package/dist/lib/chrome-extension/page.js +36 -0
- package/dist/lib/chrome-extension/page.js.map +1 -1
- package/dist/lib/puppeteer/base-page.js +17 -0
- package/dist/lib/puppeteer/base-page.js.map +1 -1
- package/dist/lib/web-element.js +1 -1
- package/dist/lib/web-element.js.map +1 -1
- package/dist/lib/web-page.js +28 -0
- package/dist/lib/web-page.js.map +1 -1
- package/dist/types/chrome-extension/page.d.ts +7 -0
- package/dist/types/puppeteer/base-page.d.ts +6 -0
- package/dist/types/web-element.d.ts +1 -1
- package/dist/types/web-page.d.ts +3 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer\\base-page.js","sources":["webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./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, WebPageContextParser } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n UIContext,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { sleep } from '@rpascene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@rpascene/shared/constants';\nimport type { ElementInfo } from '@rpascene/shared/extractor';\nimport { treeToList } from '@rpascene/shared/extractor';\nimport { createImgBase64ByFormat } from '@rpascene/shared/img';\nimport { type DebugFunction, getDebug } from '@rpascene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@rpascene/shared/node';\nimport { assert } from '@rpascene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\ntype WebElementCacheFeature = ElementCacheFeature & {\n xpaths?: string[];\n};\n\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\n if (!Array.isArray(xpaths)) {\n return [];\n }\n\n return xpaths.filter(\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\n );\n};\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface {\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(this);\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation() {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage('waitForNavigation begin');\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[rpascene:warning] Waiting for the \"navigation\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[rpascene:warning] Waiting for the \"network idle\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n } else {\n // TODO: implement playwright waitForNetworkIdle\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation();\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n async getXpathsById(id: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\n );\n }\n\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForRect(\n rect: Rect,\n opt?: { _orderSensitive: boolean },\n ): Promise<ElementCacheFeature> {\n const center: Point = {\n left: Math.floor(rect.left + rect.width / 2),\n top: Math.floor(rect.top + rect.height / 2),\n };\n\n try {\n const orderSensitive = opt?._orderSensitive ?? false;\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\n }\n return {\n xpaths: sanitized,\n };\n } catch (error) {\n debugPage('cacheFeatureForRect failed: %s', error);\n return {\n xpaths: [],\n };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const webFeature = feature as WebElementCacheFeature;\n const xpaths = sanitizeXpaths(webFeature.xpaths);\n\n for (const xpath of xpaths) {\n try {\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n const matchedRect: Rect = {\n left: elementInfo.rect.left,\n top: elementInfo.rect.top,\n width: elementInfo.rect.width,\n height: elementInfo.rect.height,\n };\n\n if (this.viewportSize?.dpr) {\n matchedRect.dpr = this.viewportSize.dpr;\n }\n\n return matchedRect;\n }\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n 'No matching element rect found for the provided cache feature',\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation();\n\n // 先注入脚本\n const scriptContent = getElementInfosScriptContent()\n const frames = (this.underlyingPage as PuppeteerPage).frames();\n for (let frame of frames) {\n await frame.evaluate(scriptContent);\n }\n\n // 执行脚本\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot: any = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n async size(): Promise<Size> {\n // if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg';\n const quality = 90;\n await this.waitForNavigation();\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else {\n if (this.interfaceType === 'puppeteer') {\n if (button === 'left' && count === 1) {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\n } else {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\n button,\n count,\n });\n }\n } else if (this.interfaceType === 'playwright') {\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {\n if (!element) {\n console.warn('No element to clear input');\n return;\n }\n\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n });\n await backspace();\n }\n\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> { }\n\n async getContext(): Promise<UIContext> {\n return await WebPageContextParser(this, {});\n }\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","id","elementInfosScriptContent","getElementInfosScriptContent","JSON","point","isOrderSensitive","rect","opt","center","Math","orderSensitive","sanitized","feature","webFeature","elementInfo","_this_viewportSize","matchedRect","Error","scriptContent","frames","frame","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","options","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","element","backspace","isMac","process","size","targetX","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","page","steps","delay","i","resolve","setTimeout","res","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"puppeteer\\base-page.js","sources":["webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./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, WebPageContextParser } from '@/web-element';\nimport type {\n DeviceAction,\n ElementCacheFeature,\n ElementTreeNode,\n Point,\n Rect,\n Size,\n UIContext,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { sleep } from '@rpascene/core/utils';\nimport {\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\n} from '@rpascene/shared/constants';\nimport type { ElementInfo } from '@rpascene/shared/extractor';\nimport { treeToList } from '@rpascene/shared/extractor';\nimport { createImgBase64ByFormat } from '@rpascene/shared/img';\nimport { type DebugFunction, getDebug } from '@rpascene/shared/logger';\nimport {\n getElementInfosScriptContent,\n getExtraReturnLogic,\n} from '@rpascene/shared/node';\nimport { assert } from '@rpascene/shared/utils';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport {\n type KeyInput,\n type MouseButton,\n commonWebActionsForWebPage,\n} from '../web-page';\n\nexport const debugPage = getDebug('web:page');\n\ntype WebElementCacheFeature = ElementCacheFeature & {\n xpaths?: string[];\n};\n\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\n if (!Array.isArray(xpaths)) {\n return [];\n }\n\n return xpaths.filter(\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\n );\n};\n\nexport class Page<\n AgentType extends 'puppeteer' | 'playwright',\n InterfaceType extends PuppeteerPage | PlaywrightPage,\n> implements AbstractInterface {\n underlyingPage: InterfaceType;\n protected waitForNavigationTimeout: number;\n protected waitForNetworkIdleTimeout: number;\n private viewportSize?: Size;\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\n private customActions?: DeviceAction<any>[];\n\n interfaceType: AgentType;\n\n actionSpace(): DeviceAction[] {\n const defaultActions = commonWebActionsForWebPage(this);\n const customActions = this.customActions || [];\n return [...defaultActions, ...customActions];\n }\n\n private async evaluate<R>(\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\n arg?: any,\n ): Promise<R> {\n let result: R;\n debugPage('evaluate function begin');\n if (this.interfaceType === 'puppeteer') {\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\n pageFunction,\n arg,\n );\n } else {\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\n pageFunction,\n arg,\n );\n }\n debugPage('evaluate function end');\n return result;\n }\n\n constructor(\n underlyingPage: InterfaceType,\n interfaceType: AgentType,\n opts?: WebPageAgentOpt,\n ) {\n this.underlyingPage = underlyingPage;\n this.interfaceType = interfaceType;\n this.waitForNavigationTimeout =\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\n this.waitForNetworkIdleTimeout =\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\n this.onAfterInvokeAction = opts?.afterInvokeAction;\n this.customActions = opts?.customActions;\n }\n\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\n return this.evaluate(script);\n }\n\n async waitForNavigation() {\n if (this.waitForNavigationTimeout === 0) {\n debugPage('waitForNavigation timeout is 0, skip waiting');\n return;\n }\n\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\n if (\n this.interfaceType === 'puppeteer' ||\n this.interfaceType === 'playwright'\n ) {\n debugPage('waitForNavigation begin');\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\n try {\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\n timeout: this.waitForNavigationTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[rpascene:warning] Waiting for the \"navigation\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n debugPage('waitForNavigation end');\n }\n }\n\n async waitForNetworkIdle(): Promise<void> {\n if (this.interfaceType === 'puppeteer') {\n if (this.waitForNetworkIdleTimeout === 0) {\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\n return;\n }\n\n try {\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\n idleTime: 200,\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\n timeout: this.waitForNetworkIdleTimeout,\n });\n } catch (error) {\n // Ignore timeout error, continue execution\n console.warn(\n '[rpascene:warning] Waiting for the \"network idle\" has timed out, but Rpascene will continue execution. Please check https://rpascenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\n );\n }\n } else {\n // TODO: implement playwright waitForNetworkIdle\n }\n }\n\n // @deprecated\n async getElementsInfo() {\n // const scripts = await getExtraReturnLogic();\n // const captureElementSnapshot = await this.evaluate(scripts);\n // return captureElementSnapshot as ElementInfo[];\n await this.waitForNavigation();\n debugPage('getElementsInfo begin');\n const tree = await this.getElementsNodeTree();\n debugPage('getElementsInfo end');\n return treeToList(tree);\n }\n\n async getXpathsById(id: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\n );\n }\n\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\n );\n }\n\n async getElementFromPoint(args: { x: number, y: number }) {\n const data: any = await this.evaluate(`window.rpascene_element_inspector.getElementFromPoint({x:${args.x}, y:${args.y} })`);\n console.log(data, 'getElementFromPoint data-------------------------')\n return data\n }\n\n async getElementInfoByXpath(xpath: string) {\n const elementInfosScriptContent = getElementInfosScriptContent();\n\n return this.evaluateJavaScript(\n `${elementInfosScriptContent}rpascene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\n );\n }\n\n async cacheFeatureForRect(\n rect: Rect,\n opt?: { _orderSensitive: boolean },\n ): Promise<ElementCacheFeature> {\n const center: Point = {\n left: Math.floor(rect.left + rect.width / 2),\n top: Math.floor(rect.top + rect.height / 2),\n };\n\n try {\n const orderSensitive = opt?._orderSensitive ?? false;\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\n const sanitized = sanitizeXpaths(xpaths);\n if (!sanitized.length) {\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\n }\n return {\n xpaths: sanitized,\n };\n } catch (error) {\n debugPage('cacheFeatureForRect failed: %s', error);\n return {\n xpaths: [],\n };\n }\n }\n\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\n const webFeature = feature as WebElementCacheFeature;\n const xpaths = sanitizeXpaths(webFeature.xpaths);\n\n for (const xpath of xpaths) {\n try {\n const elementInfo = await this.getElementInfoByXpath(xpath);\n if (elementInfo?.rect) {\n const matchedRect: Rect = {\n left: elementInfo.rect.left,\n top: elementInfo.rect.top,\n width: elementInfo.rect.width,\n height: elementInfo.rect.height,\n };\n\n if (this.viewportSize?.dpr) {\n matchedRect.dpr = this.viewportSize.dpr;\n }\n\n return matchedRect;\n }\n } catch (error) {\n debugPage(\n 'rectMatchesCacheFeature failed for xpath %s: %s',\n xpath,\n error,\n );\n }\n }\n\n throw new Error(\n 'No matching element rect found for the provided cache feature',\n );\n }\n\n async getElementsNodeTree() {\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\n await this.waitForNavigation();\n\n // 先注入脚本\n const scriptContent = getElementInfosScriptContent()\n const frames = (this.underlyingPage as PuppeteerPage).frames();\n for (let frame of frames) {\n await frame.evaluate(scriptContent);\n }\n\n // 执行脚本\n const scripts = await getExtraReturnLogic(true);\n assert(scripts, 'scripts should be set before writing report in browser');\n const startTime = Date.now();\n const captureElementSnapshot: any = await this.evaluate(scripts);\n const endTime = Date.now();\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\n }\n\n\n\n async size(): Promise<Size> {\n // if (this.viewportSize) return this.viewportSize;\n const sizeInfo: Size = await this.evaluate(() => {\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n dpr: window.devicePixelRatio,\n };\n });\n this.viewportSize = sizeInfo;\n return sizeInfo;\n }\n\n async screenshotBase64(): Promise<string> {\n const imgType = 'jpeg';\n const quality = 90;\n await this.waitForNavigation();\n const startTime = Date.now();\n debugPage('screenshotBase64 begin');\n\n let base64: string;\n if (this.interfaceType === 'puppeteer') {\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\n type: imgType,\n quality,\n encoding: 'base64',\n });\n base64 = createImgBase64ByFormat(imgType, result);\n } else if (this.interfaceType === 'playwright') {\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\n type: imgType,\n quality,\n timeout: 10 * 1000,\n });\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\n } else {\n throw new Error('Unsupported page type for screenshot');\n }\n const endTime = Date.now();\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\n return base64;\n }\n\n async url(): Promise<string> {\n return this.underlyingPage.url();\n }\n\n describe(): string {\n const url = this.underlyingPage.url();\n return url || '';\n }\n\n get mouse() {\n return {\n click: async (\n x: number,\n y: number,\n options?: { button?: MouseButton; count?: number },\n ) => {\n await this.mouse.move(x, y);\n const { button = 'left', count = 1 } = options || {};\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\n\n if (count === 2 && this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\n button,\n });\n } else {\n if (this.interfaceType === 'puppeteer') {\n if (button === 'left' && count === 1) {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\n } else {\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\n button,\n count,\n });\n }\n } else if (this.interfaceType === 'playwright') {\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\n button,\n clickCount: count,\n });\n }\n }\n },\n wheel: async (deltaX: number, deltaY: number) => {\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\n deltaX,\n deltaY,\n });\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\n deltaX,\n deltaY,\n );\n }\n },\n move: async (x: number, y: number) => {\n this.everMoved = true;\n debugPage(`mouse move to ${x}, ${y}`);\n return this.underlyingPage.mouse.move(x, y);\n },\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {\n debugPage(\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n await (this.underlyingPage as PlaywrightPage).mouse.move(\n from.x,\n from.y,\n );\n await sleep(200);\n await (this.underlyingPage as PlaywrightPage).mouse.down();\n await sleep(300);\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\n await sleep(500);\n await (this.underlyingPage as PlaywrightPage).mouse.up();\n await sleep(200);\n debugPage(\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\n );\n },\n };\n }\n\n get keyboard() {\n return {\n type: async (text: string) => {\n debugPage(`keyboard type ${text}`);\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\n },\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {\n const keys = Array.isArray(action) ? action : [action];\n debugPage('keyboard press', keys);\n for (const k of keys) {\n const commands = k.command ? [k.command] : [];\n await this.underlyingPage.keyboard.down(k.key, { commands });\n }\n for (const k of [...keys].reverse()) {\n await this.underlyingPage.keyboard.up(k.key);\n }\n },\n down: async (key: KeyInput) => {\n debugPage(`keyboard down ${key}`);\n return this.underlyingPage.keyboard.down(key);\n },\n up: async (key: KeyInput) => {\n debugPage(`keyboard up ${key}`);\n return this.underlyingPage.keyboard.up(key);\n },\n };\n }\n\n async clearInput(element: ElementInfo): Promise<void> {\n if (!element) {\n console.warn('No element to clear input');\n return;\n }\n\n const backspace = async () => {\n await sleep(100);\n await this.keyboard.press([{ key: 'Backspace' }]);\n };\n\n const isMac = process.platform === 'darwin';\n debugPage('clearInput begin');\n if (isMac) {\n if (this.interfaceType === 'puppeteer') {\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\n await this.mouse.click(element.center[0], element.center[1], {\n count: 3,\n });\n await backspace();\n }\n\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Meta');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Meta');\n await backspace();\n } else {\n await this.mouse.click(element.center[0], element.center[1]);\n await this.underlyingPage.keyboard.down('Control');\n await this.underlyingPage.keyboard.press('a');\n await this.underlyingPage.keyboard.up('Control');\n await backspace();\n }\n debugPage('clearInput end');\n }\n\n private everMoved = false;\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\n if (point) {\n await this.mouse.move(point.left, point.top);\n } else if (!this.everMoved) {\n // If the mouse has never moved, move it to the center of the page\n const size = await this.size();\n const targetX = Math.floor(size.width / 2);\n const targetY = Math.floor(size.height / 2);\n await this.mouse.move(targetX, targetY);\n }\n }\n\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -9999999);\n }\n\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, 9999999);\n }\n\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-9999999, 0);\n }\n\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(9999999, 0);\n }\n\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, -scrollDistance);\n }\n\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\n const innerHeight = await this.evaluate(() => window.innerHeight);\n const scrollDistance = distance || innerHeight * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(0, scrollDistance);\n }\n\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(-scrollDistance, 0);\n }\n\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\n const innerWidth = await this.evaluate(() => window.innerWidth);\n const scrollDistance = distance || innerWidth * 0.7;\n await this.moveToPointBeforeScroll(startingPoint);\n return this.mouse.wheel(scrollDistance, 0);\n }\n\n async navigate(url: string): Promise<void> {\n debugPage(`navigate to ${url}`);\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goto(url);\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goto(url);\n } else {\n throw new Error('Unsupported page type for navigate');\n }\n }\n\n async reload(): Promise<void> {\n debugPage('reload page');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).reload();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).reload();\n } else {\n throw new Error('Unsupported page type for reload');\n }\n }\n\n async goBack(): Promise<void> {\n debugPage('go back');\n if (this.interfaceType === 'puppeteer') {\n await (this.underlyingPage as PuppeteerPage).goBack();\n } else if (this.interfaceType === 'playwright') {\n await (this.underlyingPage as PlaywrightPage).goBack();\n } else {\n throw new Error('Unsupported page type for go back');\n }\n }\n\n async beforeInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\n if (this.onBeforeInvokeAction) {\n await this.onBeforeInvokeAction(name, param);\n }\n }\n\n async afterInvokeAction(name: string, param: any): Promise<void> {\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\n if (this.onAfterInvokeAction) {\n await this.onAfterInvokeAction(name, param);\n }\n }\n\n async destroy(): Promise<void> { }\n\n async getContext(): Promise<UIContext> {\n return await WebPageContextParser(this, {});\n }\n async swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ) {\n const LONG_PRESS_THRESHOLD = 500;\n const MIN_PRESS_THRESHOLD = 150;\n duration = duration || 100;\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n debugPage(\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\n );\n\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down({ button: 'left' });\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n\n const steps = 30;\n const delay = duration / steps;\n for (let i = 1; i <= steps; i++) {\n const x = from.x + (to.x - from.x) * (i / steps);\n const y = from.y + (to.y - from.y) * (i / steps);\n await page.mouse.move(x, y);\n await page.waitForTimeout(delay);\n }\n\n await page.mouse.up({ button: 'left' });\n }\n }\n async longPress(x: number, y: number, duration?: number) {\n duration = duration || 500;\n const LONG_PRESS_THRESHOLD = 600;\n const MIN_PRESS_THRESHOLD = 300;\n if (duration > LONG_PRESS_THRESHOLD) {\n duration = LONG_PRESS_THRESHOLD;\n }\n if (duration < MIN_PRESS_THRESHOLD) {\n duration = MIN_PRESS_THRESHOLD;\n }\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\n if (this.interfaceType === 'puppeteer') {\n const page = this.underlyingPage as PuppeteerPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await new Promise((res) => setTimeout(res, duration));\n await page.mouse.up({ button: 'left' });\n } else if (this.interfaceType === 'playwright') {\n const page = this.underlyingPage as PlaywrightPage;\n await page.mouse.move(x, y);\n await page.mouse.down({ button: 'left' });\n await page.waitForTimeout(duration);\n await page.mouse.up({ button: 'left' });\n }\n }\n}\n\nexport function forceClosePopup(\n page: PuppeteerPage | PlaywrightPage,\n debugProfile: DebugFunction,\n) {\n page.on('popup', async (popup) => {\n if (!popup) {\n console.warn('got a popup event, but the popup is not ready yet, skip');\n return;\n }\n const url = await (popup as PuppeteerPage).url();\n console.log(`Popup opened: ${url}`);\n if (!(popup as PuppeteerPage).isClosed()) {\n try {\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\n } catch (error) {\n debugProfile(`failed to close popup ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`popup is already closed, skip close ${url}`);\n }\n\n if (!page.isClosed()) {\n try {\n await page.goto(url);\n } catch (error) {\n debugProfile(`failed to goto ${url}, error: ${error}`);\n }\n } else {\n debugProfile(`page is already closed, skip goto ${url}`);\n }\n });\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","id","elementInfosScriptContent","getElementInfosScriptContent","JSON","point","isOrderSensitive","args","data","rect","opt","center","Math","orderSensitive","sanitized","feature","webFeature","elementInfo","_this_viewportSize","matchedRect","Error","scriptContent","frames","frame","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","options","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","element","backspace","isMac","process","size","targetX","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","page","steps","delay","i","resolve","setTimeout","res","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup"],"mappings":"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"}
|
package/dist/lib/web-element.js
CHANGED
|
@@ -69,7 +69,7 @@ class WebElementInfoImpl {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
const debug = (0, logger_namespaceObject.getDebug)('web:parse-context');
|
|
72
|
-
async function WebPageContextParser(page, _opt) {
|
|
72
|
+
async function WebPageContextParser(page, _opt = {}) {
|
|
73
73
|
var _page_getElementsNodeTree;
|
|
74
74
|
const basicContext = await (0, agent_namespaceObject.commonContextParser)(page, {
|
|
75
75
|
uploadServerUrl: _opt.uploadServerUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-element.js","sources":["webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./src/web-element.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 {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { traverseTree } from '@rpascene/shared/extractor';\nimport { getDebug } from '@rpascene/shared/logger';\nimport { _keyDefinitions } from '@rpascene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@rpascene/core/agent';\nimport type { NodeType } from '@rpascene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n allPaths?: any;\n\n containerPaths?: any;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n allPaths,\n containerPaths\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n allPaths?: any;\n containerPaths?: any;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n this.allPaths = allPaths;\n this.containerPaths = containerPaths\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n debug('will traverse element tree');\n const tree = (await page.getElementsNodeTree?.()) || {\n node: null,\n children: [],\n };\n const webTree = traverseTree(tree!, (elementInfo) => {\n const { rect, id, content, attributes, indexId, isVisible, allPaths, containerPaths } = elementInfo;\n return new WebElementInfoImpl({\n rect,\n id,\n content,\n attributes,\n indexId,\n isVisible,\n allPaths,\n containerPaths\n });\n });\n debug('traverse element tree end');\n\n return {\n ...basicContext,\n tree: webTree,\n };\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","allPaths","containerPaths","Math","debug","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","tree","webTree","traverseTree","elementInfo","limitOpenNewTabScript"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;AC8BO,MAAMI;IAwBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,cAAc,EAcf,CAAE;QA9CH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAEA;QAEA;QA0BE,IAAI,CAAC,OAAO,GAAGR;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZQ,KAAK,KAAK,CAACR,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCQ,KAAK,KAAK,CAACR,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,cAAc,GAAGC;IACxB;AACF;AAEA,MAAME,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,
|
|
1
|
+
{"version":3,"file":"web-element.js","sources":["webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./src/web-element.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 {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@rpascene/core';\nimport type { AbstractInterface } from '@rpascene/core/device';\nimport { traverseTree } from '@rpascene/shared/extractor';\nimport { getDebug } from '@rpascene/shared/logger';\nimport { _keyDefinitions } from '@rpascene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@rpascene/core/agent';\nimport type { NodeType } from '@rpascene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n allPaths?: any;\n\n containerPaths?: any;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n allPaths,\n containerPaths\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n allPaths?: any;\n containerPaths?: any;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n this.allPaths = allPaths;\n this.containerPaths = containerPaths\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string } = {},\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n debug('will traverse element tree');\n const tree = (await page.getElementsNodeTree?.()) || {\n node: null,\n children: [],\n };\n const webTree = traverseTree(tree!, (elementInfo) => {\n const { rect, id, content, attributes, indexId, isVisible, allPaths, containerPaths } = elementInfo;\n return new WebElementInfoImpl({\n rect,\n id,\n content,\n attributes,\n indexId,\n isVisible,\n allPaths,\n containerPaths\n });\n });\n debug('traverse element tree end');\n\n return {\n ...basicContext,\n tree: webTree,\n };\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","allPaths","containerPaths","Math","debug","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","tree","webTree","traverseTree","elementInfo","limitOpenNewTabScript"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;AC8BO,MAAMI;IAwBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,cAAc,EAcf,CAAE;QA9CH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAEA;QAEA;QA0BE,IAAI,CAAC,OAAO,GAAGR;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZQ,KAAK,KAAK,CAACR,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCQ,KAAK,KAAK,CAACR,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,cAAc,GAAGC;IACxB;AACF;AAEA,MAAME,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,OAAqC,CAAC,CAAC;QAOnBD;IALpB,MAAME,eAAe,MAAMC,AAAAA,IAAAA,sBAAAA,mBAAAA,AAAAA,EAAoBH,MAAM;QACnD,iBAAiBC,KAAK,eAAe;IACvC;IAEAJ,MAAM;IACN,MAAMO,OAAQ,eAAMJ,CAAAA,4BAAAA,KAAK,mBAAmB,AAAD,IAAvBA,KAAAA,IAAAA,0BAAAA,IAAAA,CAAAA,KAAI,KAA6B;QACnD,MAAM;QACN,UAAU,EAAE;IACd;IACA,MAAMK,UAAUC,AAAAA,IAAAA,0BAAAA,YAAAA,AAAAA,EAAaF,MAAO,CAACG;QACnC,MAAM,EAAEnB,IAAI,EAAEC,EAAE,EAAEF,OAAO,EAAEG,UAAU,EAAEC,OAAO,EAAEE,SAAS,EAAEC,QAAQ,EAAEC,cAAc,EAAE,GAAGY;QACxF,OAAO,IAAIrB,mBAAmB;YAC5BE;YACAC;YACAF;YACAG;YACAC;YACAE;YACAC;YACAC;QACF;IACF;IACAE,MAAM;IAEN,OAAO;QACL,GAAGK,YAAY;QACf,MAAMG;IACR;AACF;AAEO,MAAMG,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
|
package/dist/lib/web-page.js
CHANGED
|
@@ -43,6 +43,7 @@ const device_namespaceObject = require("@rpascene/core/device");
|
|
|
43
43
|
const utils_namespaceObject = require("@rpascene/core/utils");
|
|
44
44
|
const logger_namespaceObject = require("@rpascene/shared/logger");
|
|
45
45
|
const us_keyboard_layout_namespaceObject = require("@rpascene/shared/us-keyboard-layout");
|
|
46
|
+
const core_namespaceObject = require("@rpascene/core");
|
|
46
47
|
const debug = (0, logger_namespaceObject.getDebug)('web:page');
|
|
47
48
|
function normalizeKeyInputs(value) {
|
|
48
49
|
const inputs = Array.isArray(value) ? value : [
|
|
@@ -239,6 +240,33 @@ const commonWebActionsForWebPage = (page)=>[
|
|
|
239
240
|
const element = param.locate;
|
|
240
241
|
external_node_assert_default()(element, 'Element not found, cannot clear input');
|
|
241
242
|
await page.clearInput(element);
|
|
243
|
+
}),
|
|
244
|
+
(0, device_namespaceObject.defineAction)({
|
|
245
|
+
name: 'Navigate',
|
|
246
|
+
description: 'Navigate the browser to a specified URL. Opens the URL in the current tab.',
|
|
247
|
+
paramSchema: core_namespaceObject.z.object({
|
|
248
|
+
url: core_namespaceObject.z.string().describe('The URL to navigate to. Must start with https://, file://, or a similar protocol.')
|
|
249
|
+
}),
|
|
250
|
+
call: async (param)=>{
|
|
251
|
+
if (!page.navigate) throw new Error('Navigate operation is not supported on this page type');
|
|
252
|
+
await page.navigate(param.url);
|
|
253
|
+
}
|
|
254
|
+
}),
|
|
255
|
+
(0, device_namespaceObject.defineAction)({
|
|
256
|
+
name: 'Reload',
|
|
257
|
+
description: 'Reload the current page',
|
|
258
|
+
call: async ()=>{
|
|
259
|
+
if (!page.reload) throw new Error('Reload operation is not supported on this page type');
|
|
260
|
+
await page.reload();
|
|
261
|
+
}
|
|
262
|
+
}),
|
|
263
|
+
(0, device_namespaceObject.defineAction)({
|
|
264
|
+
name: 'GoBack',
|
|
265
|
+
description: 'Navigate back in browser history',
|
|
266
|
+
call: async ()=>{
|
|
267
|
+
if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
|
|
268
|
+
await page.goBack();
|
|
269
|
+
}
|
|
242
270
|
})
|
|
243
271
|
];
|
|
244
272
|
exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
|
package/dist/lib/web-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-page.js","sources":["webpack://@rpascene/web/webpack/runtime/compat_get_default_export","webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./src/web-page.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import assert from 'node:assert';\nimport type { Point } from '@rpascene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@rpascene/core/device';\n\nimport { sleep } from '@rpascene/core/utils';\nimport type { ElementInfo } from '@rpascene/shared/extractor';\nimport { getDebug } from '@rpascene/shared/logger';\nimport { transformHotkeyInput } from '@rpascene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\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 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}\n// 通用页面操作\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(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 === 'untilTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'untilBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'untilRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'untilLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'once' || !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 // until mouse event is done\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 defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n ];\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","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","commonWebActionsForWebPage","page","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-page.js","sources":["webpack://@rpascene/web/webpack/runtime/compat_get_default_export","webpack://@rpascene/web/webpack/runtime/define_property_getters","webpack://@rpascene/web/webpack/runtime/has_own_property","webpack://@rpascene/web/webpack/runtime/make_namespace_object","webpack://@rpascene/web/./src/web-page.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import assert from 'node:assert';\nimport type { Point } from '@rpascene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n defineAction,\n} from '@rpascene/core/device';\n\nimport { sleep } from '@rpascene/core/utils';\nimport type { ElementInfo } from '@rpascene/shared/extractor';\nimport { getDebug } from '@rpascene/shared/logger';\nimport { transformHotkeyInput } from '@rpascene/shared/us-keyboard-layout';\nimport { z } from '@rpascene/core';\nconst debug = getDebug('web:page');\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\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): 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}\n// 通用页面操作\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(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 === 'untilTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'untilBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'untilRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'untilLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'once' || !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 // until mouse event is done\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 defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n\n defineAction({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: 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 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('Reload operation is not supported on this page type');\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('GoBack operation is not supported on this page type');\n }\n await page.goBack();\n },\n }),\n\n ];\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","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","commonWebActionsForWebPage","page","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput","defineAction","z"],"mappings":"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"}
|
|
@@ -41,12 +41,19 @@ export default class ChromeExtensionProxyPage implements AbstractInterface {
|
|
|
41
41
|
getElementsInfo(): Promise<ElementInfo[]>;
|
|
42
42
|
getXpathsById(id: string): Promise<any>;
|
|
43
43
|
getXpathsByPoint(point: Point, isOrderSensitive: boolean): Promise<any>;
|
|
44
|
+
getElementFromPoint(args: {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
}): Promise<any>;
|
|
44
48
|
getElementInfoByXpath(xpath: string): Promise<any>;
|
|
45
49
|
getElementsNodeTree(): Promise<ElementTreeNode<ElementInfo>>;
|
|
46
50
|
getContext(): Promise<UIContext>;
|
|
47
51
|
size(): Promise<Size>;
|
|
48
52
|
screenshotBase64(): Promise<string>;
|
|
49
53
|
url(): Promise<string>;
|
|
54
|
+
navigate(url: string): Promise<void>;
|
|
55
|
+
reload(): Promise<void>;
|
|
56
|
+
goBack(): Promise<void>;
|
|
50
57
|
scrollUntilTop(startingPoint?: Point): Promise<void>;
|
|
51
58
|
scrollUntilBottom(startingPoint?: Point): Promise<void>;
|
|
52
59
|
scrollUntilLeft(startingPoint?: Point): Promise<void>;
|
|
@@ -25,6 +25,10 @@ export declare class Page<AgentType extends 'puppeteer' | 'playwright', Interfac
|
|
|
25
25
|
getElementsInfo(): Promise<ElementInfo[]>;
|
|
26
26
|
getXpathsById(id: string): Promise<any>;
|
|
27
27
|
getXpathsByPoint(point: Point, isOrderSensitive: boolean): Promise<any>;
|
|
28
|
+
getElementFromPoint(args: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
}): Promise<any>;
|
|
28
32
|
getElementInfoByXpath(xpath: string): Promise<any>;
|
|
29
33
|
cacheFeatureForRect(rect: Rect, opt?: {
|
|
30
34
|
_orderSensitive: boolean;
|
|
@@ -74,6 +78,8 @@ export declare class Page<AgentType extends 'puppeteer' | 'playwright', Interfac
|
|
|
74
78
|
scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;
|
|
75
79
|
scrollRight(distance?: number, startingPoint?: Point): Promise<void>;
|
|
76
80
|
navigate(url: string): Promise<void>;
|
|
81
|
+
reload(): Promise<void>;
|
|
82
|
+
goBack(): Promise<void>;
|
|
77
83
|
beforeInvokeAction(name: string, param: any): Promise<void>;
|
|
78
84
|
afterInvokeAction(name: string, param: any): Promise<void>;
|
|
79
85
|
destroy(): Promise<void>;
|
|
@@ -45,7 +45,7 @@ export declare class WebElementInfoImpl implements WebElementInfo {
|
|
|
45
45
|
containerPaths?: any;
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
-
export declare function WebPageContextParser(page: AbstractInterface, _opt
|
|
48
|
+
export declare function WebPageContextParser(page: AbstractInterface, _opt?: {
|
|
49
49
|
uploadServerUrl?: string;
|
|
50
50
|
}): Promise<UIContext>;
|
|
51
51
|
export declare const limitOpenNewTabScript = "\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n";
|
package/dist/types/web-page.d.ts
CHANGED
|
@@ -36,6 +36,9 @@ export interface ChromePageDestroyOptions {
|
|
|
36
36
|
closeTab?: boolean;
|
|
37
37
|
}
|
|
38
38
|
export declare abstract class AbstractWebPage extends AbstractInterface {
|
|
39
|
+
navigate?(url: string): Promise<void>;
|
|
40
|
+
reload?(): Promise<void>;
|
|
41
|
+
goBack?(): Promise<void>;
|
|
39
42
|
get mouse(): MouseAction;
|
|
40
43
|
get keyboard(): KeyboardAction;
|
|
41
44
|
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": "0.30.
|
|
11
|
+
"version": "0.30.12",
|
|
12
12
|
"repository": "",
|
|
13
13
|
"homepage": "",
|
|
14
14
|
"main": "./dist/lib/index.js",
|
|
@@ -112,9 +112,9 @@
|
|
|
112
112
|
"http-server": "14.1.1",
|
|
113
113
|
"socket.io": "^4.8.1",
|
|
114
114
|
"socket.io-client": "4.8.1",
|
|
115
|
-
"@rpascene/
|
|
116
|
-
"@rpascene/
|
|
117
|
-
"@rpascene/shared": "0.30.
|
|
115
|
+
"@rpascene/core": "0.30.12",
|
|
116
|
+
"@rpascene/playground": "0.30.12",
|
|
117
|
+
"@rpascene/shared": "0.30.12"
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
120
|
"@types/js-yaml": "4.0.9",
|