@godscene/web 1.7.11
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/README.md +7 -0
- package/bin/midscene-playground +3 -0
- package/bin/midscene-web +2 -0
- package/dist/es/bin.mjs +14 -0
- package/dist/es/bridge-mode/agent-cli-side.mjs +135 -0
- package/dist/es/bridge-mode/browser.mjs +2 -0
- package/dist/es/bridge-mode/common.mjs +41 -0
- package/dist/es/bridge-mode/index.mjs +4 -0
- package/dist/es/bridge-mode/io-client.mjs +99 -0
- package/dist/es/bridge-mode/io-server.mjs +218 -0
- package/dist/es/bridge-mode/page-browser-side.mjs +119 -0
- package/dist/es/cdp-proxy-constants.mjs +7 -0
- package/dist/es/cdp-proxy-manager.mjs +217 -0
- package/dist/es/cdp-proxy.mjs +151 -0
- package/dist/es/cdp-target-store.mjs +26 -0
- package/dist/es/chrome-extension/agent.mjs +8 -0
- package/dist/es/chrome-extension/cdpInput.mjs +172 -0
- package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
- package/dist/es/chrome-extension/dynamic-scripts.mjs +36 -0
- package/dist/es/chrome-extension/index.mjs +5 -0
- package/dist/es/chrome-extension/page.mjs +733 -0
- package/dist/es/cli-options.mjs +97 -0
- package/dist/es/cli.mjs +26 -0
- package/dist/es/common/cache-helper.mjs +26 -0
- package/dist/es/common/viewport.mjs +36 -0
- package/dist/es/index.mjs +8 -0
- package/dist/es/mcp-server.mjs +33 -0
- package/dist/es/mcp-tools-cdp.mjs +164 -0
- package/dist/es/mcp-tools-puppeteer.mjs +246 -0
- package/dist/es/mcp-tools.mjs +81 -0
- package/dist/es/platform.mjs +37 -0
- package/dist/es/playwright/ai-fixture.mjs +364 -0
- package/dist/es/playwright/index.mjs +36 -0
- package/dist/es/playwright/page.mjs +42 -0
- package/dist/es/playwright/reporter/index.mjs +178 -0
- package/dist/es/puppeteer/agent-launcher.mjs +172 -0
- package/dist/es/puppeteer/base-page.mjs +830 -0
- package/dist/es/puppeteer/index.mjs +35 -0
- package/dist/es/puppeteer/page.mjs +7 -0
- package/dist/es/static/index.mjs +3 -0
- package/dist/es/static/static-agent.mjs +10 -0
- package/dist/es/static/static-page.mjs +123 -0
- package/dist/es/utils.mjs +6 -0
- package/dist/es/web-element.mjs +57 -0
- package/dist/es/web-page.mjs +272 -0
- package/dist/lib/bin.js +20 -0
- package/dist/lib/bridge-mode/agent-cli-side.js +172 -0
- package/dist/lib/bridge-mode/browser.js +36 -0
- package/dist/lib/bridge-mode/common.js +105 -0
- package/dist/lib/bridge-mode/index.js +44 -0
- package/dist/lib/bridge-mode/io-client.js +133 -0
- package/dist/lib/bridge-mode/io-server.js +255 -0
- package/dist/lib/bridge-mode/page-browser-side.js +163 -0
- package/dist/lib/cdp-proxy-constants.js +50 -0
- package/dist/lib/cdp-proxy-manager.js +273 -0
- package/dist/lib/cdp-proxy.js +179 -0
- package/dist/lib/cdp-target-store.js +66 -0
- package/dist/lib/chrome-extension/agent.js +42 -0
- package/dist/lib/chrome-extension/cdpInput.js +206 -0
- package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
- package/dist/lib/chrome-extension/dynamic-scripts.js +86 -0
- package/dist/lib/chrome-extension/index.js +58 -0
- package/dist/lib/chrome-extension/page.js +767 -0
- package/dist/lib/cli-options.js +131 -0
- package/dist/lib/cli.js +54 -0
- package/dist/lib/common/cache-helper.js +66 -0
- package/dist/lib/common/viewport.js +88 -0
- package/dist/lib/index.js +66 -0
- package/dist/lib/mcp-server.js +73 -0
- package/dist/lib/mcp-tools-cdp.js +208 -0
- package/dist/lib/mcp-tools-puppeteer.js +296 -0
- package/dist/lib/mcp-tools.js +115 -0
- package/dist/lib/platform.js +71 -0
- package/dist/lib/playwright/ai-fixture.js +401 -0
- package/dist/lib/playwright/index.js +89 -0
- package/dist/lib/playwright/page.js +76 -0
- package/dist/lib/playwright/reporter/index.js +212 -0
- package/dist/lib/puppeteer/agent-launcher.js +240 -0
- package/dist/lib/puppeteer/base-page.js +876 -0
- package/dist/lib/puppeteer/index.js +85 -0
- package/dist/lib/puppeteer/page.js +41 -0
- package/dist/lib/static/index.js +50 -0
- package/dist/lib/static/static-agent.js +44 -0
- package/dist/lib/static/static-page.js +157 -0
- package/dist/lib/utils.js +38 -0
- package/dist/lib/web-element.js +94 -0
- package/dist/lib/web-page.js +322 -0
- package/dist/types/bin.d.ts +1 -0
- package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
- package/dist/types/bridge-mode/browser.d.ts +2 -0
- package/dist/types/bridge-mode/common.d.ts +74 -0
- package/dist/types/bridge-mode/index.d.ts +4 -0
- package/dist/types/bridge-mode/io-client.d.ts +10 -0
- package/dist/types/bridge-mode/io-server.d.ts +27 -0
- package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
- package/dist/types/cdp-proxy-constants.d.ts +4 -0
- package/dist/types/cdp-proxy-manager.d.ts +53 -0
- package/dist/types/cdp-proxy.d.ts +37 -0
- package/dist/types/cdp-target-store.d.ts +26 -0
- package/dist/types/chrome-extension/agent.d.ts +4 -0
- package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
- package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
- package/dist/types/chrome-extension/index.d.ts +5 -0
- package/dist/types/chrome-extension/page.d.ts +120 -0
- package/dist/types/cli-options.d.ts +8 -0
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/common/cache-helper.d.ts +20 -0
- package/dist/types/common/viewport.d.ts +17 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/mcp-server.d.ts +26 -0
- package/dist/types/mcp-tools-cdp.d.ts +23 -0
- package/dist/types/mcp-tools-puppeteer.d.ts +23 -0
- package/dist/types/mcp-tools.d.ts +14 -0
- package/dist/types/platform.d.ts +10 -0
- package/dist/types/playwright/ai-fixture.d.ts +133 -0
- package/dist/types/playwright/index.d.ts +13 -0
- package/dist/types/playwright/page.d.ts +11 -0
- package/dist/types/playwright/reporter/index.d.ts +28 -0
- package/dist/types/puppeteer/agent-launcher.d.ts +59 -0
- package/dist/types/puppeteer/base-page.d.ts +123 -0
- package/dist/types/puppeteer/index.d.ts +11 -0
- package/dist/types/puppeteer/page.d.ts +6 -0
- package/dist/types/static/index.d.ts +2 -0
- package/dist/types/static/static-agent.d.ts +5 -0
- package/dist/types/static/static-page.d.ts +46 -0
- package/dist/types/utils.d.ts +6 -0
- package/dist/types/web-element.d.ts +48 -0
- package/dist/types/web-page.d.ts +69 -0
- package/package.json +173 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
PlaywrightAiFixture: ()=>PlaywrightAiFixture,
|
|
28
|
+
midsceneDumpAnnotationId: ()=>midsceneDumpAnnotationId
|
|
29
|
+
});
|
|
30
|
+
const external_index_js_namespaceObject = require("./index.js");
|
|
31
|
+
const utils_namespaceObject = require("@godscene/core/utils");
|
|
32
|
+
const constants_namespaceObject = require("@godscene/shared/constants");
|
|
33
|
+
const logger_namespaceObject = require("@godscene/shared/logger");
|
|
34
|
+
const shared_utils_namespaceObject = require("@godscene/shared/utils");
|
|
35
|
+
const test_namespaceObject = require("@playwright/test");
|
|
36
|
+
const debugPage = (0, logger_namespaceObject.getDebug)('web:playwright:ai-fixture');
|
|
37
|
+
const groupAndCaseForTest = (testInfo)=>{
|
|
38
|
+
let taskFile;
|
|
39
|
+
let taskTitle;
|
|
40
|
+
const titlePath = [
|
|
41
|
+
...testInfo.titlePath
|
|
42
|
+
];
|
|
43
|
+
if (titlePath.length > 1) {
|
|
44
|
+
taskFile = titlePath.shift() || 'unnamed';
|
|
45
|
+
taskTitle = titlePath.join('__');
|
|
46
|
+
} else if (1 === titlePath.length) {
|
|
47
|
+
taskTitle = titlePath[0];
|
|
48
|
+
taskFile = `${taskTitle}`;
|
|
49
|
+
} else {
|
|
50
|
+
taskTitle = 'unnamed';
|
|
51
|
+
taskFile = 'unnamed';
|
|
52
|
+
}
|
|
53
|
+
const taskTitleWithRetry = `${taskTitle}${testInfo.retry ? `(retry #${testInfo.retry})` : ''}`;
|
|
54
|
+
return {
|
|
55
|
+
file: taskFile,
|
|
56
|
+
id: (0, shared_utils_namespaceObject.replaceIllegalPathCharsAndSpace)(`${taskFile}(${taskTitle})`),
|
|
57
|
+
title: (0, shared_utils_namespaceObject.replaceIllegalPathCharsAndSpace)(taskTitleWithRetry)
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const midsceneAgentKeyId = '_midsceneAgentId';
|
|
61
|
+
const midsceneDumpAnnotationId = 'MIDSCENE_DUMP_ANNOTATION';
|
|
62
|
+
const PlaywrightAiFixture = (options)=>{
|
|
63
|
+
const { forceSameTabNavigation = true, waitForNetworkIdleTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT, waitForNavigationTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT, cache, ...sharedAgentOptions } = options ?? {};
|
|
64
|
+
const processTestCacheConfig = (testInfo)=>{
|
|
65
|
+
const { id } = groupAndCaseForTest(testInfo);
|
|
66
|
+
return (0, utils_namespaceObject.processCacheConfig)(cache, id);
|
|
67
|
+
};
|
|
68
|
+
const pageAgentMap = {};
|
|
69
|
+
const testAgentRecords = new Map();
|
|
70
|
+
const getAgentRecordsForTest = (testInfo)=>{
|
|
71
|
+
let records = testAgentRecords.get(testInfo.testId);
|
|
72
|
+
if (!records) {
|
|
73
|
+
records = new Map();
|
|
74
|
+
testAgentRecords.set(testInfo.testId, records);
|
|
75
|
+
}
|
|
76
|
+
return records;
|
|
77
|
+
};
|
|
78
|
+
const setReportAnnotation = (testInfo, reportPaths)=>{
|
|
79
|
+
testInfo.annotations = testInfo.annotations.filter((item)=>item.type !== midsceneDumpAnnotationId);
|
|
80
|
+
for (const reportPath of reportPaths)testInfo.annotations.push({
|
|
81
|
+
type: midsceneDumpAnnotationId,
|
|
82
|
+
description: reportPath
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
const finalizeAgentRecord = async (record)=>{
|
|
86
|
+
if (!record.finalizePromise) record.finalizePromise = (async ()=>{
|
|
87
|
+
await record.agent.destroy();
|
|
88
|
+
const reportPath = record.agent.reportFile || void 0;
|
|
89
|
+
record.finalReportPath = reportPath;
|
|
90
|
+
return reportPath;
|
|
91
|
+
})();
|
|
92
|
+
return await record.finalizePromise;
|
|
93
|
+
};
|
|
94
|
+
const createOrReuseAgentForPage = (page, testInfo, opts)=>{
|
|
95
|
+
let idForPage = page[midsceneAgentKeyId];
|
|
96
|
+
if (!idForPage) {
|
|
97
|
+
idForPage = (0, shared_utils_namespaceObject.uuid)();
|
|
98
|
+
page[midsceneAgentKeyId] = idForPage;
|
|
99
|
+
const { file, title } = groupAndCaseForTest(testInfo);
|
|
100
|
+
const cacheConfig = processTestCacheConfig(testInfo);
|
|
101
|
+
const reportTag = `playwright-${title.replace(/[\\/]/g, '-')}-${idForPage}`;
|
|
102
|
+
const agent = new external_index_js_namespaceObject.PlaywrightAgent(page, {
|
|
103
|
+
testId: reportTag,
|
|
104
|
+
reportFileName: reportTag,
|
|
105
|
+
forceSameTabNavigation,
|
|
106
|
+
cache: cacheConfig,
|
|
107
|
+
groupName: title,
|
|
108
|
+
groupDescription: file,
|
|
109
|
+
generateReport: true,
|
|
110
|
+
...sharedAgentOptions,
|
|
111
|
+
...opts
|
|
112
|
+
});
|
|
113
|
+
pageAgentMap[idForPage] = agent;
|
|
114
|
+
const records = getAgentRecordsForTest(testInfo);
|
|
115
|
+
const record = {
|
|
116
|
+
agent
|
|
117
|
+
};
|
|
118
|
+
records.set(idForPage, record);
|
|
119
|
+
page.on('close', async ()=>{
|
|
120
|
+
debugPage('page closed');
|
|
121
|
+
try {
|
|
122
|
+
await finalizeAgentRecord(record);
|
|
123
|
+
} finally{
|
|
124
|
+
delete pageAgentMap[idForPage];
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return pageAgentMap[idForPage];
|
|
129
|
+
};
|
|
130
|
+
async function generateAiFunction(options) {
|
|
131
|
+
const { page, testInfo, use, aiActionType } = options;
|
|
132
|
+
const agent = createOrReuseAgentForPage(page, testInfo, {
|
|
133
|
+
waitForNavigationTimeout,
|
|
134
|
+
waitForNetworkIdleTimeout
|
|
135
|
+
});
|
|
136
|
+
await use(async (taskPrompt, ...args)=>new Promise((resolve, reject)=>{
|
|
137
|
+
test_namespaceObject.test.step(`ai-${aiActionType} - ${JSON.stringify(taskPrompt)}`, async ()=>{
|
|
138
|
+
try {
|
|
139
|
+
const result = await agent[aiActionType].bind(agent)(taskPrompt, ...args);
|
|
140
|
+
resolve(result);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
reject(error);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
_midsceneFinalizeReports: [
|
|
149
|
+
async ({}, use, testInfo)=>{
|
|
150
|
+
await use();
|
|
151
|
+
const records = testAgentRecords.get(testInfo.testId);
|
|
152
|
+
if (!records || 0 === records.size) return;
|
|
153
|
+
const reportPaths = (await Promise.all(Array.from(records.values()).map((record)=>finalizeAgentRecord(record)))).filter((reportPath)=>Boolean(reportPath));
|
|
154
|
+
if (reportPaths.length > 0) setReportAnnotation(testInfo, reportPaths);
|
|
155
|
+
testAgentRecords.delete(testInfo.testId);
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
auto: true
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
agentForPage: async ({ page }, use, testInfo)=>{
|
|
162
|
+
await use(async (propsPage, opts)=>{
|
|
163
|
+
const cacheConfig = processTestCacheConfig(testInfo);
|
|
164
|
+
let finalCacheConfig = cacheConfig;
|
|
165
|
+
if (opts?.cache !== void 0) {
|
|
166
|
+
const userCache = opts.cache;
|
|
167
|
+
if (false === userCache) finalCacheConfig = false;
|
|
168
|
+
else if (true === userCache) {
|
|
169
|
+
const { id } = groupAndCaseForTest(testInfo);
|
|
170
|
+
finalCacheConfig = {
|
|
171
|
+
id
|
|
172
|
+
};
|
|
173
|
+
} else if ('object' == typeof userCache) if (userCache.id) finalCacheConfig = userCache;
|
|
174
|
+
else {
|
|
175
|
+
const { id } = groupAndCaseForTest(testInfo);
|
|
176
|
+
finalCacheConfig = {
|
|
177
|
+
...userCache,
|
|
178
|
+
id
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const agent = createOrReuseAgentForPage(propsPage || page, testInfo, {
|
|
183
|
+
waitForNavigationTimeout,
|
|
184
|
+
waitForNetworkIdleTimeout,
|
|
185
|
+
cache: finalCacheConfig,
|
|
186
|
+
...opts
|
|
187
|
+
});
|
|
188
|
+
return agent;
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
ai: async ({ page }, use, testInfo)=>{
|
|
192
|
+
await generateAiFunction({
|
|
193
|
+
page,
|
|
194
|
+
testInfo,
|
|
195
|
+
use,
|
|
196
|
+
aiActionType: 'ai'
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
aiAct: async ({ page }, use, testInfo)=>{
|
|
200
|
+
await generateAiFunction({
|
|
201
|
+
page,
|
|
202
|
+
testInfo,
|
|
203
|
+
use,
|
|
204
|
+
aiActionType: 'aiAct'
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
aiAction: async ({ page }, use, testInfo)=>{
|
|
208
|
+
await generateAiFunction({
|
|
209
|
+
page,
|
|
210
|
+
testInfo,
|
|
211
|
+
use,
|
|
212
|
+
aiActionType: 'aiAction'
|
|
213
|
+
});
|
|
214
|
+
},
|
|
215
|
+
aiTap: async ({ page }, use, testInfo)=>{
|
|
216
|
+
await generateAiFunction({
|
|
217
|
+
page,
|
|
218
|
+
testInfo,
|
|
219
|
+
use,
|
|
220
|
+
aiActionType: 'aiTap'
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
aiRightClick: async ({ page }, use, testInfo)=>{
|
|
224
|
+
await generateAiFunction({
|
|
225
|
+
page,
|
|
226
|
+
testInfo,
|
|
227
|
+
use,
|
|
228
|
+
aiActionType: 'aiRightClick'
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
aiDoubleClick: async ({ page }, use, testInfo)=>{
|
|
232
|
+
await generateAiFunction({
|
|
233
|
+
page,
|
|
234
|
+
testInfo,
|
|
235
|
+
use,
|
|
236
|
+
aiActionType: 'aiDoubleClick'
|
|
237
|
+
});
|
|
238
|
+
},
|
|
239
|
+
aiHover: async ({ page }, use, testInfo)=>{
|
|
240
|
+
await generateAiFunction({
|
|
241
|
+
page,
|
|
242
|
+
testInfo,
|
|
243
|
+
use,
|
|
244
|
+
aiActionType: 'aiHover'
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
aiInput: async ({ page }, use, testInfo)=>{
|
|
248
|
+
await generateAiFunction({
|
|
249
|
+
page,
|
|
250
|
+
testInfo,
|
|
251
|
+
use,
|
|
252
|
+
aiActionType: 'aiInput'
|
|
253
|
+
});
|
|
254
|
+
},
|
|
255
|
+
aiKeyboardPress: async ({ page }, use, testInfo)=>{
|
|
256
|
+
await generateAiFunction({
|
|
257
|
+
page,
|
|
258
|
+
testInfo,
|
|
259
|
+
use,
|
|
260
|
+
aiActionType: 'aiKeyboardPress'
|
|
261
|
+
});
|
|
262
|
+
},
|
|
263
|
+
aiScroll: async ({ page }, use, testInfo)=>{
|
|
264
|
+
await generateAiFunction({
|
|
265
|
+
page,
|
|
266
|
+
testInfo,
|
|
267
|
+
use,
|
|
268
|
+
aiActionType: 'aiScroll'
|
|
269
|
+
});
|
|
270
|
+
},
|
|
271
|
+
aiQuery: async ({ page }, use, testInfo)=>{
|
|
272
|
+
await generateAiFunction({
|
|
273
|
+
page,
|
|
274
|
+
testInfo,
|
|
275
|
+
use,
|
|
276
|
+
aiActionType: 'aiQuery'
|
|
277
|
+
});
|
|
278
|
+
},
|
|
279
|
+
aiAssert: async ({ page }, use, testInfo)=>{
|
|
280
|
+
await generateAiFunction({
|
|
281
|
+
page,
|
|
282
|
+
testInfo,
|
|
283
|
+
use,
|
|
284
|
+
aiActionType: 'aiAssert'
|
|
285
|
+
});
|
|
286
|
+
},
|
|
287
|
+
aiWaitFor: async ({ page }, use, testInfo)=>{
|
|
288
|
+
await generateAiFunction({
|
|
289
|
+
page,
|
|
290
|
+
testInfo,
|
|
291
|
+
use,
|
|
292
|
+
aiActionType: 'aiWaitFor'
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
aiLocate: async ({ page }, use, testInfo)=>{
|
|
296
|
+
await generateAiFunction({
|
|
297
|
+
page,
|
|
298
|
+
testInfo,
|
|
299
|
+
use,
|
|
300
|
+
aiActionType: 'aiLocate'
|
|
301
|
+
});
|
|
302
|
+
},
|
|
303
|
+
aiNumber: async ({ page }, use, testInfo)=>{
|
|
304
|
+
await generateAiFunction({
|
|
305
|
+
page,
|
|
306
|
+
testInfo,
|
|
307
|
+
use,
|
|
308
|
+
aiActionType: 'aiNumber'
|
|
309
|
+
});
|
|
310
|
+
},
|
|
311
|
+
aiString: async ({ page }, use, testInfo)=>{
|
|
312
|
+
await generateAiFunction({
|
|
313
|
+
page,
|
|
314
|
+
testInfo,
|
|
315
|
+
use,
|
|
316
|
+
aiActionType: 'aiString'
|
|
317
|
+
});
|
|
318
|
+
},
|
|
319
|
+
aiBoolean: async ({ page }, use, testInfo)=>{
|
|
320
|
+
await generateAiFunction({
|
|
321
|
+
page,
|
|
322
|
+
testInfo,
|
|
323
|
+
use,
|
|
324
|
+
aiActionType: 'aiBoolean'
|
|
325
|
+
});
|
|
326
|
+
},
|
|
327
|
+
aiAsk: async ({ page }, use, testInfo)=>{
|
|
328
|
+
await generateAiFunction({
|
|
329
|
+
page,
|
|
330
|
+
testInfo,
|
|
331
|
+
use,
|
|
332
|
+
aiActionType: 'aiAsk'
|
|
333
|
+
});
|
|
334
|
+
},
|
|
335
|
+
runYaml: async ({ page }, use, testInfo)=>{
|
|
336
|
+
await generateAiFunction({
|
|
337
|
+
page,
|
|
338
|
+
testInfo,
|
|
339
|
+
use,
|
|
340
|
+
aiActionType: 'runYaml'
|
|
341
|
+
});
|
|
342
|
+
},
|
|
343
|
+
setAIActionContext: async ({ page }, use, testInfo)=>{
|
|
344
|
+
await generateAiFunction({
|
|
345
|
+
page,
|
|
346
|
+
testInfo,
|
|
347
|
+
use,
|
|
348
|
+
aiActionType: 'setAIActionContext'
|
|
349
|
+
});
|
|
350
|
+
},
|
|
351
|
+
evaluateJavaScript: async ({ page }, use, testInfo)=>{
|
|
352
|
+
await generateAiFunction({
|
|
353
|
+
page,
|
|
354
|
+
testInfo,
|
|
355
|
+
use,
|
|
356
|
+
aiActionType: 'evaluateJavaScript'
|
|
357
|
+
});
|
|
358
|
+
},
|
|
359
|
+
recordToReport: async ({ page }, use, testInfo)=>{
|
|
360
|
+
await generateAiFunction({
|
|
361
|
+
page,
|
|
362
|
+
testInfo,
|
|
363
|
+
use,
|
|
364
|
+
aiActionType: 'recordToReport'
|
|
365
|
+
});
|
|
366
|
+
},
|
|
367
|
+
logScreenshot: async ({ page }, use, testInfo)=>{
|
|
368
|
+
await generateAiFunction({
|
|
369
|
+
page,
|
|
370
|
+
testInfo,
|
|
371
|
+
use,
|
|
372
|
+
aiActionType: 'logScreenshot'
|
|
373
|
+
});
|
|
374
|
+
},
|
|
375
|
+
freezePageContext: async ({ page }, use, testInfo)=>{
|
|
376
|
+
await generateAiFunction({
|
|
377
|
+
page,
|
|
378
|
+
testInfo,
|
|
379
|
+
use,
|
|
380
|
+
aiActionType: 'freezePageContext'
|
|
381
|
+
});
|
|
382
|
+
},
|
|
383
|
+
unfreezePageContext: async ({ page }, use, testInfo)=>{
|
|
384
|
+
await generateAiFunction({
|
|
385
|
+
page,
|
|
386
|
+
testInfo,
|
|
387
|
+
use,
|
|
388
|
+
aiActionType: 'unfreezePageContext'
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
|
|
394
|
+
exports.midsceneDumpAnnotationId = __webpack_exports__.midsceneDumpAnnotationId;
|
|
395
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
396
|
+
"PlaywrightAiFixture",
|
|
397
|
+
"midsceneDumpAnnotationId"
|
|
398
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
399
|
+
Object.defineProperty(exports, '__esModule', {
|
|
400
|
+
value: true
|
|
401
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
14
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: definition[key]
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
})();
|
|
20
|
+
(()=>{
|
|
21
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
22
|
+
})();
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.r = (exports1)=>{
|
|
25
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
26
|
+
value: 'Module'
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
29
|
+
value: true
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
})();
|
|
33
|
+
var __webpack_exports__ = {};
|
|
34
|
+
__webpack_require__.r(__webpack_exports__);
|
|
35
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
+
PlaywrightAiFixture: ()=>external_ai_fixture_js_namespaceObject.PlaywrightAiFixture,
|
|
37
|
+
PlaywrightWebPage: ()=>external_page_js_namespaceObject.WebPage,
|
|
38
|
+
overrideAIConfig: ()=>env_namespaceObject.overrideAIConfig,
|
|
39
|
+
PlaywrightAgent: ()=>PlaywrightAgent
|
|
40
|
+
});
|
|
41
|
+
const agent_namespaceObject = require("@godscene/core/agent");
|
|
42
|
+
const external_page_js_namespaceObject = require("./page.js");
|
|
43
|
+
const external_ai_fixture_js_namespaceObject = require("./ai-fixture.js");
|
|
44
|
+
const env_namespaceObject = require("@godscene/shared/env");
|
|
45
|
+
const logger_namespaceObject = require("@godscene/shared/logger");
|
|
46
|
+
const external_semver_namespaceObject = require("semver");
|
|
47
|
+
var external_semver_default = /*#__PURE__*/ __webpack_require__.n(external_semver_namespaceObject);
|
|
48
|
+
const base_page_js_namespaceObject = require("../puppeteer/base-page.js");
|
|
49
|
+
const external_utils_js_namespaceObject = require("../utils.js");
|
|
50
|
+
const debug = (0, logger_namespaceObject.getDebug)('playwright:agent');
|
|
51
|
+
function getPlaywrightVersion() {
|
|
52
|
+
try {
|
|
53
|
+
const playwrightPkg = (0, external_utils_js_namespaceObject.getWebpackRequire)()('playwright/package.json');
|
|
54
|
+
return playwrightPkg.version || null;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error('[midscene:error] Failed to get Playwright version', error);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
class PlaywrightAgent extends agent_namespaceObject.Agent {
|
|
61
|
+
isRetryableContextError(error) {
|
|
62
|
+
return error instanceof Error && base_page_js_namespaceObject.BROWSER_NAVIGATION_ERROR_PATTERN.test(error.message);
|
|
63
|
+
}
|
|
64
|
+
constructor(page, opts){
|
|
65
|
+
if (!page) throw new Error('[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.');
|
|
66
|
+
const webPage = new external_page_js_namespaceObject.WebPage(page, opts);
|
|
67
|
+
super(webPage, opts);
|
|
68
|
+
const { forceSameTabNavigation = true, forceChromeSelectRendering } = opts ?? {};
|
|
69
|
+
if (forceSameTabNavigation) (0, base_page_js_namespaceObject.forceClosePopup)(page, debug);
|
|
70
|
+
if (forceChromeSelectRendering) {
|
|
71
|
+
const playwrightVersion = getPlaywrightVersion();
|
|
72
|
+
if (playwrightVersion && !external_semver_default().gte(playwrightVersion, '1.52.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`);
|
|
73
|
+
(0, base_page_js_namespaceObject.forceChromeSelectRendering)(page);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
|
|
78
|
+
exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
|
|
79
|
+
exports.PlaywrightWebPage = __webpack_exports__.PlaywrightWebPage;
|
|
80
|
+
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
81
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
82
|
+
"PlaywrightAgent",
|
|
83
|
+
"PlaywrightAiFixture",
|
|
84
|
+
"PlaywrightWebPage",
|
|
85
|
+
"overrideAIConfig"
|
|
86
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
87
|
+
Object.defineProperty(exports, '__esModule', {
|
|
88
|
+
value: true
|
|
89
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
WebPage: ()=>WebPage
|
|
28
|
+
});
|
|
29
|
+
const base_page_js_namespaceObject = require("../puppeteer/base-page.js");
|
|
30
|
+
function _define_property(obj, key, value) {
|
|
31
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
32
|
+
value: value,
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true
|
|
36
|
+
});
|
|
37
|
+
else obj[key] = value;
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
class WebPage extends base_page_js_namespaceObject.Page {
|
|
41
|
+
async registerFileChooserListener(handler) {
|
|
42
|
+
const page = this.underlyingPage;
|
|
43
|
+
let capturedError;
|
|
44
|
+
this.playwrightFileChooserHandler = async (chooser)=>{
|
|
45
|
+
try {
|
|
46
|
+
await handler({
|
|
47
|
+
accept: async (files)=>{
|
|
48
|
+
await chooser.setFiles(files);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
} catch (error) {
|
|
52
|
+
capturedError = error;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
page.on('filechooser', this.playwrightFileChooserHandler);
|
|
56
|
+
return {
|
|
57
|
+
dispose: ()=>{
|
|
58
|
+
if (this.playwrightFileChooserHandler) {
|
|
59
|
+
page.off('filechooser', this.playwrightFileChooserHandler);
|
|
60
|
+
this.playwrightFileChooserHandler = void 0;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
getError: ()=>capturedError
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
constructor(page, opts){
|
|
67
|
+
super(page, 'playwright', opts), _define_property(this, "playwrightFileChooserHandler", void 0);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.WebPage = __webpack_exports__.WebPage;
|
|
71
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
72
|
+
"WebPage"
|
|
73
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
74
|
+
Object.defineProperty(exports, '__esModule', {
|
|
75
|
+
value: true
|
|
76
|
+
});
|