@sqaitech/web 0.30.14 → 0.30.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/playwright/ai-fixture.mjs +1 -1
- package/dist/es/playwright/ai-fixture.mjs.map +1 -1
- package/dist/es/puppeteer/base-page.mjs +2 -2
- package/dist/es/puppeteer/base-page.mjs.map +1 -1
- package/dist/lib/bridge-mode/io-client.js +1 -1
- package/dist/lib/bridge-mode/io-server.js +2 -2
- package/dist/lib/bridge-mode/page-browser-side.js +1 -1
- package/dist/lib/playwright/ai-fixture.js +1 -1
- package/dist/lib/playwright/ai-fixture.js.map +1 -1
- package/dist/lib/puppeteer/base-page.js +2 -2
- package/dist/lib/puppeteer/base-page.js.map +1 -1
- package/package.json +4 -4
|
@@ -71,7 +71,7 @@ class BridgeServer {
|
|
|
71
71
|
logMsg('one client connected');
|
|
72
72
|
this.socket = socket;
|
|
73
73
|
const clientVersion = socket.handshake.query.version;
|
|
74
|
-
logMsg(`Bridge connected, cli-side version v0.30.
|
|
74
|
+
logMsg(`Bridge connected, cli-side version v0.30.16, browser-side version v${clientVersion}`);
|
|
75
75
|
socket.on(BridgeEvent.CallResponse, (params)=>{
|
|
76
76
|
const id = params.id;
|
|
77
77
|
const response = params.response;
|
|
@@ -99,7 +99,7 @@ class BridgeServer {
|
|
|
99
99
|
var _this_onConnect, _this;
|
|
100
100
|
null == (_this_onConnect = (_this = this).onConnect) || _this_onConnect.call(_this);
|
|
101
101
|
const payload = {
|
|
102
|
-
version: "0.30.
|
|
102
|
+
version: "0.30.16"
|
|
103
103
|
};
|
|
104
104
|
socket.emit(BridgeEvent.Connected, payload);
|
|
105
105
|
Promise.resolve().then(()=>{
|
|
@@ -45,7 +45,7 @@ class ExtensionBridgePageBrowserSide extends page {
|
|
|
45
45
|
}
|
|
46
46
|
}, ()=>this.destroy());
|
|
47
47
|
await this.bridgeClient.connect();
|
|
48
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.30.
|
|
48
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.30.16`, 'log');
|
|
49
49
|
}
|
|
50
50
|
async connect() {
|
|
51
51
|
return await this.setupBridgeClient();
|
|
@@ -80,7 +80,7 @@ const PlaywrightAiFixture = (options)=>{
|
|
|
80
80
|
debugPage(`waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`);
|
|
81
81
|
await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);
|
|
82
82
|
} catch (error) {
|
|
83
|
-
console.warn('[
|
|
83
|
+
console.warn('[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
84
84
|
}
|
|
85
85
|
try {
|
|
86
86
|
const result = await agent[aiActionType](taskPrompt, ...args || []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright\\ai-fixture.mjs","sources":["webpack://@sqaitech/web/./src/playwright/ai-fixture.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { PlaywrightAgent, type PlaywrightWebPage } from '@/playwright/index';\r\nimport type { WebPageAgentOpt } from '@/web-element';\r\nimport type { Cache } from '@sqaitech/core';\r\nimport type { AgentOpt, Agent as PageAgent } from '@sqaitech/core/agent';\r\nimport { processCacheConfig } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { replaceIllegalPathCharsAndSpace } from '@sqaitech/shared/utils';\r\nimport { type TestInfo, type TestType, test } from '@playwright/test';\r\nimport type { Page as OriginPlaywrightPage } from 'playwright';\r\nexport type APITestType = Pick<TestType<any, any>, 'step'>;\r\n\r\nconst debugPage = getDebug('web:playwright:ai-fixture');\r\n\r\nconst groupAndCaseForTest = (testInfo: TestInfo) => {\r\n let taskFile: string;\r\n let taskTitle: string;\r\n const titlePath = [...testInfo.titlePath];\r\n\r\n if (titlePath.length > 1) {\r\n taskFile = titlePath.shift() || 'unnamed';\r\n taskTitle = titlePath.join('__');\r\n } else if (titlePath.length === 1) {\r\n taskTitle = titlePath[0];\r\n taskFile = `${taskTitle}`;\r\n } else {\r\n taskTitle = 'unnamed';\r\n taskFile = 'unnamed';\r\n }\r\n\r\n const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;\r\n\r\n return {\r\n file: taskFile,\r\n id: replaceIllegalPathCharsAndSpace(`${taskFile}(${taskTitle})`),\r\n title: replaceIllegalPathCharsAndSpace(taskTitleWithRetry),\r\n };\r\n};\r\n\r\nconst midsceneAgentKeyId = '_midsceneAgentId';\r\nexport const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';\r\n\r\ntype PlaywrightCacheConfig = {\r\n strategy?: 'read-only' | 'read-write' | 'write-only';\r\n id?: string;\r\n};\r\ntype PlaywrightCache = false | true | PlaywrightCacheConfig;\r\n\r\nexport const PlaywrightAiFixture = (options?: {\r\n forceSameTabNavigation?: boolean;\r\n waitForNetworkIdleTimeout?: number;\r\n waitForNavigationTimeout?: number;\r\n cache?: PlaywrightCache;\r\n}) => {\r\n const {\r\n forceSameTabNavigation = true,\r\n waitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n waitForNavigationTimeout = DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n cache,\r\n } = options ?? {};\r\n\r\n // Helper function to process cache configuration and auto-generate ID from test info\r\n const processTestCacheConfig = (testInfo: TestInfo): Cache | undefined => {\r\n // Generate ID from test info\r\n const { id } = groupAndCaseForTest(testInfo);\r\n\r\n // Use shared processCacheConfig with generated ID as fallback\r\n return processCacheConfig(cache as Cache, id);\r\n };\r\n\r\n const pageAgentMap: Record<string, PageAgent<PlaywrightWebPage>> = {};\r\n const createOrReuseAgentForPage = (\r\n page: OriginPlaywrightPage,\r\n testInfo: TestInfo, // { testId: string; taskFile: string; taskTitle: string },\r\n opts?: WebPageAgentOpt,\r\n ) => {\r\n let idForPage = (page as any)[midsceneAgentKeyId];\r\n if (!idForPage) {\r\n idForPage = uuid();\r\n (page as any)[midsceneAgentKeyId] = idForPage;\r\n const { testId } = testInfo;\r\n const { file, title } = groupAndCaseForTest(testInfo);\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n pageAgentMap[idForPage] = new PlaywrightAgent(page, {\r\n testId: `playwright-${testId}-${idForPage}`,\r\n forceSameTabNavigation,\r\n cache: cacheConfig,\r\n groupName: title,\r\n groupDescription: file,\r\n generateReport: false, // we will generate it in the reporter\r\n ...opts,\r\n });\r\n\r\n pageAgentMap[idForPage].onDumpUpdate = (dump: string) => {\r\n updateDumpAnnotation(testInfo, dump);\r\n };\r\n\r\n page.on('close', () => {\r\n debugPage('page closed');\r\n pageAgentMap[idForPage].destroy();\r\n delete pageAgentMap[idForPage];\r\n });\r\n }\r\n\r\n return pageAgentMap[idForPage];\r\n };\r\n\r\n async function generateAiFunction(options: {\r\n page: OriginPlaywrightPage;\r\n testInfo: TestInfo;\r\n use: any;\r\n aiActionType:\r\n | 'ai'\r\n | 'aiAction'\r\n | 'aiHover'\r\n | 'aiInput'\r\n | 'aiKeyboardPress'\r\n | 'aiScroll'\r\n | 'aiTap'\r\n | 'aiRightClick'\r\n | 'aiDoubleClick'\r\n | 'aiQuery'\r\n | 'aiAssert'\r\n | 'aiWaitFor'\r\n | 'aiLocate'\r\n | 'aiNumber'\r\n | 'aiString'\r\n | 'aiBoolean'\r\n | 'aiAsk'\r\n | 'runYaml'\r\n | 'setAIActionContext'\r\n | 'evaluateJavaScript'\r\n | 'logScreenshot'\r\n | 'freezePageContext'\r\n | 'unfreezePageContext';\r\n }) {\r\n const { page, testInfo, use, aiActionType } = options;\r\n const agent = createOrReuseAgentForPage(page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n }) as PlaywrightAgent;\r\n\r\n await use(async (taskPrompt: string, ...args: any[]) => {\r\n return new Promise((resolve, reject) => {\r\n test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async () => {\r\n try {\r\n debugPage(\r\n `waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`,\r\n );\r\n await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);\r\n } catch (error) {\r\n console.warn(\r\n '[midscene:warning] Waiting for network idle has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n try {\r\n type AgentMethod = (\r\n prompt: string,\r\n ...restArgs: any[]\r\n ) => Promise<any>;\r\n const result = await (agent[aiActionType] as AgentMethod)(\r\n taskPrompt,\r\n ...(args || []),\r\n );\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n const updateDumpAnnotation = (test: TestInfo, dump: string) => {\r\n // Write dump to temporary file\r\n const tempFileName = `midscene-dump-${test.testId || uuid()}-${Date.now()}.json`;\r\n const tempFilePath = join(tmpdir(), tempFileName);\r\n\r\n writeFileSync(tempFilePath, dump, 'utf-8');\r\n debugPage(`Dump written to temp file: ${tempFilePath}`);\r\n\r\n // Store only the file path in annotation\r\n const currentAnnotation = test.annotations.find((item) => {\r\n return item.type === midsceneDumpAnnotationId;\r\n });\r\n if (currentAnnotation) {\r\n // Store file path instead of dump content\r\n currentAnnotation.description = tempFilePath;\r\n } else {\r\n test.annotations.push({\r\n type: midsceneDumpAnnotationId,\r\n description: tempFilePath,\r\n });\r\n }\r\n };\r\n\r\n return {\r\n agentForPage: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await use(\r\n async (\r\n propsPage?: OriginPlaywrightPage | undefined,\r\n opts?: AgentOpt,\r\n ) => {\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n // Handle cache configuration priority:\r\n // 1. If user provides cache in opts, use it (but auto-generate ID if missing)\r\n // 2. Otherwise use fixture's cache config\r\n let finalCacheConfig = cacheConfig;\r\n if (opts?.cache !== undefined) {\r\n const userCache = opts.cache;\r\n if (userCache === false) {\r\n finalCacheConfig = false;\r\n } else if (userCache === true) {\r\n // Auto-generate ID for user's cache: true\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { id };\r\n } else if (typeof userCache === 'object') {\r\n if (!userCache.id) {\r\n // Auto-generate ID for user's cache object without ID\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { ...userCache, id };\r\n } else {\r\n finalCacheConfig = userCache;\r\n }\r\n }\r\n }\r\n\r\n const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n cache: finalCacheConfig,\r\n ...opts,\r\n });\r\n return agent;\r\n },\r\n );\r\n },\r\n ai: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'ai',\r\n });\r\n },\r\n aiAction: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAction',\r\n });\r\n },\r\n aiTap: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiTap',\r\n });\r\n },\r\n aiRightClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiRightClick',\r\n });\r\n },\r\n aiDoubleClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiDoubleClick',\r\n });\r\n },\r\n aiHover: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiHover',\r\n });\r\n },\r\n aiInput: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiInput',\r\n });\r\n },\r\n aiKeyboardPress: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiKeyboardPress',\r\n });\r\n },\r\n aiScroll: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiScroll',\r\n });\r\n },\r\n aiQuery: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiQuery',\r\n });\r\n },\r\n aiAssert: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAssert',\r\n });\r\n },\r\n aiWaitFor: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiWaitFor',\r\n });\r\n },\r\n aiLocate: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiLocate',\r\n });\r\n },\r\n aiNumber: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiNumber',\r\n });\r\n },\r\n aiString: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiString',\r\n });\r\n },\r\n aiBoolean: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiBoolean',\r\n });\r\n },\r\n aiAsk: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAsk',\r\n });\r\n },\r\n runYaml: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'runYaml',\r\n });\r\n },\r\n setAIActionContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'setAIActionContext',\r\n });\r\n },\r\n evaluateJavaScript: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'evaluateJavaScript',\r\n });\r\n },\r\n logScreenshot: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'logScreenshot',\r\n });\r\n },\r\n freezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'freezePageContext',\r\n });\r\n },\r\n unfreezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'unfreezePageContext',\r\n });\r\n },\r\n };\r\n};\r\n\r\nexport type PlayWrightAiFixtureType = {\r\n agentForPage: (\r\n page?: any,\r\n opts?: any,\r\n ) => Promise<PageAgent<PlaywrightWebPage>>;\r\n ai: <T = any>(prompt: string) => Promise<T>;\r\n aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;\r\n aiTap: (\r\n ...args: Parameters<PageAgent['aiTap']>\r\n ) => ReturnType<PageAgent['aiTap']>;\r\n aiRightClick: (\r\n ...args: Parameters<PageAgent['aiRightClick']>\r\n ) => ReturnType<PageAgent['aiRightClick']>;\r\n aiDoubleClick: (\r\n ...args: Parameters<PageAgent['aiDoubleClick']>\r\n ) => ReturnType<PageAgent['aiDoubleClick']>;\r\n aiHover: (\r\n ...args: Parameters<PageAgent['aiHover']>\r\n ) => ReturnType<PageAgent['aiHover']>;\r\n aiInput: (\r\n ...args: Parameters<PageAgent['aiInput']>\r\n ) => ReturnType<PageAgent['aiInput']>;\r\n aiKeyboardPress: (\r\n ...args: Parameters<PageAgent['aiKeyboardPress']>\r\n ) => ReturnType<PageAgent['aiKeyboardPress']>;\r\n aiScroll: (\r\n ...args: Parameters<PageAgent['aiScroll']>\r\n ) => ReturnType<PageAgent['aiScroll']>;\r\n aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;\r\n aiAssert: (\r\n ...args: Parameters<PageAgent['aiAssert']>\r\n ) => ReturnType<PageAgent['aiAssert']>;\r\n aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;\r\n aiLocate: (\r\n ...args: Parameters<PageAgent['aiLocate']>\r\n ) => ReturnType<PageAgent['aiLocate']>;\r\n aiNumber: (\r\n ...args: Parameters<PageAgent['aiNumber']>\r\n ) => ReturnType<PageAgent['aiNumber']>;\r\n aiString: (\r\n ...args: Parameters<PageAgent['aiString']>\r\n ) => ReturnType<PageAgent['aiString']>;\r\n aiBoolean: (\r\n ...args: Parameters<PageAgent['aiBoolean']>\r\n ) => ReturnType<PageAgent['aiBoolean']>;\r\n aiAsk: (\r\n ...args: Parameters<PageAgent['aiAsk']>\r\n ) => ReturnType<PageAgent['aiAsk']>;\r\n runYaml: (\r\n ...args: Parameters<PageAgent['runYaml']>\r\n ) => ReturnType<PageAgent['runYaml']>;\r\n setAIActionContext: (\r\n ...args: Parameters<PageAgent['setAIActionContext']>\r\n ) => ReturnType<PageAgent['setAIActionContext']>;\r\n evaluateJavaScript: (\r\n ...args: Parameters<PageAgent['evaluateJavaScript']>\r\n ) => ReturnType<PageAgent['evaluateJavaScript']>;\r\n logScreenshot: (\r\n ...args: Parameters<PageAgent['logScreenshot']>\r\n ) => ReturnType<PageAgent['logScreenshot']>;\r\n freezePageContext: (\r\n ...args: Parameters<PageAgent['freezePageContext']>\r\n ) => ReturnType<PageAgent['freezePageContext']>;\r\n unfreezePageContext: (\r\n ...args: Parameters<PageAgent['unfreezePageContext']>\r\n ) => ReturnType<PageAgent['unfreezePageContext']>;\r\n};\r\n"],"names":["debugPage","getDebug","groupAndCaseForTest","testInfo","taskFile","taskTitle","titlePath","taskTitleWithRetry","replaceIllegalPathCharsAndSpace","midsceneAgentKeyId","midsceneDumpAnnotationId","PlaywrightAiFixture","options","forceSameTabNavigation","waitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","waitForNavigationTimeout","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","cache","processTestCacheConfig","id","processCacheConfig","pageAgentMap","createOrReuseAgentForPage","page","opts","idForPage","uuid","testId","file","title","cacheConfig","PlaywrightAgent","dump","updateDumpAnnotation","generateAiFunction","use","aiActionType","agent","taskPrompt","args","Promise","resolve","reject","test","JSON","error","console","result","tempFileName","Date","tempFilePath","join","tmpdir","writeFileSync","currentAnnotation","item","propsPage","finalCacheConfig","undefined","userCache"],"mappings":"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BACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,OAAO,OACL,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,eAAe,OACb,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,mBAAmB,OACjB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,qBAAqB,OACnB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;IACF;AACF"}
|
|
1
|
+
{"version":3,"file":"playwright\\ai-fixture.mjs","sources":["webpack://@sqaitech/web/./src/playwright/ai-fixture.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { PlaywrightAgent, type PlaywrightWebPage } from '@/playwright/index';\r\nimport type { WebPageAgentOpt } from '@/web-element';\r\nimport type { Cache } from '@sqaitech/core';\r\nimport type { AgentOpt, Agent as PageAgent } from '@sqaitech/core/agent';\r\nimport { processCacheConfig } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { replaceIllegalPathCharsAndSpace } from '@sqaitech/shared/utils';\r\nimport { type TestInfo, type TestType, test } from '@playwright/test';\r\nimport type { Page as OriginPlaywrightPage } from 'playwright';\r\nexport type APITestType = Pick<TestType<any, any>, 'step'>;\r\n\r\nconst debugPage = getDebug('web:playwright:ai-fixture');\r\n\r\nconst groupAndCaseForTest = (testInfo: TestInfo) => {\r\n let taskFile: string;\r\n let taskTitle: string;\r\n const titlePath = [...testInfo.titlePath];\r\n\r\n if (titlePath.length > 1) {\r\n taskFile = titlePath.shift() || 'unnamed';\r\n taskTitle = titlePath.join('__');\r\n } else if (titlePath.length === 1) {\r\n taskTitle = titlePath[0];\r\n taskFile = `${taskTitle}`;\r\n } else {\r\n taskTitle = 'unnamed';\r\n taskFile = 'unnamed';\r\n }\r\n\r\n const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;\r\n\r\n return {\r\n file: taskFile,\r\n id: replaceIllegalPathCharsAndSpace(`${taskFile}(${taskTitle})`),\r\n title: replaceIllegalPathCharsAndSpace(taskTitleWithRetry),\r\n };\r\n};\r\n\r\nconst midsceneAgentKeyId = '_midsceneAgentId';\r\nexport const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';\r\n\r\ntype PlaywrightCacheConfig = {\r\n strategy?: 'read-only' | 'read-write' | 'write-only';\r\n id?: string;\r\n};\r\ntype PlaywrightCache = false | true | PlaywrightCacheConfig;\r\n\r\nexport const PlaywrightAiFixture = (options?: {\r\n forceSameTabNavigation?: boolean;\r\n waitForNetworkIdleTimeout?: number;\r\n waitForNavigationTimeout?: number;\r\n cache?: PlaywrightCache;\r\n}) => {\r\n const {\r\n forceSameTabNavigation = true,\r\n waitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n waitForNavigationTimeout = DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n cache,\r\n } = options ?? {};\r\n\r\n // Helper function to process cache configuration and auto-generate ID from test info\r\n const processTestCacheConfig = (testInfo: TestInfo): Cache | undefined => {\r\n // Generate ID from test info\r\n const { id } = groupAndCaseForTest(testInfo);\r\n\r\n // Use shared processCacheConfig with generated ID as fallback\r\n return processCacheConfig(cache as Cache, id);\r\n };\r\n\r\n const pageAgentMap: Record<string, PageAgent<PlaywrightWebPage>> = {};\r\n const createOrReuseAgentForPage = (\r\n page: OriginPlaywrightPage,\r\n testInfo: TestInfo, // { testId: string; taskFile: string; taskTitle: string },\r\n opts?: WebPageAgentOpt,\r\n ) => {\r\n let idForPage = (page as any)[midsceneAgentKeyId];\r\n if (!idForPage) {\r\n idForPage = uuid();\r\n (page as any)[midsceneAgentKeyId] = idForPage;\r\n const { testId } = testInfo;\r\n const { file, title } = groupAndCaseForTest(testInfo);\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n pageAgentMap[idForPage] = new PlaywrightAgent(page, {\r\n testId: `playwright-${testId}-${idForPage}`,\r\n forceSameTabNavigation,\r\n cache: cacheConfig,\r\n groupName: title,\r\n groupDescription: file,\r\n generateReport: false, // we will generate it in the reporter\r\n ...opts,\r\n });\r\n\r\n pageAgentMap[idForPage].onDumpUpdate = (dump: string) => {\r\n updateDumpAnnotation(testInfo, dump);\r\n };\r\n\r\n page.on('close', () => {\r\n debugPage('page closed');\r\n pageAgentMap[idForPage].destroy();\r\n delete pageAgentMap[idForPage];\r\n });\r\n }\r\n\r\n return pageAgentMap[idForPage];\r\n };\r\n\r\n async function generateAiFunction(options: {\r\n page: OriginPlaywrightPage;\r\n testInfo: TestInfo;\r\n use: any;\r\n aiActionType:\r\n | 'ai'\r\n | 'aiAction'\r\n | 'aiHover'\r\n | 'aiInput'\r\n | 'aiKeyboardPress'\r\n | 'aiScroll'\r\n | 'aiTap'\r\n | 'aiRightClick'\r\n | 'aiDoubleClick'\r\n | 'aiQuery'\r\n | 'aiAssert'\r\n | 'aiWaitFor'\r\n | 'aiLocate'\r\n | 'aiNumber'\r\n | 'aiString'\r\n | 'aiBoolean'\r\n | 'aiAsk'\r\n | 'runYaml'\r\n | 'setAIActionContext'\r\n | 'evaluateJavaScript'\r\n | 'logScreenshot'\r\n | 'freezePageContext'\r\n | 'unfreezePageContext';\r\n }) {\r\n const { page, testInfo, use, aiActionType } = options;\r\n const agent = createOrReuseAgentForPage(page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n }) as PlaywrightAgent;\r\n\r\n await use(async (taskPrompt: string, ...args: any[]) => {\r\n return new Promise((resolve, reject) => {\r\n test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async () => {\r\n try {\r\n debugPage(\r\n `waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`,\r\n );\r\n await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);\r\n } catch (error) {\r\n console.warn(\r\n '[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n try {\r\n type AgentMethod = (\r\n prompt: string,\r\n ...restArgs: any[]\r\n ) => Promise<any>;\r\n const result = await (agent[aiActionType] as AgentMethod)(\r\n taskPrompt,\r\n ...(args || []),\r\n );\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n const updateDumpAnnotation = (test: TestInfo, dump: string) => {\r\n // Write dump to temporary file\r\n const tempFileName = `midscene-dump-${test.testId || uuid()}-${Date.now()}.json`;\r\n const tempFilePath = join(tmpdir(), tempFileName);\r\n\r\n writeFileSync(tempFilePath, dump, 'utf-8');\r\n debugPage(`Dump written to temp file: ${tempFilePath}`);\r\n\r\n // Store only the file path in annotation\r\n const currentAnnotation = test.annotations.find((item) => {\r\n return item.type === midsceneDumpAnnotationId;\r\n });\r\n if (currentAnnotation) {\r\n // Store file path instead of dump content\r\n currentAnnotation.description = tempFilePath;\r\n } else {\r\n test.annotations.push({\r\n type: midsceneDumpAnnotationId,\r\n description: tempFilePath,\r\n });\r\n }\r\n };\r\n\r\n return {\r\n agentForPage: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await use(\r\n async (\r\n propsPage?: OriginPlaywrightPage | undefined,\r\n opts?: AgentOpt,\r\n ) => {\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n // Handle cache configuration priority:\r\n // 1. If user provides cache in opts, use it (but auto-generate ID if missing)\r\n // 2. Otherwise use fixture's cache config\r\n let finalCacheConfig = cacheConfig;\r\n if (opts?.cache !== undefined) {\r\n const userCache = opts.cache;\r\n if (userCache === false) {\r\n finalCacheConfig = false;\r\n } else if (userCache === true) {\r\n // Auto-generate ID for user's cache: true\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { id };\r\n } else if (typeof userCache === 'object') {\r\n if (!userCache.id) {\r\n // Auto-generate ID for user's cache object without ID\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { ...userCache, id };\r\n } else {\r\n finalCacheConfig = userCache;\r\n }\r\n }\r\n }\r\n\r\n const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n cache: finalCacheConfig,\r\n ...opts,\r\n });\r\n return agent;\r\n },\r\n );\r\n },\r\n ai: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'ai',\r\n });\r\n },\r\n aiAction: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAction',\r\n });\r\n },\r\n aiTap: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiTap',\r\n });\r\n },\r\n aiRightClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiRightClick',\r\n });\r\n },\r\n aiDoubleClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiDoubleClick',\r\n });\r\n },\r\n aiHover: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiHover',\r\n });\r\n },\r\n aiInput: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiInput',\r\n });\r\n },\r\n aiKeyboardPress: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiKeyboardPress',\r\n });\r\n },\r\n aiScroll: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiScroll',\r\n });\r\n },\r\n aiQuery: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiQuery',\r\n });\r\n },\r\n aiAssert: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAssert',\r\n });\r\n },\r\n aiWaitFor: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiWaitFor',\r\n });\r\n },\r\n aiLocate: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiLocate',\r\n });\r\n },\r\n aiNumber: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiNumber',\r\n });\r\n },\r\n aiString: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiString',\r\n });\r\n },\r\n aiBoolean: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiBoolean',\r\n });\r\n },\r\n aiAsk: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAsk',\r\n });\r\n },\r\n runYaml: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'runYaml',\r\n });\r\n },\r\n setAIActionContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'setAIActionContext',\r\n });\r\n },\r\n evaluateJavaScript: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'evaluateJavaScript',\r\n });\r\n },\r\n logScreenshot: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'logScreenshot',\r\n });\r\n },\r\n freezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'freezePageContext',\r\n });\r\n },\r\n unfreezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'unfreezePageContext',\r\n });\r\n },\r\n };\r\n};\r\n\r\nexport type PlayWrightAiFixtureType = {\r\n agentForPage: (\r\n page?: any,\r\n opts?: any,\r\n ) => Promise<PageAgent<PlaywrightWebPage>>;\r\n ai: <T = any>(prompt: string) => Promise<T>;\r\n aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;\r\n aiTap: (\r\n ...args: Parameters<PageAgent['aiTap']>\r\n ) => ReturnType<PageAgent['aiTap']>;\r\n aiRightClick: (\r\n ...args: Parameters<PageAgent['aiRightClick']>\r\n ) => ReturnType<PageAgent['aiRightClick']>;\r\n aiDoubleClick: (\r\n ...args: Parameters<PageAgent['aiDoubleClick']>\r\n ) => ReturnType<PageAgent['aiDoubleClick']>;\r\n aiHover: (\r\n ...args: Parameters<PageAgent['aiHover']>\r\n ) => ReturnType<PageAgent['aiHover']>;\r\n aiInput: (\r\n ...args: Parameters<PageAgent['aiInput']>\r\n ) => ReturnType<PageAgent['aiInput']>;\r\n aiKeyboardPress: (\r\n ...args: Parameters<PageAgent['aiKeyboardPress']>\r\n ) => ReturnType<PageAgent['aiKeyboardPress']>;\r\n aiScroll: (\r\n ...args: Parameters<PageAgent['aiScroll']>\r\n ) => ReturnType<PageAgent['aiScroll']>;\r\n aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;\r\n aiAssert: (\r\n ...args: Parameters<PageAgent['aiAssert']>\r\n ) => ReturnType<PageAgent['aiAssert']>;\r\n aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;\r\n aiLocate: (\r\n ...args: Parameters<PageAgent['aiLocate']>\r\n ) => ReturnType<PageAgent['aiLocate']>;\r\n aiNumber: (\r\n ...args: Parameters<PageAgent['aiNumber']>\r\n ) => ReturnType<PageAgent['aiNumber']>;\r\n aiString: (\r\n ...args: Parameters<PageAgent['aiString']>\r\n ) => ReturnType<PageAgent['aiString']>;\r\n aiBoolean: (\r\n ...args: Parameters<PageAgent['aiBoolean']>\r\n ) => ReturnType<PageAgent['aiBoolean']>;\r\n aiAsk: (\r\n ...args: Parameters<PageAgent['aiAsk']>\r\n ) => ReturnType<PageAgent['aiAsk']>;\r\n runYaml: (\r\n ...args: Parameters<PageAgent['runYaml']>\r\n ) => ReturnType<PageAgent['runYaml']>;\r\n setAIActionContext: (\r\n ...args: Parameters<PageAgent['setAIActionContext']>\r\n ) => ReturnType<PageAgent['setAIActionContext']>;\r\n evaluateJavaScript: (\r\n ...args: Parameters<PageAgent['evaluateJavaScript']>\r\n ) => ReturnType<PageAgent['evaluateJavaScript']>;\r\n logScreenshot: (\r\n ...args: Parameters<PageAgent['logScreenshot']>\r\n ) => ReturnType<PageAgent['logScreenshot']>;\r\n freezePageContext: (\r\n ...args: Parameters<PageAgent['freezePageContext']>\r\n ) => ReturnType<PageAgent['freezePageContext']>;\r\n unfreezePageContext: (\r\n ...args: Parameters<PageAgent['unfreezePageContext']>\r\n ) => ReturnType<PageAgent['unfreezePageContext']>;\r\n};\r\n"],"names":["debugPage","getDebug","groupAndCaseForTest","testInfo","taskFile","taskTitle","titlePath","taskTitleWithRetry","replaceIllegalPathCharsAndSpace","midsceneAgentKeyId","midsceneDumpAnnotationId","PlaywrightAiFixture","options","forceSameTabNavigation","waitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","waitForNavigationTimeout","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","cache","processTestCacheConfig","id","processCacheConfig","pageAgentMap","createOrReuseAgentForPage","page","opts","idForPage","uuid","testId","file","title","cacheConfig","PlaywrightAgent","dump","updateDumpAnnotation","generateAiFunction","use","aiActionType","agent","taskPrompt","args","Promise","resolve","reject","test","JSON","error","console","result","tempFileName","Date","tempFilePath","join","tmpdir","writeFileSync","currentAnnotation","item","propsPage","finalCacheConfig","undefined","userCache"],"mappings":"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BACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,OAAO,OACL,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,eAAe,OACb,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,mBAAmB,OACjB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,qBAAqB,OACnB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;IACF;AACF"}
|
|
@@ -51,7 +51,7 @@ class Page {
|
|
|
51
51
|
timeout: this.waitForNavigationTimeout
|
|
52
52
|
});
|
|
53
53
|
} catch (error) {
|
|
54
|
-
console.warn('[
|
|
54
|
+
console.warn('[sqai:warning] Waiting for the "navigation" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
55
55
|
}
|
|
56
56
|
debugPage('waitForNavigation end');
|
|
57
57
|
}
|
|
@@ -66,7 +66,7 @@ class Page {
|
|
|
66
66
|
timeout: this.waitForNetworkIdleTimeout
|
|
67
67
|
});
|
|
68
68
|
} catch (error) {
|
|
69
|
-
console.warn('[
|
|
69
|
+
console.warn('[sqai:warning] Waiting for the "network idle" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer\\base-page.mjs","sources":["webpack://@sqaitech/web/./src/puppeteer/base-page.ts"],"sourcesContent":["import { type WebPageAgentOpt, WebPageContextParser } from '@/web-element';\r\nimport type {\r\n DeviceAction,\r\n ElementCacheFeature,\r\n ElementTreeNode,\r\n Point,\r\n Rect,\r\n Size,\r\n UIContext,\r\n} from '@sqaitech/core';\r\nimport type { AbstractInterface } from '@sqaitech/core/device';\r\nimport { sleep } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport type { ElementInfo } from '@sqaitech/shared/extractor';\r\nimport { treeToList } from '@sqaitech/shared/extractor';\r\nimport { createImgBase64ByFormat } from '@sqaitech/shared/img';\r\nimport { type DebugFunction, getDebug } from '@sqaitech/shared/logger';\r\nimport {\r\n getElementInfosScriptContent,\r\n getExtraReturnLogic,\r\n} from '@sqaitech/shared/node';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { Page as PlaywrightPage } from 'playwright';\r\nimport type { Page as PuppeteerPage } from 'puppeteer';\r\nimport {\r\n type KeyInput,\r\n type MouseButton,\r\n commonWebActionsForWebPage,\r\n} from '../web-page';\r\n\r\nexport const debugPage = getDebug('web:page');\r\n\r\ntype WebElementCacheFeature = ElementCacheFeature & {\r\n xpaths?: string[];\r\n};\r\n\r\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\r\n if (!Array.isArray(xpaths)) {\r\n return [];\r\n }\r\n\r\n return xpaths.filter(\r\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\r\n );\r\n};\r\n\r\nexport class Page<\r\n AgentType extends 'puppeteer' | 'playwright',\r\n InterfaceType extends PuppeteerPage | PlaywrightPage,\r\n> implements AbstractInterface\r\n{\r\n underlyingPage: InterfaceType;\r\n protected waitForNavigationTimeout: number;\r\n protected waitForNetworkIdleTimeout: number;\r\n private viewportSize?: Size;\r\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\r\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\r\n private customActions?: DeviceAction<any>[];\r\n\r\n interfaceType: AgentType;\r\n\r\n actionSpace(): DeviceAction[] {\r\n const defaultActions = commonWebActionsForWebPage(this);\r\n const customActions = this.customActions || [];\r\n return [...defaultActions, ...customActions];\r\n }\r\n\r\n private async evaluate<R>(\r\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\r\n arg?: any,\r\n ): Promise<R> {\r\n let result: R;\r\n debugPage('evaluate function begin');\r\n if (this.interfaceType === 'puppeteer') {\r\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n } else {\r\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n }\r\n debugPage('evaluate function end');\r\n return result;\r\n }\r\n\r\n constructor(\r\n underlyingPage: InterfaceType,\r\n interfaceType: AgentType,\r\n opts?: WebPageAgentOpt,\r\n ) {\r\n this.underlyingPage = underlyingPage;\r\n this.interfaceType = interfaceType;\r\n this.waitForNavigationTimeout =\r\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\r\n this.waitForNetworkIdleTimeout =\r\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\r\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\r\n this.onAfterInvokeAction = opts?.afterInvokeAction;\r\n this.customActions = opts?.customActions;\r\n }\r\n\r\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\r\n return this.evaluate(script);\r\n }\r\n\r\n async waitForNavigation() {\r\n if (this.waitForNavigationTimeout === 0) {\r\n debugPage('waitForNavigation timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\r\n if (\r\n this.interfaceType === 'puppeteer' ||\r\n this.interfaceType === 'playwright'\r\n ) {\r\n debugPage('waitForNavigation begin');\r\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\r\n timeout: this.waitForNavigationTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n debugPage('waitForNavigation end');\r\n }\r\n }\r\n\r\n async waitForNetworkIdle(): Promise<void> {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (this.waitForNetworkIdleTimeout === 0) {\r\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\r\n idleTime: 200,\r\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n timeout: this.waitForNetworkIdleTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n } else {\r\n // TODO: implement playwright waitForNetworkIdle\r\n }\r\n }\r\n\r\n // @deprecated\r\n async getElementsInfo() {\r\n // const scripts = await getExtraReturnLogic();\r\n // const captureElementSnapshot = await this.evaluate(scripts);\r\n // return captureElementSnapshot as ElementInfo[];\r\n await this.waitForNavigation();\r\n debugPage('getElementsInfo begin');\r\n const tree = await this.getElementsNodeTree();\r\n debugPage('getElementsInfo end');\r\n return treeToList(tree);\r\n }\r\n\r\n async getXpathsById(id: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\r\n );\r\n }\r\n\r\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\r\n );\r\n }\r\n\r\n async getElementInfoByXpath(xpath: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\r\n );\r\n }\r\n\r\n async cacheFeatureForRect(\r\n rect: Rect,\r\n opt?: { _orderSensitive: boolean },\r\n ): Promise<ElementCacheFeature> {\r\n const center: Point = {\r\n left: Math.floor(rect.left + rect.width / 2),\r\n top: Math.floor(rect.top + rect.height / 2),\r\n };\r\n\r\n try {\r\n const orderSensitive = opt?._orderSensitive ?? false;\r\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\r\n const sanitized = sanitizeXpaths(xpaths);\r\n if (!sanitized.length) {\r\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\r\n }\r\n return {\r\n xpaths: sanitized,\r\n };\r\n } catch (error) {\r\n debugPage('cacheFeatureForRect failed: %s', error);\r\n return {\r\n xpaths: [],\r\n };\r\n }\r\n }\r\n\r\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\r\n const webFeature = feature as WebElementCacheFeature;\r\n const xpaths = sanitizeXpaths(webFeature.xpaths);\r\n\r\n for (const xpath of xpaths) {\r\n try {\r\n const elementInfo = await this.getElementInfoByXpath(xpath);\r\n if (elementInfo?.rect) {\r\n const matchedRect: Rect = {\r\n left: elementInfo.rect.left,\r\n top: elementInfo.rect.top,\r\n width: elementInfo.rect.width,\r\n height: elementInfo.rect.height,\r\n };\r\n\r\n if (this.viewportSize?.dpr) {\r\n matchedRect.dpr = this.viewportSize.dpr;\r\n }\r\n\r\n return matchedRect;\r\n }\r\n } catch (error) {\r\n debugPage(\r\n 'rectMatchesCacheFeature failed for xpath %s: %s',\r\n xpath,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n throw new Error(\r\n 'No matching element rect found for the provided cache feature',\r\n );\r\n }\r\n\r\n async getElementsNodeTree() {\r\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\r\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\r\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\r\n await this.waitForNavigation();\r\n const scripts = await getExtraReturnLogic(true);\r\n assert(scripts, 'scripts should be set before writing report in browser');\r\n const startTime = Date.now();\r\n const captureElementSnapshot = await this.evaluate(scripts);\r\n const endTime = Date.now();\r\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\r\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\r\n }\r\n\r\n async size(): Promise<Size> {\r\n if (this.viewportSize) return this.viewportSize;\r\n const sizeInfo: Size = await this.evaluate(() => {\r\n return {\r\n width: document.documentElement.clientWidth,\r\n height: document.documentElement.clientHeight,\r\n dpr: window.devicePixelRatio,\r\n };\r\n });\r\n this.viewportSize = sizeInfo;\r\n return sizeInfo;\r\n }\r\n\r\n async screenshotBase64(): Promise<string> {\r\n const imgType = 'jpeg';\r\n const quality = 90;\r\n await this.waitForNavigation();\r\n const startTime = Date.now();\r\n debugPage('screenshotBase64 begin');\r\n\r\n let base64: string;\r\n if (this.interfaceType === 'puppeteer') {\r\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\r\n type: imgType,\r\n quality,\r\n encoding: 'base64',\r\n });\r\n base64 = createImgBase64ByFormat(imgType, result);\r\n } else if (this.interfaceType === 'playwright') {\r\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\r\n type: imgType,\r\n quality,\r\n timeout: 10 * 1000,\r\n });\r\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\r\n } else {\r\n throw new Error('Unsupported page type for screenshot');\r\n }\r\n const endTime = Date.now();\r\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\r\n return base64;\r\n }\r\n\r\n async url(): Promise<string> {\r\n return this.underlyingPage.url();\r\n }\r\n\r\n describe(): string {\r\n const url = this.underlyingPage.url();\r\n return url || '';\r\n }\r\n\r\n get mouse() {\r\n return {\r\n click: async (\r\n x: number,\r\n y: number,\r\n options?: { button?: MouseButton; count?: number },\r\n ) => {\r\n await this.mouse.move(x, y);\r\n const { button = 'left', count = 1 } = options || {};\r\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\r\n\r\n if (count === 2 && this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\r\n button,\r\n });\r\n } else {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (button === 'left' && count === 1) {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\r\n } else {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\r\n button,\r\n count,\r\n });\r\n }\r\n } else if (this.interfaceType === 'playwright') {\r\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\r\n button,\r\n clickCount: count,\r\n });\r\n }\r\n }\r\n },\r\n wheel: async (deltaX: number, deltaY: number) => {\r\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\r\n deltaX,\r\n deltaY,\r\n });\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\r\n deltaX,\r\n deltaY,\r\n );\r\n }\r\n },\r\n move: async (x: number, y: number) => {\r\n this.everMoved = true;\r\n debugPage(`mouse move to ${x}, ${y}`);\r\n return this.underlyingPage.mouse.move(x, y);\r\n },\r\n drag: async (\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n ) => {\r\n debugPage(\r\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(\r\n from.x,\r\n from.y,\r\n );\r\n await sleep(200);\r\n await (this.underlyingPage as PlaywrightPage).mouse.down();\r\n await sleep(300);\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\r\n await sleep(500);\r\n await (this.underlyingPage as PlaywrightPage).mouse.up();\r\n await sleep(200);\r\n debugPage(\r\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n },\r\n };\r\n }\r\n\r\n get keyboard() {\r\n return {\r\n type: async (text: string) => {\r\n debugPage(`keyboard type ${text}`);\r\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\r\n },\r\n press: async (\r\n action:\r\n | { key: KeyInput; command?: string }\r\n | { key: KeyInput; command?: string }[],\r\n ) => {\r\n const keys = Array.isArray(action) ? action : [action];\r\n debugPage('keyboard press', keys);\r\n for (const k of keys) {\r\n const commands = k.command ? [k.command] : [];\r\n await this.underlyingPage.keyboard.down(k.key, { commands });\r\n }\r\n for (const k of [...keys].reverse()) {\r\n await this.underlyingPage.keyboard.up(k.key);\r\n }\r\n },\r\n down: async (key: KeyInput) => {\r\n debugPage(`keyboard down ${key}`);\r\n return this.underlyingPage.keyboard.down(key);\r\n },\r\n up: async (key: KeyInput) => {\r\n debugPage(`keyboard up ${key}`);\r\n return this.underlyingPage.keyboard.up(key);\r\n },\r\n };\r\n }\r\n\r\n async clearInput(element: ElementInfo): Promise<void> {\r\n if (!element) {\r\n console.warn('No element to clear input');\r\n return;\r\n }\r\n\r\n const backspace = async () => {\r\n await sleep(100);\r\n await this.keyboard.press([{ key: 'Backspace' }]);\r\n };\r\n\r\n const isMac = process.platform === 'darwin';\r\n debugPage('clearInput begin');\r\n if (isMac) {\r\n if (this.interfaceType === 'puppeteer') {\r\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\r\n await this.mouse.click(element.center[0], element.center[1], {\r\n count: 3,\r\n });\r\n await backspace();\r\n }\r\n\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Meta');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Meta');\r\n await backspace();\r\n } else {\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Control');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Control');\r\n await backspace();\r\n }\r\n debugPage('clearInput end');\r\n }\r\n\r\n private everMoved = false;\r\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\r\n if (point) {\r\n await this.mouse.move(point.left, point.top);\r\n } else if (!this.everMoved) {\r\n // If the mouse has never moved, move it to the center of the page\r\n const size = await this.size();\r\n const targetX = Math.floor(size.width / 2);\r\n const targetY = Math.floor(size.height / 2);\r\n await this.mouse.move(targetX, targetY);\r\n }\r\n }\r\n\r\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -9999999);\r\n }\r\n\r\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, 9999999);\r\n }\r\n\r\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-9999999, 0);\r\n }\r\n\r\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(9999999, 0);\r\n }\r\n\r\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -scrollDistance);\r\n }\r\n\r\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, scrollDistance);\r\n }\r\n\r\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-scrollDistance, 0);\r\n }\r\n\r\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(scrollDistance, 0);\r\n }\r\n\r\n async navigate(url: string): Promise<void> {\r\n debugPage(`navigate to ${url}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).goto(url);\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).goto(url);\r\n } else {\r\n throw new Error('Unsupported page type for navigate');\r\n }\r\n }\r\n\r\n async beforeInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onBeforeInvokeAction) {\r\n await this.onBeforeInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async afterInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onAfterInvokeAction) {\r\n await this.onAfterInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async destroy(): Promise<void> {}\r\n\r\n async getContext(): Promise<UIContext> {\r\n return await WebPageContextParser(this, {});\r\n }\r\n async swipe(\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n duration?: number,\r\n ) {\r\n const LONG_PRESS_THRESHOLD = 500;\r\n const MIN_PRESS_THRESHOLD = 150;\r\n duration = duration || 100;\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n debugPage(\r\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\r\n );\r\n\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down({ button: 'left' });\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down();\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await page.waitForTimeout(delay);\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n async longPress(x: number, y: number, duration?: number) {\r\n duration = duration || 500;\r\n const LONG_PRESS_THRESHOLD = 600;\r\n const MIN_PRESS_THRESHOLD = 300;\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await page.waitForTimeout(duration);\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n}\r\n\r\nexport function forceClosePopup(\r\n page: PuppeteerPage | PlaywrightPage,\r\n debugProfile: DebugFunction,\r\n) {\r\n page.on('popup', async (popup) => {\r\n if (!popup) {\r\n console.warn('got a popup event, but the popup is not ready yet, skip');\r\n return;\r\n }\r\n const url = await (popup as PuppeteerPage).url();\r\n console.log(`Popup opened: ${url}`);\r\n if (!(popup as PuppeteerPage).isClosed()) {\r\n try {\r\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\r\n } catch (error) {\r\n debugProfile(`failed to close popup ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`popup is already closed, skip close ${url}`);\r\n }\r\n\r\n if (!page.isClosed()) {\r\n try {\r\n await page.goto(url);\r\n } catch (error) {\r\n debugProfile(`failed to goto ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`page is already closed, skip goto ${url}`);\r\n }\r\n });\r\n}\r\n"],"names":["debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","id","elementInfosScriptContent","getElementInfosScriptContent","JSON","point","isOrderSensitive","rect","opt","center","Math","orderSensitive","sanitized","feature","webFeature","elementInfo","_this_viewportSize","matchedRect","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","options","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","key","element","backspace","isMac","process","size","targetX","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","page","steps","delay","i","resolve","setTimeout","res","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"puppeteer\\base-page.mjs","sources":["webpack://@sqaitech/web/./src/puppeteer/base-page.ts"],"sourcesContent":["import { type WebPageAgentOpt, WebPageContextParser } from '@/web-element';\r\nimport type {\r\n DeviceAction,\r\n ElementCacheFeature,\r\n ElementTreeNode,\r\n Point,\r\n Rect,\r\n Size,\r\n UIContext,\r\n} from '@sqaitech/core';\r\nimport type { AbstractInterface } from '@sqaitech/core/device';\r\nimport { sleep } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport type { ElementInfo } from '@sqaitech/shared/extractor';\r\nimport { treeToList } from '@sqaitech/shared/extractor';\r\nimport { createImgBase64ByFormat } from '@sqaitech/shared/img';\r\nimport { type DebugFunction, getDebug } from '@sqaitech/shared/logger';\r\nimport {\r\n getElementInfosScriptContent,\r\n getExtraReturnLogic,\r\n} from '@sqaitech/shared/node';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { Page as PlaywrightPage } from 'playwright';\r\nimport type { Page as PuppeteerPage } from 'puppeteer';\r\nimport {\r\n type KeyInput,\r\n type MouseButton,\r\n commonWebActionsForWebPage,\r\n} from '../web-page';\r\n\r\nexport const debugPage = getDebug('web:page');\r\n\r\ntype WebElementCacheFeature = ElementCacheFeature & {\r\n xpaths?: string[];\r\n};\r\n\r\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\r\n if (!Array.isArray(xpaths)) {\r\n return [];\r\n }\r\n\r\n return xpaths.filter(\r\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\r\n );\r\n};\r\n\r\nexport class Page<\r\n AgentType extends 'puppeteer' | 'playwright',\r\n InterfaceType extends PuppeteerPage | PlaywrightPage,\r\n> implements AbstractInterface\r\n{\r\n underlyingPage: InterfaceType;\r\n protected waitForNavigationTimeout: number;\r\n protected waitForNetworkIdleTimeout: number;\r\n private viewportSize?: Size;\r\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\r\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\r\n private customActions?: DeviceAction<any>[];\r\n\r\n interfaceType: AgentType;\r\n\r\n actionSpace(): DeviceAction[] {\r\n const defaultActions = commonWebActionsForWebPage(this);\r\n const customActions = this.customActions || [];\r\n return [...defaultActions, ...customActions];\r\n }\r\n\r\n private async evaluate<R>(\r\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\r\n arg?: any,\r\n ): Promise<R> {\r\n let result: R;\r\n debugPage('evaluate function begin');\r\n if (this.interfaceType === 'puppeteer') {\r\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n } else {\r\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n }\r\n debugPage('evaluate function end');\r\n return result;\r\n }\r\n\r\n constructor(\r\n underlyingPage: InterfaceType,\r\n interfaceType: AgentType,\r\n opts?: WebPageAgentOpt,\r\n ) {\r\n this.underlyingPage = underlyingPage;\r\n this.interfaceType = interfaceType;\r\n this.waitForNavigationTimeout =\r\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\r\n this.waitForNetworkIdleTimeout =\r\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\r\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\r\n this.onAfterInvokeAction = opts?.afterInvokeAction;\r\n this.customActions = opts?.customActions;\r\n }\r\n\r\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\r\n return this.evaluate(script);\r\n }\r\n\r\n async waitForNavigation() {\r\n if (this.waitForNavigationTimeout === 0) {\r\n debugPage('waitForNavigation timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\r\n if (\r\n this.interfaceType === 'puppeteer' ||\r\n this.interfaceType === 'playwright'\r\n ) {\r\n debugPage('waitForNavigation begin');\r\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\r\n timeout: this.waitForNavigationTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[sqai:warning] Waiting for the \"navigation\" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n debugPage('waitForNavigation end');\r\n }\r\n }\r\n\r\n async waitForNetworkIdle(): Promise<void> {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (this.waitForNetworkIdleTimeout === 0) {\r\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\r\n idleTime: 200,\r\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n timeout: this.waitForNetworkIdleTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[sqai:warning] Waiting for the \"network idle\" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n } else {\r\n // TODO: implement playwright waitForNetworkIdle\r\n }\r\n }\r\n\r\n // @deprecated\r\n async getElementsInfo() {\r\n // const scripts = await getExtraReturnLogic();\r\n // const captureElementSnapshot = await this.evaluate(scripts);\r\n // return captureElementSnapshot as ElementInfo[];\r\n await this.waitForNavigation();\r\n debugPage('getElementsInfo begin');\r\n const tree = await this.getElementsNodeTree();\r\n debugPage('getElementsInfo end');\r\n return treeToList(tree);\r\n }\r\n\r\n async getXpathsById(id: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\r\n );\r\n }\r\n\r\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\r\n );\r\n }\r\n\r\n async getElementInfoByXpath(xpath: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\r\n );\r\n }\r\n\r\n async cacheFeatureForRect(\r\n rect: Rect,\r\n opt?: { _orderSensitive: boolean },\r\n ): Promise<ElementCacheFeature> {\r\n const center: Point = {\r\n left: Math.floor(rect.left + rect.width / 2),\r\n top: Math.floor(rect.top + rect.height / 2),\r\n };\r\n\r\n try {\r\n const orderSensitive = opt?._orderSensitive ?? false;\r\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\r\n const sanitized = sanitizeXpaths(xpaths);\r\n if (!sanitized.length) {\r\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\r\n }\r\n return {\r\n xpaths: sanitized,\r\n };\r\n } catch (error) {\r\n debugPage('cacheFeatureForRect failed: %s', error);\r\n return {\r\n xpaths: [],\r\n };\r\n }\r\n }\r\n\r\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\r\n const webFeature = feature as WebElementCacheFeature;\r\n const xpaths = sanitizeXpaths(webFeature.xpaths);\r\n\r\n for (const xpath of xpaths) {\r\n try {\r\n const elementInfo = await this.getElementInfoByXpath(xpath);\r\n if (elementInfo?.rect) {\r\n const matchedRect: Rect = {\r\n left: elementInfo.rect.left,\r\n top: elementInfo.rect.top,\r\n width: elementInfo.rect.width,\r\n height: elementInfo.rect.height,\r\n };\r\n\r\n if (this.viewportSize?.dpr) {\r\n matchedRect.dpr = this.viewportSize.dpr;\r\n }\r\n\r\n return matchedRect;\r\n }\r\n } catch (error) {\r\n debugPage(\r\n 'rectMatchesCacheFeature failed for xpath %s: %s',\r\n xpath,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n throw new Error(\r\n 'No matching element rect found for the provided cache feature',\r\n );\r\n }\r\n\r\n async getElementsNodeTree() {\r\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\r\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\r\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\r\n await this.waitForNavigation();\r\n const scripts = await getExtraReturnLogic(true);\r\n assert(scripts, 'scripts should be set before writing report in browser');\r\n const startTime = Date.now();\r\n const captureElementSnapshot = await this.evaluate(scripts);\r\n const endTime = Date.now();\r\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\r\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\r\n }\r\n\r\n async size(): Promise<Size> {\r\n if (this.viewportSize) return this.viewportSize;\r\n const sizeInfo: Size = await this.evaluate(() => {\r\n return {\r\n width: document.documentElement.clientWidth,\r\n height: document.documentElement.clientHeight,\r\n dpr: window.devicePixelRatio,\r\n };\r\n });\r\n this.viewportSize = sizeInfo;\r\n return sizeInfo;\r\n }\r\n\r\n async screenshotBase64(): Promise<string> {\r\n const imgType = 'jpeg';\r\n const quality = 90;\r\n await this.waitForNavigation();\r\n const startTime = Date.now();\r\n debugPage('screenshotBase64 begin');\r\n\r\n let base64: string;\r\n if (this.interfaceType === 'puppeteer') {\r\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\r\n type: imgType,\r\n quality,\r\n encoding: 'base64',\r\n });\r\n base64 = createImgBase64ByFormat(imgType, result);\r\n } else if (this.interfaceType === 'playwright') {\r\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\r\n type: imgType,\r\n quality,\r\n timeout: 10 * 1000,\r\n });\r\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\r\n } else {\r\n throw new Error('Unsupported page type for screenshot');\r\n }\r\n const endTime = Date.now();\r\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\r\n return base64;\r\n }\r\n\r\n async url(): Promise<string> {\r\n return this.underlyingPage.url();\r\n }\r\n\r\n describe(): string {\r\n const url = this.underlyingPage.url();\r\n return url || '';\r\n }\r\n\r\n get mouse() {\r\n return {\r\n click: async (\r\n x: number,\r\n y: number,\r\n options?: { button?: MouseButton; count?: number },\r\n ) => {\r\n await this.mouse.move(x, y);\r\n const { button = 'left', count = 1 } = options || {};\r\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\r\n\r\n if (count === 2 && this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\r\n button,\r\n });\r\n } else {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (button === 'left' && count === 1) {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\r\n } else {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\r\n button,\r\n count,\r\n });\r\n }\r\n } else if (this.interfaceType === 'playwright') {\r\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\r\n button,\r\n clickCount: count,\r\n });\r\n }\r\n }\r\n },\r\n wheel: async (deltaX: number, deltaY: number) => {\r\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\r\n deltaX,\r\n deltaY,\r\n });\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\r\n deltaX,\r\n deltaY,\r\n );\r\n }\r\n },\r\n move: async (x: number, y: number) => {\r\n this.everMoved = true;\r\n debugPage(`mouse move to ${x}, ${y}`);\r\n return this.underlyingPage.mouse.move(x, y);\r\n },\r\n drag: async (\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n ) => {\r\n debugPage(\r\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(\r\n from.x,\r\n from.y,\r\n );\r\n await sleep(200);\r\n await (this.underlyingPage as PlaywrightPage).mouse.down();\r\n await sleep(300);\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\r\n await sleep(500);\r\n await (this.underlyingPage as PlaywrightPage).mouse.up();\r\n await sleep(200);\r\n debugPage(\r\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n },\r\n };\r\n }\r\n\r\n get keyboard() {\r\n return {\r\n type: async (text: string) => {\r\n debugPage(`keyboard type ${text}`);\r\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\r\n },\r\n press: async (\r\n action:\r\n | { key: KeyInput; command?: string }\r\n | { key: KeyInput; command?: string }[],\r\n ) => {\r\n const keys = Array.isArray(action) ? action : [action];\r\n debugPage('keyboard press', keys);\r\n for (const k of keys) {\r\n const commands = k.command ? [k.command] : [];\r\n await this.underlyingPage.keyboard.down(k.key, { commands });\r\n }\r\n for (const k of [...keys].reverse()) {\r\n await this.underlyingPage.keyboard.up(k.key);\r\n }\r\n },\r\n down: async (key: KeyInput) => {\r\n debugPage(`keyboard down ${key}`);\r\n return this.underlyingPage.keyboard.down(key);\r\n },\r\n up: async (key: KeyInput) => {\r\n debugPage(`keyboard up ${key}`);\r\n return this.underlyingPage.keyboard.up(key);\r\n },\r\n };\r\n }\r\n\r\n async clearInput(element: ElementInfo): Promise<void> {\r\n if (!element) {\r\n console.warn('No element to clear input');\r\n return;\r\n }\r\n\r\n const backspace = async () => {\r\n await sleep(100);\r\n await this.keyboard.press([{ key: 'Backspace' }]);\r\n };\r\n\r\n const isMac = process.platform === 'darwin';\r\n debugPage('clearInput begin');\r\n if (isMac) {\r\n if (this.interfaceType === 'puppeteer') {\r\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\r\n await this.mouse.click(element.center[0], element.center[1], {\r\n count: 3,\r\n });\r\n await backspace();\r\n }\r\n\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Meta');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Meta');\r\n await backspace();\r\n } else {\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Control');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Control');\r\n await backspace();\r\n }\r\n debugPage('clearInput end');\r\n }\r\n\r\n private everMoved = false;\r\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\r\n if (point) {\r\n await this.mouse.move(point.left, point.top);\r\n } else if (!this.everMoved) {\r\n // If the mouse has never moved, move it to the center of the page\r\n const size = await this.size();\r\n const targetX = Math.floor(size.width / 2);\r\n const targetY = Math.floor(size.height / 2);\r\n await this.mouse.move(targetX, targetY);\r\n }\r\n }\r\n\r\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -9999999);\r\n }\r\n\r\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, 9999999);\r\n }\r\n\r\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-9999999, 0);\r\n }\r\n\r\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(9999999, 0);\r\n }\r\n\r\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -scrollDistance);\r\n }\r\n\r\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, scrollDistance);\r\n }\r\n\r\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-scrollDistance, 0);\r\n }\r\n\r\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(scrollDistance, 0);\r\n }\r\n\r\n async navigate(url: string): Promise<void> {\r\n debugPage(`navigate to ${url}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).goto(url);\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).goto(url);\r\n } else {\r\n throw new Error('Unsupported page type for navigate');\r\n }\r\n }\r\n\r\n async beforeInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onBeforeInvokeAction) {\r\n await this.onBeforeInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async afterInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onAfterInvokeAction) {\r\n await this.onAfterInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async destroy(): Promise<void> {}\r\n\r\n async getContext(): Promise<UIContext> {\r\n return await WebPageContextParser(this, {});\r\n }\r\n async swipe(\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n duration?: number,\r\n ) {\r\n const LONG_PRESS_THRESHOLD = 500;\r\n const MIN_PRESS_THRESHOLD = 150;\r\n duration = duration || 100;\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n debugPage(\r\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\r\n );\r\n\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down({ button: 'left' });\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down();\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await page.waitForTimeout(delay);\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n async longPress(x: number, y: number, duration?: number) {\r\n duration = duration || 500;\r\n const LONG_PRESS_THRESHOLD = 600;\r\n const MIN_PRESS_THRESHOLD = 300;\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await page.waitForTimeout(duration);\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n}\r\n\r\nexport function forceClosePopup(\r\n page: PuppeteerPage | PlaywrightPage,\r\n debugProfile: DebugFunction,\r\n) {\r\n page.on('popup', async (popup) => {\r\n if (!popup) {\r\n console.warn('got a popup event, but the popup is not ready yet, skip');\r\n return;\r\n }\r\n const url = await (popup as PuppeteerPage).url();\r\n console.log(`Popup opened: ${url}`);\r\n if (!(popup as PuppeteerPage).isClosed()) {\r\n try {\r\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\r\n } catch (error) {\r\n debugProfile(`failed to close popup ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`popup is already closed, skip close ${url}`);\r\n }\r\n\r\n if (!page.isClosed()) {\r\n try {\r\n await page.goto(url);\r\n } catch (error) {\r\n debugProfile(`failed to goto ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`page is already closed, skip goto ${url}`);\r\n }\r\n });\r\n}\r\n"],"names":["debugPage","getDebug","sanitizeXpaths","xpaths","Array","xpath","Page","defaultActions","commonWebActionsForWebPage","customActions","pageFunction","arg","result","script","error","console","DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY","tree","treeToList","id","elementInfosScriptContent","getElementInfosScriptContent","JSON","point","isOrderSensitive","rect","opt","center","Math","orderSensitive","sanitized","feature","webFeature","elementInfo","_this_viewportSize","matchedRect","Error","scripts","getExtraReturnLogic","assert","startTime","Date","captureElementSnapshot","endTime","sizeInfo","document","window","imgType","quality","base64","createImgBase64ByFormat","buffer","url","x","y","options","button","count","deltaX","deltaY","from","to","sleep","text","action","keys","k","commands","key","element","backspace","isMac","process","size","targetX","targetY","startingPoint","distance","innerHeight","scrollDistance","innerWidth","name","param","Promise","WebPageContextParser","duration","LONG_PRESS_THRESHOLD","MIN_PRESS_THRESHOLD","page","steps","delay","i","resolve","setTimeout","res","underlyingPage","interfaceType","opts","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","forceClosePopup","debugProfile","popup"],"mappings":"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"}
|
|
@@ -100,7 +100,7 @@ class BridgeServer {
|
|
|
100
100
|
(0, shared_utils_namespaceObject.logMsg)('one client connected');
|
|
101
101
|
this.socket = socket;
|
|
102
102
|
const clientVersion = socket.handshake.query.version;
|
|
103
|
-
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v0.30.
|
|
103
|
+
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v0.30.16, browser-side version v${clientVersion}`);
|
|
104
104
|
socket.on(external_common_js_namespaceObject.BridgeEvent.CallResponse, (params)=>{
|
|
105
105
|
const id = params.id;
|
|
106
106
|
const response = params.response;
|
|
@@ -128,7 +128,7 @@ class BridgeServer {
|
|
|
128
128
|
var _this_onConnect, _this;
|
|
129
129
|
null == (_this_onConnect = (_this = this).onConnect) || _this_onConnect.call(_this);
|
|
130
130
|
const payload = {
|
|
131
|
-
version: "0.30.
|
|
131
|
+
version: "0.30.16"
|
|
132
132
|
};
|
|
133
133
|
socket.emit(external_common_js_namespaceObject.BridgeEvent.Connected, payload);
|
|
134
134
|
Promise.resolve().then(()=>{
|
|
@@ -83,7 +83,7 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
|
|
|
83
83
|
}
|
|
84
84
|
}, ()=>this.destroy());
|
|
85
85
|
await this.bridgeClient.connect();
|
|
86
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.30.
|
|
86
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.30.16`, 'log');
|
|
87
87
|
}
|
|
88
88
|
async connect() {
|
|
89
89
|
return await this.setupBridgeClient();
|
|
@@ -109,7 +109,7 @@ const PlaywrightAiFixture = (options)=>{
|
|
|
109
109
|
debugPage(`waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`);
|
|
110
110
|
await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);
|
|
111
111
|
} catch (error) {
|
|
112
|
-
console.warn('[
|
|
112
|
+
console.warn('[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
113
113
|
}
|
|
114
114
|
try {
|
|
115
115
|
const result = await agent[aiActionType](taskPrompt, ...args || []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright\\ai-fixture.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/playwright/ai-fixture.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { writeFileSync } from 'node:fs';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { PlaywrightAgent, type PlaywrightWebPage } from '@/playwright/index';\r\nimport type { WebPageAgentOpt } from '@/web-element';\r\nimport type { Cache } from '@sqaitech/core';\r\nimport type { AgentOpt, Agent as PageAgent } from '@sqaitech/core/agent';\r\nimport { processCacheConfig } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { replaceIllegalPathCharsAndSpace } from '@sqaitech/shared/utils';\r\nimport { type TestInfo, type TestType, test } from '@playwright/test';\r\nimport type { Page as OriginPlaywrightPage } from 'playwright';\r\nexport type APITestType = Pick<TestType<any, any>, 'step'>;\r\n\r\nconst debugPage = getDebug('web:playwright:ai-fixture');\r\n\r\nconst groupAndCaseForTest = (testInfo: TestInfo) => {\r\n let taskFile: string;\r\n let taskTitle: string;\r\n const titlePath = [...testInfo.titlePath];\r\n\r\n if (titlePath.length > 1) {\r\n taskFile = titlePath.shift() || 'unnamed';\r\n taskTitle = titlePath.join('__');\r\n } else if (titlePath.length === 1) {\r\n taskTitle = titlePath[0];\r\n taskFile = `${taskTitle}`;\r\n } else {\r\n taskTitle = 'unnamed';\r\n taskFile = 'unnamed';\r\n }\r\n\r\n const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;\r\n\r\n return {\r\n file: taskFile,\r\n id: replaceIllegalPathCharsAndSpace(`${taskFile}(${taskTitle})`),\r\n title: replaceIllegalPathCharsAndSpace(taskTitleWithRetry),\r\n };\r\n};\r\n\r\nconst midsceneAgentKeyId = '_midsceneAgentId';\r\nexport const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';\r\n\r\ntype PlaywrightCacheConfig = {\r\n strategy?: 'read-only' | 'read-write' | 'write-only';\r\n id?: string;\r\n};\r\ntype PlaywrightCache = false | true | PlaywrightCacheConfig;\r\n\r\nexport const PlaywrightAiFixture = (options?: {\r\n forceSameTabNavigation?: boolean;\r\n waitForNetworkIdleTimeout?: number;\r\n waitForNavigationTimeout?: number;\r\n cache?: PlaywrightCache;\r\n}) => {\r\n const {\r\n forceSameTabNavigation = true,\r\n waitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n waitForNavigationTimeout = DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n cache,\r\n } = options ?? {};\r\n\r\n // Helper function to process cache configuration and auto-generate ID from test info\r\n const processTestCacheConfig = (testInfo: TestInfo): Cache | undefined => {\r\n // Generate ID from test info\r\n const { id } = groupAndCaseForTest(testInfo);\r\n\r\n // Use shared processCacheConfig with generated ID as fallback\r\n return processCacheConfig(cache as Cache, id);\r\n };\r\n\r\n const pageAgentMap: Record<string, PageAgent<PlaywrightWebPage>> = {};\r\n const createOrReuseAgentForPage = (\r\n page: OriginPlaywrightPage,\r\n testInfo: TestInfo, // { testId: string; taskFile: string; taskTitle: string },\r\n opts?: WebPageAgentOpt,\r\n ) => {\r\n let idForPage = (page as any)[midsceneAgentKeyId];\r\n if (!idForPage) {\r\n idForPage = uuid();\r\n (page as any)[midsceneAgentKeyId] = idForPage;\r\n const { testId } = testInfo;\r\n const { file, title } = groupAndCaseForTest(testInfo);\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n pageAgentMap[idForPage] = new PlaywrightAgent(page, {\r\n testId: `playwright-${testId}-${idForPage}`,\r\n forceSameTabNavigation,\r\n cache: cacheConfig,\r\n groupName: title,\r\n groupDescription: file,\r\n generateReport: false, // we will generate it in the reporter\r\n ...opts,\r\n });\r\n\r\n pageAgentMap[idForPage].onDumpUpdate = (dump: string) => {\r\n updateDumpAnnotation(testInfo, dump);\r\n };\r\n\r\n page.on('close', () => {\r\n debugPage('page closed');\r\n pageAgentMap[idForPage].destroy();\r\n delete pageAgentMap[idForPage];\r\n });\r\n }\r\n\r\n return pageAgentMap[idForPage];\r\n };\r\n\r\n async function generateAiFunction(options: {\r\n page: OriginPlaywrightPage;\r\n testInfo: TestInfo;\r\n use: any;\r\n aiActionType:\r\n | 'ai'\r\n | 'aiAction'\r\n | 'aiHover'\r\n | 'aiInput'\r\n | 'aiKeyboardPress'\r\n | 'aiScroll'\r\n | 'aiTap'\r\n | 'aiRightClick'\r\n | 'aiDoubleClick'\r\n | 'aiQuery'\r\n | 'aiAssert'\r\n | 'aiWaitFor'\r\n | 'aiLocate'\r\n | 'aiNumber'\r\n | 'aiString'\r\n | 'aiBoolean'\r\n | 'aiAsk'\r\n | 'runYaml'\r\n | 'setAIActionContext'\r\n | 'evaluateJavaScript'\r\n | 'logScreenshot'\r\n | 'freezePageContext'\r\n | 'unfreezePageContext';\r\n }) {\r\n const { page, testInfo, use, aiActionType } = options;\r\n const agent = createOrReuseAgentForPage(page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n }) as PlaywrightAgent;\r\n\r\n await use(async (taskPrompt: string, ...args: any[]) => {\r\n return new Promise((resolve, reject) => {\r\n test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async () => {\r\n try {\r\n debugPage(\r\n `waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`,\r\n );\r\n await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);\r\n } catch (error) {\r\n console.warn(\r\n '[midscene:warning] Waiting for network idle has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n try {\r\n type AgentMethod = (\r\n prompt: string,\r\n ...restArgs: any[]\r\n ) => Promise<any>;\r\n const result = await (agent[aiActionType] as AgentMethod)(\r\n taskPrompt,\r\n ...(args || []),\r\n );\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n const updateDumpAnnotation = (test: TestInfo, dump: string) => {\r\n // Write dump to temporary file\r\n const tempFileName = `midscene-dump-${test.testId || uuid()}-${Date.now()}.json`;\r\n const tempFilePath = join(tmpdir(), tempFileName);\r\n\r\n writeFileSync(tempFilePath, dump, 'utf-8');\r\n debugPage(`Dump written to temp file: ${tempFilePath}`);\r\n\r\n // Store only the file path in annotation\r\n const currentAnnotation = test.annotations.find((item) => {\r\n return item.type === midsceneDumpAnnotationId;\r\n });\r\n if (currentAnnotation) {\r\n // Store file path instead of dump content\r\n currentAnnotation.description = tempFilePath;\r\n } else {\r\n test.annotations.push({\r\n type: midsceneDumpAnnotationId,\r\n description: tempFilePath,\r\n });\r\n }\r\n };\r\n\r\n return {\r\n agentForPage: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await use(\r\n async (\r\n propsPage?: OriginPlaywrightPage | undefined,\r\n opts?: AgentOpt,\r\n ) => {\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n // Handle cache configuration priority:\r\n // 1. If user provides cache in opts, use it (but auto-generate ID if missing)\r\n // 2. Otherwise use fixture's cache config\r\n let finalCacheConfig = cacheConfig;\r\n if (opts?.cache !== undefined) {\r\n const userCache = opts.cache;\r\n if (userCache === false) {\r\n finalCacheConfig = false;\r\n } else if (userCache === true) {\r\n // Auto-generate ID for user's cache: true\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { id };\r\n } else if (typeof userCache === 'object') {\r\n if (!userCache.id) {\r\n // Auto-generate ID for user's cache object without ID\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { ...userCache, id };\r\n } else {\r\n finalCacheConfig = userCache;\r\n }\r\n }\r\n }\r\n\r\n const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n cache: finalCacheConfig,\r\n ...opts,\r\n });\r\n return agent;\r\n },\r\n );\r\n },\r\n ai: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'ai',\r\n });\r\n },\r\n aiAction: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAction',\r\n });\r\n },\r\n aiTap: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiTap',\r\n });\r\n },\r\n aiRightClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiRightClick',\r\n });\r\n },\r\n aiDoubleClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiDoubleClick',\r\n });\r\n },\r\n aiHover: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiHover',\r\n });\r\n },\r\n aiInput: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiInput',\r\n });\r\n },\r\n aiKeyboardPress: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiKeyboardPress',\r\n });\r\n },\r\n aiScroll: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiScroll',\r\n });\r\n },\r\n aiQuery: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiQuery',\r\n });\r\n },\r\n aiAssert: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAssert',\r\n });\r\n },\r\n aiWaitFor: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiWaitFor',\r\n });\r\n },\r\n aiLocate: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiLocate',\r\n });\r\n },\r\n aiNumber: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiNumber',\r\n });\r\n },\r\n aiString: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiString',\r\n });\r\n },\r\n aiBoolean: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiBoolean',\r\n });\r\n },\r\n aiAsk: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAsk',\r\n });\r\n },\r\n runYaml: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'runYaml',\r\n });\r\n },\r\n setAIActionContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'setAIActionContext',\r\n });\r\n },\r\n evaluateJavaScript: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'evaluateJavaScript',\r\n });\r\n },\r\n logScreenshot: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'logScreenshot',\r\n });\r\n },\r\n freezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'freezePageContext',\r\n });\r\n },\r\n unfreezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'unfreezePageContext',\r\n });\r\n },\r\n };\r\n};\r\n\r\nexport type PlayWrightAiFixtureType = {\r\n agentForPage: (\r\n page?: any,\r\n opts?: any,\r\n ) => Promise<PageAgent<PlaywrightWebPage>>;\r\n ai: <T = any>(prompt: string) => Promise<T>;\r\n aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;\r\n aiTap: (\r\n ...args: Parameters<PageAgent['aiTap']>\r\n ) => ReturnType<PageAgent['aiTap']>;\r\n aiRightClick: (\r\n ...args: Parameters<PageAgent['aiRightClick']>\r\n ) => ReturnType<PageAgent['aiRightClick']>;\r\n aiDoubleClick: (\r\n ...args: Parameters<PageAgent['aiDoubleClick']>\r\n ) => ReturnType<PageAgent['aiDoubleClick']>;\r\n aiHover: (\r\n ...args: Parameters<PageAgent['aiHover']>\r\n ) => ReturnType<PageAgent['aiHover']>;\r\n aiInput: (\r\n ...args: Parameters<PageAgent['aiInput']>\r\n ) => ReturnType<PageAgent['aiInput']>;\r\n aiKeyboardPress: (\r\n ...args: Parameters<PageAgent['aiKeyboardPress']>\r\n ) => ReturnType<PageAgent['aiKeyboardPress']>;\r\n aiScroll: (\r\n ...args: Parameters<PageAgent['aiScroll']>\r\n ) => ReturnType<PageAgent['aiScroll']>;\r\n aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;\r\n aiAssert: (\r\n ...args: Parameters<PageAgent['aiAssert']>\r\n ) => ReturnType<PageAgent['aiAssert']>;\r\n aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;\r\n aiLocate: (\r\n ...args: Parameters<PageAgent['aiLocate']>\r\n ) => ReturnType<PageAgent['aiLocate']>;\r\n aiNumber: (\r\n ...args: Parameters<PageAgent['aiNumber']>\r\n ) => ReturnType<PageAgent['aiNumber']>;\r\n aiString: (\r\n ...args: Parameters<PageAgent['aiString']>\r\n ) => ReturnType<PageAgent['aiString']>;\r\n aiBoolean: (\r\n ...args: Parameters<PageAgent['aiBoolean']>\r\n ) => ReturnType<PageAgent['aiBoolean']>;\r\n aiAsk: (\r\n ...args: Parameters<PageAgent['aiAsk']>\r\n ) => ReturnType<PageAgent['aiAsk']>;\r\n runYaml: (\r\n ...args: Parameters<PageAgent['runYaml']>\r\n ) => ReturnType<PageAgent['runYaml']>;\r\n setAIActionContext: (\r\n ...args: Parameters<PageAgent['setAIActionContext']>\r\n ) => ReturnType<PageAgent['setAIActionContext']>;\r\n evaluateJavaScript: (\r\n ...args: Parameters<PageAgent['evaluateJavaScript']>\r\n ) => ReturnType<PageAgent['evaluateJavaScript']>;\r\n logScreenshot: (\r\n ...args: Parameters<PageAgent['logScreenshot']>\r\n ) => ReturnType<PageAgent['logScreenshot']>;\r\n freezePageContext: (\r\n ...args: Parameters<PageAgent['freezePageContext']>\r\n ) => ReturnType<PageAgent['freezePageContext']>;\r\n unfreezePageContext: (\r\n ...args: Parameters<PageAgent['unfreezePageContext']>\r\n ) => ReturnType<PageAgent['unfreezePageContext']>;\r\n};\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","groupAndCaseForTest","testInfo","taskFile","taskTitle","titlePath","taskTitleWithRetry","replaceIllegalPathCharsAndSpace","midsceneAgentKeyId","midsceneDumpAnnotationId","PlaywrightAiFixture","options","forceSameTabNavigation","waitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","waitForNavigationTimeout","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","cache","processTestCacheConfig","id","processCacheConfig","pageAgentMap","createOrReuseAgentForPage","page","opts","idForPage","uuid","testId","file","title","cacheConfig","PlaywrightAgent","dump","updateDumpAnnotation","generateAiFunction","use","aiActionType","agent","taskPrompt","args","Promise","resolve","reject","test","JSON","error","console","result","tempFileName","Date","tempFilePath","join","tmpdir","writeFileSync","currentAnnotation","item","propsPage","finalCacheConfig","undefined","userCache"],"mappings":"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ACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,OAAO,OACL,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,eAAe,OACb,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,mBAAmB,OACjB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,qBAAqB,OACnB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;IACF;AACF"}
|
|
1
|
+
{"version":3,"file":"playwright\\ai-fixture.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/playwright/ai-fixture.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { writeFileSync } from 'node:fs';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { PlaywrightAgent, type PlaywrightWebPage } from '@/playwright/index';\r\nimport type { WebPageAgentOpt } from '@/web-element';\r\nimport type { Cache } from '@sqaitech/core';\r\nimport type { AgentOpt, Agent as PageAgent } from '@sqaitech/core/agent';\r\nimport { processCacheConfig } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { replaceIllegalPathCharsAndSpace } from '@sqaitech/shared/utils';\r\nimport { type TestInfo, type TestType, test } from '@playwright/test';\r\nimport type { Page as OriginPlaywrightPage } from 'playwright';\r\nexport type APITestType = Pick<TestType<any, any>, 'step'>;\r\n\r\nconst debugPage = getDebug('web:playwright:ai-fixture');\r\n\r\nconst groupAndCaseForTest = (testInfo: TestInfo) => {\r\n let taskFile: string;\r\n let taskTitle: string;\r\n const titlePath = [...testInfo.titlePath];\r\n\r\n if (titlePath.length > 1) {\r\n taskFile = titlePath.shift() || 'unnamed';\r\n taskTitle = titlePath.join('__');\r\n } else if (titlePath.length === 1) {\r\n taskTitle = titlePath[0];\r\n taskFile = `${taskTitle}`;\r\n } else {\r\n taskTitle = 'unnamed';\r\n taskFile = 'unnamed';\r\n }\r\n\r\n const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;\r\n\r\n return {\r\n file: taskFile,\r\n id: replaceIllegalPathCharsAndSpace(`${taskFile}(${taskTitle})`),\r\n title: replaceIllegalPathCharsAndSpace(taskTitleWithRetry),\r\n };\r\n};\r\n\r\nconst midsceneAgentKeyId = '_midsceneAgentId';\r\nexport const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';\r\n\r\ntype PlaywrightCacheConfig = {\r\n strategy?: 'read-only' | 'read-write' | 'write-only';\r\n id?: string;\r\n};\r\ntype PlaywrightCache = false | true | PlaywrightCacheConfig;\r\n\r\nexport const PlaywrightAiFixture = (options?: {\r\n forceSameTabNavigation?: boolean;\r\n waitForNetworkIdleTimeout?: number;\r\n waitForNavigationTimeout?: number;\r\n cache?: PlaywrightCache;\r\n}) => {\r\n const {\r\n forceSameTabNavigation = true,\r\n waitForNetworkIdleTimeout = DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n waitForNavigationTimeout = DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n cache,\r\n } = options ?? {};\r\n\r\n // Helper function to process cache configuration and auto-generate ID from test info\r\n const processTestCacheConfig = (testInfo: TestInfo): Cache | undefined => {\r\n // Generate ID from test info\r\n const { id } = groupAndCaseForTest(testInfo);\r\n\r\n // Use shared processCacheConfig with generated ID as fallback\r\n return processCacheConfig(cache as Cache, id);\r\n };\r\n\r\n const pageAgentMap: Record<string, PageAgent<PlaywrightWebPage>> = {};\r\n const createOrReuseAgentForPage = (\r\n page: OriginPlaywrightPage,\r\n testInfo: TestInfo, // { testId: string; taskFile: string; taskTitle: string },\r\n opts?: WebPageAgentOpt,\r\n ) => {\r\n let idForPage = (page as any)[midsceneAgentKeyId];\r\n if (!idForPage) {\r\n idForPage = uuid();\r\n (page as any)[midsceneAgentKeyId] = idForPage;\r\n const { testId } = testInfo;\r\n const { file, title } = groupAndCaseForTest(testInfo);\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n pageAgentMap[idForPage] = new PlaywrightAgent(page, {\r\n testId: `playwright-${testId}-${idForPage}`,\r\n forceSameTabNavigation,\r\n cache: cacheConfig,\r\n groupName: title,\r\n groupDescription: file,\r\n generateReport: false, // we will generate it in the reporter\r\n ...opts,\r\n });\r\n\r\n pageAgentMap[idForPage].onDumpUpdate = (dump: string) => {\r\n updateDumpAnnotation(testInfo, dump);\r\n };\r\n\r\n page.on('close', () => {\r\n debugPage('page closed');\r\n pageAgentMap[idForPage].destroy();\r\n delete pageAgentMap[idForPage];\r\n });\r\n }\r\n\r\n return pageAgentMap[idForPage];\r\n };\r\n\r\n async function generateAiFunction(options: {\r\n page: OriginPlaywrightPage;\r\n testInfo: TestInfo;\r\n use: any;\r\n aiActionType:\r\n | 'ai'\r\n | 'aiAction'\r\n | 'aiHover'\r\n | 'aiInput'\r\n | 'aiKeyboardPress'\r\n | 'aiScroll'\r\n | 'aiTap'\r\n | 'aiRightClick'\r\n | 'aiDoubleClick'\r\n | 'aiQuery'\r\n | 'aiAssert'\r\n | 'aiWaitFor'\r\n | 'aiLocate'\r\n | 'aiNumber'\r\n | 'aiString'\r\n | 'aiBoolean'\r\n | 'aiAsk'\r\n | 'runYaml'\r\n | 'setAIActionContext'\r\n | 'evaluateJavaScript'\r\n | 'logScreenshot'\r\n | 'freezePageContext'\r\n | 'unfreezePageContext';\r\n }) {\r\n const { page, testInfo, use, aiActionType } = options;\r\n const agent = createOrReuseAgentForPage(page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n }) as PlaywrightAgent;\r\n\r\n await use(async (taskPrompt: string, ...args: any[]) => {\r\n return new Promise((resolve, reject) => {\r\n test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async () => {\r\n try {\r\n debugPage(\r\n `waitForNetworkIdle timeout: ${waitForNetworkIdleTimeout}`,\r\n );\r\n await agent.waitForNetworkIdle(waitForNetworkIdleTimeout);\r\n } catch (error) {\r\n console.warn(\r\n '[sqai:warning] Waiting for network idle has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n try {\r\n type AgentMethod = (\r\n prompt: string,\r\n ...restArgs: any[]\r\n ) => Promise<any>;\r\n const result = await (agent[aiActionType] as AgentMethod)(\r\n taskPrompt,\r\n ...(args || []),\r\n );\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n const updateDumpAnnotation = (test: TestInfo, dump: string) => {\r\n // Write dump to temporary file\r\n const tempFileName = `midscene-dump-${test.testId || uuid()}-${Date.now()}.json`;\r\n const tempFilePath = join(tmpdir(), tempFileName);\r\n\r\n writeFileSync(tempFilePath, dump, 'utf-8');\r\n debugPage(`Dump written to temp file: ${tempFilePath}`);\r\n\r\n // Store only the file path in annotation\r\n const currentAnnotation = test.annotations.find((item) => {\r\n return item.type === midsceneDumpAnnotationId;\r\n });\r\n if (currentAnnotation) {\r\n // Store file path instead of dump content\r\n currentAnnotation.description = tempFilePath;\r\n } else {\r\n test.annotations.push({\r\n type: midsceneDumpAnnotationId,\r\n description: tempFilePath,\r\n });\r\n }\r\n };\r\n\r\n return {\r\n agentForPage: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await use(\r\n async (\r\n propsPage?: OriginPlaywrightPage | undefined,\r\n opts?: AgentOpt,\r\n ) => {\r\n const cacheConfig = processTestCacheConfig(testInfo);\r\n\r\n // Handle cache configuration priority:\r\n // 1. If user provides cache in opts, use it (but auto-generate ID if missing)\r\n // 2. Otherwise use fixture's cache config\r\n let finalCacheConfig = cacheConfig;\r\n if (opts?.cache !== undefined) {\r\n const userCache = opts.cache;\r\n if (userCache === false) {\r\n finalCacheConfig = false;\r\n } else if (userCache === true) {\r\n // Auto-generate ID for user's cache: true\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { id };\r\n } else if (typeof userCache === 'object') {\r\n if (!userCache.id) {\r\n // Auto-generate ID for user's cache object without ID\r\n const { id } = groupAndCaseForTest(testInfo);\r\n finalCacheConfig = { ...userCache, id };\r\n } else {\r\n finalCacheConfig = userCache;\r\n }\r\n }\r\n }\r\n\r\n const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {\r\n waitForNavigationTimeout,\r\n waitForNetworkIdleTimeout,\r\n cache: finalCacheConfig,\r\n ...opts,\r\n });\r\n return agent;\r\n },\r\n );\r\n },\r\n ai: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'ai',\r\n });\r\n },\r\n aiAction: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAction',\r\n });\r\n },\r\n aiTap: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiTap',\r\n });\r\n },\r\n aiRightClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiRightClick',\r\n });\r\n },\r\n aiDoubleClick: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiDoubleClick',\r\n });\r\n },\r\n aiHover: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiHover',\r\n });\r\n },\r\n aiInput: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiInput',\r\n });\r\n },\r\n aiKeyboardPress: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiKeyboardPress',\r\n });\r\n },\r\n aiScroll: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiScroll',\r\n });\r\n },\r\n aiQuery: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiQuery',\r\n });\r\n },\r\n aiAssert: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAssert',\r\n });\r\n },\r\n aiWaitFor: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiWaitFor',\r\n });\r\n },\r\n aiLocate: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiLocate',\r\n });\r\n },\r\n aiNumber: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiNumber',\r\n });\r\n },\r\n aiString: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiString',\r\n });\r\n },\r\n aiBoolean: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiBoolean',\r\n });\r\n },\r\n aiAsk: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'aiAsk',\r\n });\r\n },\r\n runYaml: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'runYaml',\r\n });\r\n },\r\n setAIActionContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'setAIActionContext',\r\n });\r\n },\r\n evaluateJavaScript: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'evaluateJavaScript',\r\n });\r\n },\r\n logScreenshot: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'logScreenshot',\r\n });\r\n },\r\n freezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'freezePageContext',\r\n });\r\n },\r\n unfreezePageContext: async (\r\n { page }: { page: OriginPlaywrightPage },\r\n use: any,\r\n testInfo: TestInfo,\r\n ) => {\r\n await generateAiFunction({\r\n page,\r\n testInfo,\r\n use,\r\n aiActionType: 'unfreezePageContext',\r\n });\r\n },\r\n };\r\n};\r\n\r\nexport type PlayWrightAiFixtureType = {\r\n agentForPage: (\r\n page?: any,\r\n opts?: any,\r\n ) => Promise<PageAgent<PlaywrightWebPage>>;\r\n ai: <T = any>(prompt: string) => Promise<T>;\r\n aiAction: (taskPrompt: string) => ReturnType<PageAgent['aiAction']>;\r\n aiTap: (\r\n ...args: Parameters<PageAgent['aiTap']>\r\n ) => ReturnType<PageAgent['aiTap']>;\r\n aiRightClick: (\r\n ...args: Parameters<PageAgent['aiRightClick']>\r\n ) => ReturnType<PageAgent['aiRightClick']>;\r\n aiDoubleClick: (\r\n ...args: Parameters<PageAgent['aiDoubleClick']>\r\n ) => ReturnType<PageAgent['aiDoubleClick']>;\r\n aiHover: (\r\n ...args: Parameters<PageAgent['aiHover']>\r\n ) => ReturnType<PageAgent['aiHover']>;\r\n aiInput: (\r\n ...args: Parameters<PageAgent['aiInput']>\r\n ) => ReturnType<PageAgent['aiInput']>;\r\n aiKeyboardPress: (\r\n ...args: Parameters<PageAgent['aiKeyboardPress']>\r\n ) => ReturnType<PageAgent['aiKeyboardPress']>;\r\n aiScroll: (\r\n ...args: Parameters<PageAgent['aiScroll']>\r\n ) => ReturnType<PageAgent['aiScroll']>;\r\n aiQuery: <T = any>(...args: Parameters<PageAgent['aiQuery']>) => Promise<T>;\r\n aiAssert: (\r\n ...args: Parameters<PageAgent['aiAssert']>\r\n ) => ReturnType<PageAgent['aiAssert']>;\r\n aiWaitFor: (...args: Parameters<PageAgent['aiWaitFor']>) => Promise<void>;\r\n aiLocate: (\r\n ...args: Parameters<PageAgent['aiLocate']>\r\n ) => ReturnType<PageAgent['aiLocate']>;\r\n aiNumber: (\r\n ...args: Parameters<PageAgent['aiNumber']>\r\n ) => ReturnType<PageAgent['aiNumber']>;\r\n aiString: (\r\n ...args: Parameters<PageAgent['aiString']>\r\n ) => ReturnType<PageAgent['aiString']>;\r\n aiBoolean: (\r\n ...args: Parameters<PageAgent['aiBoolean']>\r\n ) => ReturnType<PageAgent['aiBoolean']>;\r\n aiAsk: (\r\n ...args: Parameters<PageAgent['aiAsk']>\r\n ) => ReturnType<PageAgent['aiAsk']>;\r\n runYaml: (\r\n ...args: Parameters<PageAgent['runYaml']>\r\n ) => ReturnType<PageAgent['runYaml']>;\r\n setAIActionContext: (\r\n ...args: Parameters<PageAgent['setAIActionContext']>\r\n ) => ReturnType<PageAgent['setAIActionContext']>;\r\n evaluateJavaScript: (\r\n ...args: Parameters<PageAgent['evaluateJavaScript']>\r\n ) => ReturnType<PageAgent['evaluateJavaScript']>;\r\n logScreenshot: (\r\n ...args: Parameters<PageAgent['logScreenshot']>\r\n ) => ReturnType<PageAgent['logScreenshot']>;\r\n freezePageContext: (\r\n ...args: Parameters<PageAgent['freezePageContext']>\r\n ) => ReturnType<PageAgent['freezePageContext']>;\r\n unfreezePageContext: (\r\n ...args: Parameters<PageAgent['unfreezePageContext']>\r\n ) => ReturnType<PageAgent['unfreezePageContext']>;\r\n};\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debugPage","getDebug","groupAndCaseForTest","testInfo","taskFile","taskTitle","titlePath","taskTitleWithRetry","replaceIllegalPathCharsAndSpace","midsceneAgentKeyId","midsceneDumpAnnotationId","PlaywrightAiFixture","options","forceSameTabNavigation","waitForNetworkIdleTimeout","DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT","waitForNavigationTimeout","DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT","cache","processTestCacheConfig","id","processCacheConfig","pageAgentMap","createOrReuseAgentForPage","page","opts","idForPage","uuid","testId","file","title","cacheConfig","PlaywrightAgent","dump","updateDumpAnnotation","generateAiFunction","use","aiActionType","agent","taskPrompt","args","Promise","resolve","reject","test","JSON","error","console","result","tempFileName","Date","tempFilePath","join","tmpdir","writeFileSync","currentAnnotation","item","propsPage","finalCacheConfig","undefined","userCache"],"mappings":"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ACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,UAAU,OACR,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,WAAW,OACT,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,OAAO,OACL,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,SAAS,OACP,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,oBAAoB,OAClB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,eAAe,OACb,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,mBAAmB,OACjB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;QACA,qBAAqB,OACnB,EAAEZ,IAAI,EAAkC,EACxCY,KACAjC;YAEA,MAAMgC,mBAAmB;gBACvBX;gBACArB;gBACAiC;gBACA,cAAc;YAChB;QACF;IACF;AACF"}
|
|
@@ -81,7 +81,7 @@ class Page {
|
|
|
81
81
|
timeout: this.waitForNavigationTimeout
|
|
82
82
|
});
|
|
83
83
|
} catch (error) {
|
|
84
|
-
console.warn('[
|
|
84
|
+
console.warn('[sqai:warning] Waiting for the "navigation" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
85
85
|
}
|
|
86
86
|
debugPage('waitForNavigation end');
|
|
87
87
|
}
|
|
@@ -96,7 +96,7 @@ class Page {
|
|
|
96
96
|
timeout: this.waitForNetworkIdleTimeout
|
|
97
97
|
});
|
|
98
98
|
} catch (error) {
|
|
99
|
-
console.warn('[
|
|
99
|
+
console.warn('[sqai:warning] Waiting for the "network idle" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout');
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer\\base-page.js","sources":["webpack://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/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';\r\nimport type {\r\n DeviceAction,\r\n ElementCacheFeature,\r\n ElementTreeNode,\r\n Point,\r\n Rect,\r\n Size,\r\n UIContext,\r\n} from '@sqaitech/core';\r\nimport type { AbstractInterface } from '@sqaitech/core/device';\r\nimport { sleep } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport type { ElementInfo } from '@sqaitech/shared/extractor';\r\nimport { treeToList } from '@sqaitech/shared/extractor';\r\nimport { createImgBase64ByFormat } from '@sqaitech/shared/img';\r\nimport { type DebugFunction, getDebug } from '@sqaitech/shared/logger';\r\nimport {\r\n getElementInfosScriptContent,\r\n getExtraReturnLogic,\r\n} from '@sqaitech/shared/node';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { Page as PlaywrightPage } from 'playwright';\r\nimport type { Page as PuppeteerPage } from 'puppeteer';\r\nimport {\r\n type KeyInput,\r\n type MouseButton,\r\n commonWebActionsForWebPage,\r\n} from '../web-page';\r\n\r\nexport const debugPage = getDebug('web:page');\r\n\r\ntype WebElementCacheFeature = ElementCacheFeature & {\r\n xpaths?: string[];\r\n};\r\n\r\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\r\n if (!Array.isArray(xpaths)) {\r\n return [];\r\n }\r\n\r\n return xpaths.filter(\r\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\r\n );\r\n};\r\n\r\nexport class Page<\r\n AgentType extends 'puppeteer' | 'playwright',\r\n InterfaceType extends PuppeteerPage | PlaywrightPage,\r\n> implements AbstractInterface\r\n{\r\n underlyingPage: InterfaceType;\r\n protected waitForNavigationTimeout: number;\r\n protected waitForNetworkIdleTimeout: number;\r\n private viewportSize?: Size;\r\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\r\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\r\n private customActions?: DeviceAction<any>[];\r\n\r\n interfaceType: AgentType;\r\n\r\n actionSpace(): DeviceAction[] {\r\n const defaultActions = commonWebActionsForWebPage(this);\r\n const customActions = this.customActions || [];\r\n return [...defaultActions, ...customActions];\r\n }\r\n\r\n private async evaluate<R>(\r\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\r\n arg?: any,\r\n ): Promise<R> {\r\n let result: R;\r\n debugPage('evaluate function begin');\r\n if (this.interfaceType === 'puppeteer') {\r\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n } else {\r\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n }\r\n debugPage('evaluate function end');\r\n return result;\r\n }\r\n\r\n constructor(\r\n underlyingPage: InterfaceType,\r\n interfaceType: AgentType,\r\n opts?: WebPageAgentOpt,\r\n ) {\r\n this.underlyingPage = underlyingPage;\r\n this.interfaceType = interfaceType;\r\n this.waitForNavigationTimeout =\r\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\r\n this.waitForNetworkIdleTimeout =\r\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\r\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\r\n this.onAfterInvokeAction = opts?.afterInvokeAction;\r\n this.customActions = opts?.customActions;\r\n }\r\n\r\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\r\n return this.evaluate(script);\r\n }\r\n\r\n async waitForNavigation() {\r\n if (this.waitForNavigationTimeout === 0) {\r\n debugPage('waitForNavigation timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\r\n if (\r\n this.interfaceType === 'puppeteer' ||\r\n this.interfaceType === 'playwright'\r\n ) {\r\n debugPage('waitForNavigation begin');\r\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\r\n timeout: this.waitForNavigationTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[midscene:warning] Waiting for the \"navigation\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n debugPage('waitForNavigation end');\r\n }\r\n }\r\n\r\n async waitForNetworkIdle(): Promise<void> {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (this.waitForNetworkIdleTimeout === 0) {\r\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\r\n idleTime: 200,\r\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n timeout: this.waitForNetworkIdleTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[midscene:warning] Waiting for the \"network idle\" has timed out, but Midscene will continue execution. Please check https://midscenejs.com/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n } else {\r\n // TODO: implement playwright waitForNetworkIdle\r\n }\r\n }\r\n\r\n // @deprecated\r\n async getElementsInfo() {\r\n // const scripts = await getExtraReturnLogic();\r\n // const captureElementSnapshot = await this.evaluate(scripts);\r\n // return captureElementSnapshot as ElementInfo[];\r\n await this.waitForNavigation();\r\n debugPage('getElementsInfo begin');\r\n const tree = await this.getElementsNodeTree();\r\n debugPage('getElementsInfo end');\r\n return treeToList(tree);\r\n }\r\n\r\n async getXpathsById(id: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\r\n );\r\n }\r\n\r\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\r\n );\r\n }\r\n\r\n async getElementInfoByXpath(xpath: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\r\n );\r\n }\r\n\r\n async cacheFeatureForRect(\r\n rect: Rect,\r\n opt?: { _orderSensitive: boolean },\r\n ): Promise<ElementCacheFeature> {\r\n const center: Point = {\r\n left: Math.floor(rect.left + rect.width / 2),\r\n top: Math.floor(rect.top + rect.height / 2),\r\n };\r\n\r\n try {\r\n const orderSensitive = opt?._orderSensitive ?? false;\r\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\r\n const sanitized = sanitizeXpaths(xpaths);\r\n if (!sanitized.length) {\r\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\r\n }\r\n return {\r\n xpaths: sanitized,\r\n };\r\n } catch (error) {\r\n debugPage('cacheFeatureForRect failed: %s', error);\r\n return {\r\n xpaths: [],\r\n };\r\n }\r\n }\r\n\r\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\r\n const webFeature = feature as WebElementCacheFeature;\r\n const xpaths = sanitizeXpaths(webFeature.xpaths);\r\n\r\n for (const xpath of xpaths) {\r\n try {\r\n const elementInfo = await this.getElementInfoByXpath(xpath);\r\n if (elementInfo?.rect) {\r\n const matchedRect: Rect = {\r\n left: elementInfo.rect.left,\r\n top: elementInfo.rect.top,\r\n width: elementInfo.rect.width,\r\n height: elementInfo.rect.height,\r\n };\r\n\r\n if (this.viewportSize?.dpr) {\r\n matchedRect.dpr = this.viewportSize.dpr;\r\n }\r\n\r\n return matchedRect;\r\n }\r\n } catch (error) {\r\n debugPage(\r\n 'rectMatchesCacheFeature failed for xpath %s: %s',\r\n xpath,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n throw new Error(\r\n 'No matching element rect found for the provided cache feature',\r\n );\r\n }\r\n\r\n async getElementsNodeTree() {\r\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\r\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\r\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\r\n await this.waitForNavigation();\r\n const scripts = await getExtraReturnLogic(true);\r\n assert(scripts, 'scripts should be set before writing report in browser');\r\n const startTime = Date.now();\r\n const captureElementSnapshot = await this.evaluate(scripts);\r\n const endTime = Date.now();\r\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\r\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\r\n }\r\n\r\n async size(): Promise<Size> {\r\n if (this.viewportSize) return this.viewportSize;\r\n const sizeInfo: Size = await this.evaluate(() => {\r\n return {\r\n width: document.documentElement.clientWidth,\r\n height: document.documentElement.clientHeight,\r\n dpr: window.devicePixelRatio,\r\n };\r\n });\r\n this.viewportSize = sizeInfo;\r\n return sizeInfo;\r\n }\r\n\r\n async screenshotBase64(): Promise<string> {\r\n const imgType = 'jpeg';\r\n const quality = 90;\r\n await this.waitForNavigation();\r\n const startTime = Date.now();\r\n debugPage('screenshotBase64 begin');\r\n\r\n let base64: string;\r\n if (this.interfaceType === 'puppeteer') {\r\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\r\n type: imgType,\r\n quality,\r\n encoding: 'base64',\r\n });\r\n base64 = createImgBase64ByFormat(imgType, result);\r\n } else if (this.interfaceType === 'playwright') {\r\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\r\n type: imgType,\r\n quality,\r\n timeout: 10 * 1000,\r\n });\r\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\r\n } else {\r\n throw new Error('Unsupported page type for screenshot');\r\n }\r\n const endTime = Date.now();\r\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\r\n return base64;\r\n }\r\n\r\n async url(): Promise<string> {\r\n return this.underlyingPage.url();\r\n }\r\n\r\n describe(): string {\r\n const url = this.underlyingPage.url();\r\n return url || '';\r\n }\r\n\r\n get mouse() {\r\n return {\r\n click: async (\r\n x: number,\r\n y: number,\r\n options?: { button?: MouseButton; count?: number },\r\n ) => {\r\n await this.mouse.move(x, y);\r\n const { button = 'left', count = 1 } = options || {};\r\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\r\n\r\n if (count === 2 && this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\r\n button,\r\n });\r\n } else {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (button === 'left' && count === 1) {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\r\n } else {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\r\n button,\r\n count,\r\n });\r\n }\r\n } else if (this.interfaceType === 'playwright') {\r\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\r\n button,\r\n clickCount: count,\r\n });\r\n }\r\n }\r\n },\r\n wheel: async (deltaX: number, deltaY: number) => {\r\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\r\n deltaX,\r\n deltaY,\r\n });\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\r\n deltaX,\r\n deltaY,\r\n );\r\n }\r\n },\r\n move: async (x: number, y: number) => {\r\n this.everMoved = true;\r\n debugPage(`mouse move to ${x}, ${y}`);\r\n return this.underlyingPage.mouse.move(x, y);\r\n },\r\n drag: async (\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n ) => {\r\n debugPage(\r\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(\r\n from.x,\r\n from.y,\r\n );\r\n await sleep(200);\r\n await (this.underlyingPage as PlaywrightPage).mouse.down();\r\n await sleep(300);\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\r\n await sleep(500);\r\n await (this.underlyingPage as PlaywrightPage).mouse.up();\r\n await sleep(200);\r\n debugPage(\r\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n },\r\n };\r\n }\r\n\r\n get keyboard() {\r\n return {\r\n type: async (text: string) => {\r\n debugPage(`keyboard type ${text}`);\r\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\r\n },\r\n press: async (\r\n action:\r\n | { key: KeyInput; command?: string }\r\n | { key: KeyInput; command?: string }[],\r\n ) => {\r\n const keys = Array.isArray(action) ? action : [action];\r\n debugPage('keyboard press', keys);\r\n for (const k of keys) {\r\n const commands = k.command ? [k.command] : [];\r\n await this.underlyingPage.keyboard.down(k.key, { commands });\r\n }\r\n for (const k of [...keys].reverse()) {\r\n await this.underlyingPage.keyboard.up(k.key);\r\n }\r\n },\r\n down: async (key: KeyInput) => {\r\n debugPage(`keyboard down ${key}`);\r\n return this.underlyingPage.keyboard.down(key);\r\n },\r\n up: async (key: KeyInput) => {\r\n debugPage(`keyboard up ${key}`);\r\n return this.underlyingPage.keyboard.up(key);\r\n },\r\n };\r\n }\r\n\r\n async clearInput(element: ElementInfo): Promise<void> {\r\n if (!element) {\r\n console.warn('No element to clear input');\r\n return;\r\n }\r\n\r\n const backspace = async () => {\r\n await sleep(100);\r\n await this.keyboard.press([{ key: 'Backspace' }]);\r\n };\r\n\r\n const isMac = process.platform === 'darwin';\r\n debugPage('clearInput begin');\r\n if (isMac) {\r\n if (this.interfaceType === 'puppeteer') {\r\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\r\n await this.mouse.click(element.center[0], element.center[1], {\r\n count: 3,\r\n });\r\n await backspace();\r\n }\r\n\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Meta');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Meta');\r\n await backspace();\r\n } else {\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Control');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Control');\r\n await backspace();\r\n }\r\n debugPage('clearInput end');\r\n }\r\n\r\n private everMoved = false;\r\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\r\n if (point) {\r\n await this.mouse.move(point.left, point.top);\r\n } else if (!this.everMoved) {\r\n // If the mouse has never moved, move it to the center of the page\r\n const size = await this.size();\r\n const targetX = Math.floor(size.width / 2);\r\n const targetY = Math.floor(size.height / 2);\r\n await this.mouse.move(targetX, targetY);\r\n }\r\n }\r\n\r\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -9999999);\r\n }\r\n\r\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, 9999999);\r\n }\r\n\r\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-9999999, 0);\r\n }\r\n\r\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(9999999, 0);\r\n }\r\n\r\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -scrollDistance);\r\n }\r\n\r\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, scrollDistance);\r\n }\r\n\r\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-scrollDistance, 0);\r\n }\r\n\r\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(scrollDistance, 0);\r\n }\r\n\r\n async navigate(url: string): Promise<void> {\r\n debugPage(`navigate to ${url}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).goto(url);\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).goto(url);\r\n } else {\r\n throw new Error('Unsupported page type for navigate');\r\n }\r\n }\r\n\r\n async beforeInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onBeforeInvokeAction) {\r\n await this.onBeforeInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async afterInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onAfterInvokeAction) {\r\n await this.onAfterInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async destroy(): Promise<void> {}\r\n\r\n async getContext(): Promise<UIContext> {\r\n return await WebPageContextParser(this, {});\r\n }\r\n async swipe(\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n duration?: number,\r\n ) {\r\n const LONG_PRESS_THRESHOLD = 500;\r\n const MIN_PRESS_THRESHOLD = 150;\r\n duration = duration || 100;\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n debugPage(\r\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\r\n );\r\n\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down({ button: 'left' });\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down();\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await page.waitForTimeout(delay);\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n async longPress(x: number, y: number, duration?: number) {\r\n duration = duration || 500;\r\n const LONG_PRESS_THRESHOLD = 600;\r\n const MIN_PRESS_THRESHOLD = 300;\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await page.waitForTimeout(duration);\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n}\r\n\r\nexport function forceClosePopup(\r\n page: PuppeteerPage | PlaywrightPage,\r\n debugProfile: DebugFunction,\r\n) {\r\n page.on('popup', async (popup) => {\r\n if (!popup) {\r\n console.warn('got a popup event, but the popup is not ready yet, skip');\r\n return;\r\n }\r\n const url = await (popup as PuppeteerPage).url();\r\n console.log(`Popup opened: ${url}`);\r\n if (!(popup as PuppeteerPage).isClosed()) {\r\n try {\r\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\r\n } catch (error) {\r\n debugProfile(`failed to close popup ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`popup is already closed, skip close ${url}`);\r\n }\r\n\r\n if (!page.isClosed()) {\r\n try {\r\n await page.goto(url);\r\n } catch (error) {\r\n debugProfile(`failed to goto ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`page is already closed, skip goto ${url}`);\r\n }\r\n });\r\n}\r\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","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://@sqaitech/web/webpack/runtime/define_property_getters","webpack://@sqaitech/web/webpack/runtime/has_own_property","webpack://@sqaitech/web/webpack/runtime/make_namespace_object","webpack://@sqaitech/web/./src/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';\r\nimport type {\r\n DeviceAction,\r\n ElementCacheFeature,\r\n ElementTreeNode,\r\n Point,\r\n Rect,\r\n Size,\r\n UIContext,\r\n} from '@sqaitech/core';\r\nimport type { AbstractInterface } from '@sqaitech/core/device';\r\nimport { sleep } from '@sqaitech/core/utils';\r\nimport {\r\n DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,\r\n} from '@sqaitech/shared/constants';\r\nimport type { ElementInfo } from '@sqaitech/shared/extractor';\r\nimport { treeToList } from '@sqaitech/shared/extractor';\r\nimport { createImgBase64ByFormat } from '@sqaitech/shared/img';\r\nimport { type DebugFunction, getDebug } from '@sqaitech/shared/logger';\r\nimport {\r\n getElementInfosScriptContent,\r\n getExtraReturnLogic,\r\n} from '@sqaitech/shared/node';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { Page as PlaywrightPage } from 'playwright';\r\nimport type { Page as PuppeteerPage } from 'puppeteer';\r\nimport {\r\n type KeyInput,\r\n type MouseButton,\r\n commonWebActionsForWebPage,\r\n} from '../web-page';\r\n\r\nexport const debugPage = getDebug('web:page');\r\n\r\ntype WebElementCacheFeature = ElementCacheFeature & {\r\n xpaths?: string[];\r\n};\r\n\r\nconst sanitizeXpaths = (xpaths: unknown): string[] => {\r\n if (!Array.isArray(xpaths)) {\r\n return [];\r\n }\r\n\r\n return xpaths.filter(\r\n (xpath): xpath is string => typeof xpath === 'string' && xpath.length > 0,\r\n );\r\n};\r\n\r\nexport class Page<\r\n AgentType extends 'puppeteer' | 'playwright',\r\n InterfaceType extends PuppeteerPage | PlaywrightPage,\r\n> implements AbstractInterface\r\n{\r\n underlyingPage: InterfaceType;\r\n protected waitForNavigationTimeout: number;\r\n protected waitForNetworkIdleTimeout: number;\r\n private viewportSize?: Size;\r\n private onBeforeInvokeAction?: AbstractInterface['beforeInvokeAction'];\r\n private onAfterInvokeAction?: AbstractInterface['afterInvokeAction'];\r\n private customActions?: DeviceAction<any>[];\r\n\r\n interfaceType: AgentType;\r\n\r\n actionSpace(): DeviceAction[] {\r\n const defaultActions = commonWebActionsForWebPage(this);\r\n const customActions = this.customActions || [];\r\n return [...defaultActions, ...customActions];\r\n }\r\n\r\n private async evaluate<R>(\r\n pageFunction: string | ((...args: any[]) => R | Promise<R>),\r\n arg?: any,\r\n ): Promise<R> {\r\n let result: R;\r\n debugPage('evaluate function begin');\r\n if (this.interfaceType === 'puppeteer') {\r\n result = await (this.underlyingPage as PuppeteerPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n } else {\r\n result = await (this.underlyingPage as PlaywrightPage).evaluate(\r\n pageFunction,\r\n arg,\r\n );\r\n }\r\n debugPage('evaluate function end');\r\n return result;\r\n }\r\n\r\n constructor(\r\n underlyingPage: InterfaceType,\r\n interfaceType: AgentType,\r\n opts?: WebPageAgentOpt,\r\n ) {\r\n this.underlyingPage = underlyingPage;\r\n this.interfaceType = interfaceType;\r\n this.waitForNavigationTimeout =\r\n opts?.waitForNavigationTimeout ?? DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT;\r\n this.waitForNetworkIdleTimeout =\r\n opts?.waitForNetworkIdleTimeout ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;\r\n this.onBeforeInvokeAction = opts?.beforeInvokeAction;\r\n this.onAfterInvokeAction = opts?.afterInvokeAction;\r\n this.customActions = opts?.customActions;\r\n }\r\n\r\n async evaluateJavaScript<T = any>(script: string): Promise<T> {\r\n return this.evaluate(script);\r\n }\r\n\r\n async waitForNavigation() {\r\n if (this.waitForNavigationTimeout === 0) {\r\n debugPage('waitForNavigation timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n // issue: https://github.com/puppeteer/puppeteer/issues/3323\r\n if (\r\n this.interfaceType === 'puppeteer' ||\r\n this.interfaceType === 'playwright'\r\n ) {\r\n debugPage('waitForNavigation begin');\r\n debugPage(`waitForNavigation timeout: ${this.waitForNavigationTimeout}`);\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForSelector('html', {\r\n timeout: this.waitForNavigationTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[sqai:warning] Waiting for the \"navigation\" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n debugPage('waitForNavigation end');\r\n }\r\n }\r\n\r\n async waitForNetworkIdle(): Promise<void> {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (this.waitForNetworkIdleTimeout === 0) {\r\n debugPage('waitForNetworkIdle timeout is 0, skip waiting');\r\n return;\r\n }\r\n\r\n try {\r\n await (this.underlyingPage as PuppeteerPage).waitForNetworkIdle({\r\n idleTime: 200,\r\n concurrency: DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,\r\n timeout: this.waitForNetworkIdleTimeout,\r\n });\r\n } catch (error) {\r\n // Ignore timeout error, continue execution\r\n console.warn(\r\n '[sqai:warning] Waiting for the \"network idle\" has timed out, but SQAI will continue execution. Please check https://sqai.tech/faq.html#customize-the-network-timeout for more information on customizing the network timeout',\r\n );\r\n }\r\n } else {\r\n // TODO: implement playwright waitForNetworkIdle\r\n }\r\n }\r\n\r\n // @deprecated\r\n async getElementsInfo() {\r\n // const scripts = await getExtraReturnLogic();\r\n // const captureElementSnapshot = await this.evaluate(scripts);\r\n // return captureElementSnapshot as ElementInfo[];\r\n await this.waitForNavigation();\r\n debugPage('getElementsInfo begin');\r\n const tree = await this.getElementsNodeTree();\r\n debugPage('getElementsInfo end');\r\n return treeToList(tree);\r\n }\r\n\r\n async getXpathsById(id: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsById(${JSON.stringify(id)})`,\r\n );\r\n }\r\n\r\n async getXpathsByPoint(point: Point, isOrderSensitive: boolean) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getXpathsByPoint({left: ${point.left}, top: ${point.top}}, ${isOrderSensitive})`,\r\n );\r\n }\r\n\r\n async getElementInfoByXpath(xpath: string) {\r\n const elementInfosScriptContent = getElementInfosScriptContent();\r\n\r\n return this.evaluateJavaScript(\r\n `${elementInfosScriptContent}midscene_element_inspector.getElementInfoByXpath(${JSON.stringify(xpath)})`,\r\n );\r\n }\r\n\r\n async cacheFeatureForRect(\r\n rect: Rect,\r\n opt?: { _orderSensitive: boolean },\r\n ): Promise<ElementCacheFeature> {\r\n const center: Point = {\r\n left: Math.floor(rect.left + rect.width / 2),\r\n top: Math.floor(rect.top + rect.height / 2),\r\n };\r\n\r\n try {\r\n const orderSensitive = opt?._orderSensitive ?? false;\r\n const xpaths = await this.getXpathsByPoint(center, orderSensitive);\r\n const sanitized = sanitizeXpaths(xpaths);\r\n if (!sanitized.length) {\r\n debugPage('cacheFeatureForRect: no xpath found at rect %o', rect);\r\n }\r\n return {\r\n xpaths: sanitized,\r\n };\r\n } catch (error) {\r\n debugPage('cacheFeatureForRect failed: %s', error);\r\n return {\r\n xpaths: [],\r\n };\r\n }\r\n }\r\n\r\n async rectMatchesCacheFeature(feature: ElementCacheFeature): Promise<Rect> {\r\n const webFeature = feature as WebElementCacheFeature;\r\n const xpaths = sanitizeXpaths(webFeature.xpaths);\r\n\r\n for (const xpath of xpaths) {\r\n try {\r\n const elementInfo = await this.getElementInfoByXpath(xpath);\r\n if (elementInfo?.rect) {\r\n const matchedRect: Rect = {\r\n left: elementInfo.rect.left,\r\n top: elementInfo.rect.top,\r\n width: elementInfo.rect.width,\r\n height: elementInfo.rect.height,\r\n };\r\n\r\n if (this.viewportSize?.dpr) {\r\n matchedRect.dpr = this.viewportSize.dpr;\r\n }\r\n\r\n return matchedRect;\r\n }\r\n } catch (error) {\r\n debugPage(\r\n 'rectMatchesCacheFeature failed for xpath %s: %s',\r\n xpath,\r\n error,\r\n );\r\n }\r\n }\r\n\r\n throw new Error(\r\n 'No matching element rect found for the provided cache feature',\r\n );\r\n }\r\n\r\n async getElementsNodeTree() {\r\n // ref: packages/web-integration/src/playwright/ai-fixture.ts popup logic\r\n // During test execution, a new page might be opened through a connection, and the page remains confined to the same page instance.\r\n // The page may go through opening, closing, and reopening; if the page is closed, evaluate may return undefined, which can lead to errors.\r\n await this.waitForNavigation();\r\n const scripts = await getExtraReturnLogic(true);\r\n assert(scripts, 'scripts should be set before writing report in browser');\r\n const startTime = Date.now();\r\n const captureElementSnapshot = await this.evaluate(scripts);\r\n const endTime = Date.now();\r\n debugPage(`getElementsNodeTree end, cost: ${endTime - startTime}ms`);\r\n return captureElementSnapshot as ElementTreeNode<ElementInfo>;\r\n }\r\n\r\n async size(): Promise<Size> {\r\n if (this.viewportSize) return this.viewportSize;\r\n const sizeInfo: Size = await this.evaluate(() => {\r\n return {\r\n width: document.documentElement.clientWidth,\r\n height: document.documentElement.clientHeight,\r\n dpr: window.devicePixelRatio,\r\n };\r\n });\r\n this.viewportSize = sizeInfo;\r\n return sizeInfo;\r\n }\r\n\r\n async screenshotBase64(): Promise<string> {\r\n const imgType = 'jpeg';\r\n const quality = 90;\r\n await this.waitForNavigation();\r\n const startTime = Date.now();\r\n debugPage('screenshotBase64 begin');\r\n\r\n let base64: string;\r\n if (this.interfaceType === 'puppeteer') {\r\n const result = await (this.underlyingPage as PuppeteerPage).screenshot({\r\n type: imgType,\r\n quality,\r\n encoding: 'base64',\r\n });\r\n base64 = createImgBase64ByFormat(imgType, result);\r\n } else if (this.interfaceType === 'playwright') {\r\n const buffer = await (this.underlyingPage as PlaywrightPage).screenshot({\r\n type: imgType,\r\n quality,\r\n timeout: 10 * 1000,\r\n });\r\n base64 = createImgBase64ByFormat(imgType, buffer.toString('base64'));\r\n } else {\r\n throw new Error('Unsupported page type for screenshot');\r\n }\r\n const endTime = Date.now();\r\n debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);\r\n return base64;\r\n }\r\n\r\n async url(): Promise<string> {\r\n return this.underlyingPage.url();\r\n }\r\n\r\n describe(): string {\r\n const url = this.underlyingPage.url();\r\n return url || '';\r\n }\r\n\r\n get mouse() {\r\n return {\r\n click: async (\r\n x: number,\r\n y: number,\r\n options?: { button?: MouseButton; count?: number },\r\n ) => {\r\n await this.mouse.move(x, y);\r\n const { button = 'left', count = 1 } = options || {};\r\n debugPage(`mouse click ${x}, ${y}, ${button}, ${count}`);\r\n\r\n if (count === 2 && this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.dblclick(x, y, {\r\n button,\r\n });\r\n } else {\r\n if (this.interfaceType === 'puppeteer') {\r\n if (button === 'left' && count === 1) {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y);\r\n } else {\r\n await (this.underlyingPage as PuppeteerPage).mouse.click(x, y, {\r\n button,\r\n count,\r\n });\r\n }\r\n } else if (this.interfaceType === 'playwright') {\r\n (this.underlyingPage as PlaywrightPage).mouse.click(x, y, {\r\n button,\r\n clickCount: count,\r\n });\r\n }\r\n }\r\n },\r\n wheel: async (deltaX: number, deltaY: number) => {\r\n debugPage(`mouse wheel ${deltaX}, ${deltaY}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).mouse.wheel({\r\n deltaX,\r\n deltaY,\r\n });\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).mouse.wheel(\r\n deltaX,\r\n deltaY,\r\n );\r\n }\r\n },\r\n move: async (x: number, y: number) => {\r\n this.everMoved = true;\r\n debugPage(`mouse move to ${x}, ${y}`);\r\n return this.underlyingPage.mouse.move(x, y);\r\n },\r\n drag: async (\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n ) => {\r\n debugPage(\r\n `begin mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(\r\n from.x,\r\n from.y,\r\n );\r\n await sleep(200);\r\n await (this.underlyingPage as PlaywrightPage).mouse.down();\r\n await sleep(300);\r\n await (this.underlyingPage as PlaywrightPage).mouse.move(to.x, to.y);\r\n await sleep(500);\r\n await (this.underlyingPage as PlaywrightPage).mouse.up();\r\n await sleep(200);\r\n debugPage(\r\n `end mouse drag from ${from.x}, ${from.y} to ${to.x}, ${to.y}`,\r\n );\r\n },\r\n };\r\n }\r\n\r\n get keyboard() {\r\n return {\r\n type: async (text: string) => {\r\n debugPage(`keyboard type ${text}`);\r\n return this.underlyingPage.keyboard.type(text, { delay: 80 });\r\n },\r\n press: async (\r\n action:\r\n | { key: KeyInput; command?: string }\r\n | { key: KeyInput; command?: string }[],\r\n ) => {\r\n const keys = Array.isArray(action) ? action : [action];\r\n debugPage('keyboard press', keys);\r\n for (const k of keys) {\r\n const commands = k.command ? [k.command] : [];\r\n await this.underlyingPage.keyboard.down(k.key, { commands });\r\n }\r\n for (const k of [...keys].reverse()) {\r\n await this.underlyingPage.keyboard.up(k.key);\r\n }\r\n },\r\n down: async (key: KeyInput) => {\r\n debugPage(`keyboard down ${key}`);\r\n return this.underlyingPage.keyboard.down(key);\r\n },\r\n up: async (key: KeyInput) => {\r\n debugPage(`keyboard up ${key}`);\r\n return this.underlyingPage.keyboard.up(key);\r\n },\r\n };\r\n }\r\n\r\n async clearInput(element: ElementInfo): Promise<void> {\r\n if (!element) {\r\n console.warn('No element to clear input');\r\n return;\r\n }\r\n\r\n const backspace = async () => {\r\n await sleep(100);\r\n await this.keyboard.press([{ key: 'Backspace' }]);\r\n };\r\n\r\n const isMac = process.platform === 'darwin';\r\n debugPage('clearInput begin');\r\n if (isMac) {\r\n if (this.interfaceType === 'puppeteer') {\r\n // https://github.com/segment-boneyard/nightmare/issues/810#issuecomment-452669866\r\n await this.mouse.click(element.center[0], element.center[1], {\r\n count: 3,\r\n });\r\n await backspace();\r\n }\r\n\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Meta');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Meta');\r\n await backspace();\r\n } else {\r\n await this.mouse.click(element.center[0], element.center[1]);\r\n await this.underlyingPage.keyboard.down('Control');\r\n await this.underlyingPage.keyboard.press('a');\r\n await this.underlyingPage.keyboard.up('Control');\r\n await backspace();\r\n }\r\n debugPage('clearInput end');\r\n }\r\n\r\n private everMoved = false;\r\n private async moveToPointBeforeScroll(point?: Point): Promise<void> {\r\n if (point) {\r\n await this.mouse.move(point.left, point.top);\r\n } else if (!this.everMoved) {\r\n // If the mouse has never moved, move it to the center of the page\r\n const size = await this.size();\r\n const targetX = Math.floor(size.width / 2);\r\n const targetY = Math.floor(size.height / 2);\r\n await this.mouse.move(targetX, targetY);\r\n }\r\n }\r\n\r\n async scrollUntilTop(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -9999999);\r\n }\r\n\r\n async scrollUntilBottom(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, 9999999);\r\n }\r\n\r\n async scrollUntilLeft(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-9999999, 0);\r\n }\r\n\r\n async scrollUntilRight(startingPoint?: Point): Promise<void> {\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(9999999, 0);\r\n }\r\n\r\n async scrollUp(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, -scrollDistance);\r\n }\r\n\r\n async scrollDown(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerHeight = await this.evaluate(() => window.innerHeight);\r\n const scrollDistance = distance || innerHeight * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(0, scrollDistance);\r\n }\r\n\r\n async scrollLeft(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(-scrollDistance, 0);\r\n }\r\n\r\n async scrollRight(distance?: number, startingPoint?: Point): Promise<void> {\r\n const innerWidth = await this.evaluate(() => window.innerWidth);\r\n const scrollDistance = distance || innerWidth * 0.7;\r\n await this.moveToPointBeforeScroll(startingPoint);\r\n return this.mouse.wheel(scrollDistance, 0);\r\n }\r\n\r\n async navigate(url: string): Promise<void> {\r\n debugPage(`navigate to ${url}`);\r\n if (this.interfaceType === 'puppeteer') {\r\n await (this.underlyingPage as PuppeteerPage).goto(url);\r\n } else if (this.interfaceType === 'playwright') {\r\n await (this.underlyingPage as PlaywrightPage).goto(url);\r\n } else {\r\n throw new Error('Unsupported page type for navigate');\r\n }\r\n }\r\n\r\n async beforeInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onBeforeInvokeAction) {\r\n await this.onBeforeInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async afterInvokeAction(name: string, param: any): Promise<void> {\r\n await Promise.all([this.waitForNavigation(), this.waitForNetworkIdle()]);\r\n if (this.onAfterInvokeAction) {\r\n await this.onAfterInvokeAction(name, param);\r\n }\r\n }\r\n\r\n async destroy(): Promise<void> {}\r\n\r\n async getContext(): Promise<UIContext> {\r\n return await WebPageContextParser(this, {});\r\n }\r\n async swipe(\r\n from: { x: number; y: number },\r\n to: { x: number; y: number },\r\n duration?: number,\r\n ) {\r\n const LONG_PRESS_THRESHOLD = 500;\r\n const MIN_PRESS_THRESHOLD = 150;\r\n duration = duration || 100;\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n debugPage(\r\n `mouse swipe from ${from.x}, ${from.y} to ${to.x}, ${to.y} with duration ${duration}ms`,\r\n );\r\n\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down({ button: 'left' });\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(from.x, from.y);\r\n await page.mouse.down();\r\n\r\n const steps = 30;\r\n const delay = duration / steps;\r\n for (let i = 1; i <= steps; i++) {\r\n const x = from.x + (to.x - from.x) * (i / steps);\r\n const y = from.y + (to.y - from.y) * (i / steps);\r\n await page.mouse.move(x, y);\r\n await page.waitForTimeout(delay);\r\n }\r\n\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n async longPress(x: number, y: number, duration?: number) {\r\n duration = duration || 500;\r\n const LONG_PRESS_THRESHOLD = 600;\r\n const MIN_PRESS_THRESHOLD = 300;\r\n if (duration > LONG_PRESS_THRESHOLD) {\r\n duration = LONG_PRESS_THRESHOLD;\r\n }\r\n if (duration < MIN_PRESS_THRESHOLD) {\r\n duration = MIN_PRESS_THRESHOLD;\r\n }\r\n debugPage(`mouse longPress at ${x}, ${y} for ${duration}ms`);\r\n if (this.interfaceType === 'puppeteer') {\r\n const page = this.underlyingPage as PuppeteerPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await new Promise((res) => setTimeout(res, duration));\r\n await page.mouse.up({ button: 'left' });\r\n } else if (this.interfaceType === 'playwright') {\r\n const page = this.underlyingPage as PlaywrightPage;\r\n await page.mouse.move(x, y);\r\n await page.mouse.down({ button: 'left' });\r\n await page.waitForTimeout(duration);\r\n await page.mouse.up({ button: 'left' });\r\n }\r\n }\r\n}\r\n\r\nexport function forceClosePopup(\r\n page: PuppeteerPage | PlaywrightPage,\r\n debugProfile: DebugFunction,\r\n) {\r\n page.on('popup', async (popup) => {\r\n if (!popup) {\r\n console.warn('got a popup event, but the popup is not ready yet, skip');\r\n return;\r\n }\r\n const url = await (popup as PuppeteerPage).url();\r\n console.log(`Popup opened: ${url}`);\r\n if (!(popup as PuppeteerPage).isClosed()) {\r\n try {\r\n await (popup as PuppeteerPage).close(); // Close the newly opened TAB\r\n } catch (error) {\r\n debugProfile(`failed to close popup ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`popup is already closed, skip close ${url}`);\r\n }\r\n\r\n if (!page.isClosed()) {\r\n try {\r\n await page.goto(url);\r\n } catch (error) {\r\n debugProfile(`failed to goto ${url}, error: ${error}`);\r\n }\r\n } else {\r\n debugProfile(`page is already closed, skip goto ${url}`);\r\n }\r\n });\r\n}\r\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","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/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.16",
|
|
12
12
|
"repository": "https://github.com/qa-nparekh/midscene",
|
|
13
13
|
"homepage": "https://sqai.tech/",
|
|
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
|
-
"@sqaitech/
|
|
116
|
-
"@sqaitech/shared": "0.30.
|
|
117
|
-
"@sqaitech/
|
|
115
|
+
"@sqaitech/playground": "0.30.16",
|
|
116
|
+
"@sqaitech/shared": "0.30.16",
|
|
117
|
+
"@sqaitech/core": "0.30.16"
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
120
|
"@types/js-yaml": "4.0.9",
|