donobu 2.18.3 → 2.18.5
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/assets/control-panel.js +7 -1
- package/dist/assets/generated/parameter-schemas.json +44 -0
- package/dist/assets/generated/version +1 -1
- package/dist/assets/page-interactions-tracker.js +27 -30
- package/dist/bindings/PageInteractionTracker.d.ts.map +1 -1
- package/dist/bindings/PageInteractionTracker.js +1 -1
- package/dist/bindings/PageInteractionTracker.js.map +1 -1
- package/dist/esm/assets/control-panel.js +7 -1
- package/dist/esm/assets/generated/parameter-schemas.json +44 -0
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/assets/page-interactions-tracker.js +27 -30
- package/dist/esm/bindings/PageInteractionTracker.d.ts.map +1 -1
- package/dist/esm/bindings/PageInteractionTracker.js +1 -1
- package/dist/esm/bindings/PageInteractionTracker.js.map +1 -1
- package/dist/esm/lib/testExtension.d.ts.map +1 -1
- package/dist/esm/lib/testExtension.js +9 -9
- package/dist/esm/lib/testExtension.js.map +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/esm/managers/CodeGenerator.js +34 -1
- package/dist/esm/managers/CodeGenerator.js.map +1 -1
- package/dist/esm/managers/ControlPanel.d.ts.map +1 -1
- package/dist/esm/managers/ControlPanel.js +7 -5
- package/dist/esm/managers/ControlPanel.js.map +1 -1
- package/dist/esm/managers/DonobuFlow.d.ts +3 -4
- package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlow.js +59 -44
- package/dist/esm/managers/DonobuFlow.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +12 -12
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/ToolManager.d.ts.map +1 -1
- package/dist/esm/managers/ToolManager.js +4 -2
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/models/FlowMetadata.d.ts +52 -0
- package/dist/esm/models/FlowMetadata.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistence.d.ts +11 -9
- package/dist/esm/persistence/flows/FlowsPersistence.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts +4 -5
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js +76 -77
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceFactoryImpl.js +2 -2
- package/dist/esm/persistence/flows/FlowsPersistenceFactoryImpl.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.d.ts +7 -7
- package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.js +51 -60
- package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +4 -5
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +40 -41
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceSqlite.d.ts +4 -4
- package/dist/esm/persistence/flows/FlowsPersistenceSqlite.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceSqlite.js +40 -40
- package/dist/esm/persistence/flows/FlowsPersistenceSqlite.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceSupabase.d.ts +4 -5
- package/dist/esm/persistence/flows/FlowsPersistenceSupabase.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceSupabase.js +37 -37
- package/dist/esm/persistence/flows/FlowsPersistenceSupabase.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceVolatile.d.ts +7 -7
- package/dist/esm/persistence/flows/FlowsPersistenceVolatile.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceVolatile.js +35 -33
- package/dist/esm/persistence/flows/FlowsPersistenceVolatile.js.map +1 -1
- package/dist/esm/tools/AssertPageTool.d.ts +34 -0
- package/dist/esm/tools/AssertPageTool.d.ts.map +1 -0
- package/dist/esm/tools/AssertPageTool.js +156 -0
- package/dist/esm/tools/AssertPageTool.js.map +1 -0
- package/dist/esm/tools/AssertTool.js +1 -1
- package/dist/esm/tools/AssertTool.js.map +1 -1
- package/dist/esm/tools/ClickTool.d.ts.map +1 -1
- package/dist/esm/tools/ClickTool.js +3 -0
- package/dist/esm/tools/ClickTool.js.map +1 -1
- package/dist/esm/tools/DetectBrokenLinksTool.js +1 -1
- package/dist/esm/tools/DetectBrokenLinksTool.js.map +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts +2 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts.map +1 -1
- package/dist/esm/tools/SolveMfaChallenge.js +51 -25
- package/dist/esm/tools/SolveMfaChallenge.js.map +1 -1
- package/dist/esm/utils/BrowserUtils.d.ts +52 -0
- package/dist/esm/utils/BrowserUtils.d.ts.map +1 -0
- package/dist/esm/utils/BrowserUtils.js +340 -0
- package/dist/esm/utils/BrowserUtils.js.map +1 -0
- package/dist/esm/utils/PlaywrightUtils.d.ts +15 -11
- package/dist/esm/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/esm/utils/PlaywrightUtils.js +79 -122
- package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
- package/dist/lib/autoTest.d.ts +2 -0
- package/dist/lib/autoTest.d.ts.map +1 -0
- package/dist/lib/autoTest.js +17 -0
- package/dist/lib/autoTest.js.map +1 -0
- package/dist/lib/testExtension.d.ts.map +1 -1
- package/dist/lib/testExtension.js +9 -9
- package/dist/lib/testExtension.js.map +1 -1
- package/dist/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/managers/CodeGenerator.js +34 -1
- package/dist/managers/CodeGenerator.js.map +1 -1
- package/dist/managers/ControlPanel.d.ts.map +1 -1
- package/dist/managers/ControlPanel.js +7 -5
- package/dist/managers/ControlPanel.js.map +1 -1
- package/dist/managers/DonobuFlow.d.ts +3 -4
- package/dist/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/managers/DonobuFlow.js +59 -44
- package/dist/managers/DonobuFlow.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +12 -12
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/ToolManager.d.ts.map +1 -1
- package/dist/managers/ToolManager.js +4 -2
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/models/BrowserFramework.d.ts +2 -12
- package/dist/models/BrowserFramework.d.ts.map +1 -1
- package/dist/models/BrowserFramework.js +91 -66
- package/dist/models/BrowserFramework.js.map +1 -1
- package/dist/models/FlowMetadata.d.ts +52 -0
- package/dist/models/FlowMetadata.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistence.d.ts +11 -9
- package/dist/persistence/flows/FlowsPersistence.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts +4 -5
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js +76 -77
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceFactoryImpl.js +2 -2
- package/dist/persistence/flows/FlowsPersistenceFactoryImpl.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceFilesystem.d.ts +7 -7
- package/dist/persistence/flows/FlowsPersistenceFilesystem.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceFilesystem.js +51 -60
- package/dist/persistence/flows/FlowsPersistenceFilesystem.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +4 -5
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +40 -41
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceSqlite.d.ts +4 -4
- package/dist/persistence/flows/FlowsPersistenceSqlite.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceSqlite.js +40 -40
- package/dist/persistence/flows/FlowsPersistenceSqlite.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceSupabase.d.ts +4 -5
- package/dist/persistence/flows/FlowsPersistenceSupabase.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceSupabase.js +37 -37
- package/dist/persistence/flows/FlowsPersistenceSupabase.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceVolatile.d.ts +7 -7
- package/dist/persistence/flows/FlowsPersistenceVolatile.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceVolatile.js +35 -33
- package/dist/persistence/flows/FlowsPersistenceVolatile.js.map +1 -1
- package/dist/tools/AssertPageTool.d.ts +34 -0
- package/dist/tools/AssertPageTool.d.ts.map +1 -0
- package/dist/tools/AssertPageTool.js +156 -0
- package/dist/tools/AssertPageTool.js.map +1 -0
- package/dist/tools/AssertTool.js +1 -1
- package/dist/tools/AssertTool.js.map +1 -1
- package/dist/tools/ClickTool.d.ts.map +1 -1
- package/dist/tools/ClickTool.js +3 -0
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/DetectBrokenLinksTool.js +1 -1
- package/dist/tools/DetectBrokenLinksTool.js.map +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/tools/SolveMfaChallenge.d.ts +2 -1
- package/dist/tools/SolveMfaChallenge.d.ts.map +1 -1
- package/dist/tools/SolveMfaChallenge.js +51 -25
- package/dist/tools/SolveMfaChallenge.js.map +1 -1
- package/dist/utils/BrowserUtils.d.ts +52 -0
- package/dist/utils/BrowserUtils.d.ts.map +1 -0
- package/dist/utils/BrowserUtils.js +340 -0
- package/dist/utils/BrowserUtils.js.map +1 -0
- package/dist/utils/PlaywrightUtils.d.ts +15 -11
- package/dist/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/utils/PlaywrightUtils.js +79 -122
- package/dist/utils/PlaywrightUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,19 +22,22 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
|
|
|
22
22
|
if (!mfaCode) {
|
|
23
23
|
throw new Error('Could not find MFA code in emails after multiple attempts');
|
|
24
24
|
}
|
|
25
|
-
// Input the MFA code into the element
|
|
25
|
+
// Input the MFA code into the element.
|
|
26
|
+
//
|
|
27
|
+
// Note: We focus the element then send raw keyboard events rather than
|
|
28
|
+
// doing 'element.press' since some MFA systems automatically progress
|
|
29
|
+
// focus across input fields when each character is entered.
|
|
30
|
+
await element.focus();
|
|
26
31
|
for (const char of mfaCode) {
|
|
27
|
-
await
|
|
32
|
+
await context.page.current.keyboard.press(char, {
|
|
28
33
|
delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
|
|
29
|
-
timeout: 3000,
|
|
30
34
|
});
|
|
31
35
|
}
|
|
32
36
|
// Submit the form if necessary
|
|
33
37
|
try {
|
|
34
38
|
const char = 'Enter';
|
|
35
|
-
await
|
|
39
|
+
await context.page.current.keyboard.press(char, {
|
|
36
40
|
delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
|
|
37
|
-
timeout: 3000,
|
|
38
41
|
});
|
|
39
42
|
}
|
|
40
43
|
catch (_error) {
|
|
@@ -44,6 +47,7 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
|
|
|
44
47
|
return `Successfully retrieved and inputted MFA code: ${mfaCode}`;
|
|
45
48
|
}
|
|
46
49
|
async getMfaCodeFromEmails(context, gmail, waitTimeSeconds) {
|
|
50
|
+
const seenIds = new Set();
|
|
47
51
|
const startTime = Date.now();
|
|
48
52
|
const endTime = startTime + waitTimeSeconds * 1000;
|
|
49
53
|
let attempt = 0;
|
|
@@ -53,7 +57,7 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
|
|
|
53
57
|
attempt++;
|
|
54
58
|
Logger_1.appLogger.info(`Attempt ${attempt} of ${SolveMfaChallengeTool.MAX_RETRIES} to find MFA code in emails`);
|
|
55
59
|
// Get the body of the latest email for the user.
|
|
56
|
-
const emailBody = await this.
|
|
60
|
+
const emailBody = await this.fetchLatestMfaEmail(gmail, seenIds);
|
|
57
61
|
// Only process if the email body has changed.
|
|
58
62
|
if (emailBody && emailBody !== lastEmailBody) {
|
|
59
63
|
lastEmailBody = emailBody;
|
|
@@ -71,29 +75,51 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
|
|
|
71
75
|
}
|
|
72
76
|
return null;
|
|
73
77
|
}
|
|
74
|
-
async
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const res = await gmail.users.messages.list({
|
|
78
|
+
async fetchLatestMfaEmail(gmail, seenIds) {
|
|
79
|
+
const lookbackMinutes = 2;
|
|
80
|
+
const cutoff = Date.now() - lookbackMinutes * 60000;
|
|
81
|
+
const threadRes = await gmail.users.threads.list({
|
|
79
82
|
userId: 'me',
|
|
80
|
-
q:
|
|
81
|
-
|
|
83
|
+
q: 'subject:(code OR security OR authentication OR verification OR confirm OR verify) ' +
|
|
84
|
+
'is:unread in:inbox',
|
|
85
|
+
maxResults: 25,
|
|
86
|
+
fields: 'threads(id)',
|
|
82
87
|
});
|
|
83
|
-
|
|
84
|
-
|
|
88
|
+
const candidates = [];
|
|
89
|
+
for (const th of threadRes.data.threads ?? []) {
|
|
90
|
+
const t = await gmail.users.threads.get({
|
|
91
|
+
userId: 'me',
|
|
92
|
+
id: th.id,
|
|
93
|
+
format: 'metadata',
|
|
94
|
+
fields: 'messages(id,internalDate,labelIds)',
|
|
95
|
+
});
|
|
96
|
+
const m = t.data.messages.at(-1); // newest in that thread
|
|
97
|
+
if (!m || seenIds.has(m.id)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
else if (!m.labelIds?.includes('UNREAD')) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const ts = Number(m.internalDate);
|
|
104
|
+
if (ts < cutoff) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
candidates.push({ id: m.id, ts });
|
|
108
|
+
}
|
|
109
|
+
if (!candidates.length) {
|
|
85
110
|
return null;
|
|
86
111
|
}
|
|
87
|
-
|
|
88
|
-
|
|
112
|
+
const winner = candidates.sort((a, b) => b.ts - a.ts)[0];
|
|
113
|
+
seenIds.add(winner.id);
|
|
114
|
+
const full = await gmail.users.messages.get({
|
|
89
115
|
userId: 'me',
|
|
90
|
-
id:
|
|
116
|
+
id: winner.id,
|
|
91
117
|
format: 'full',
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const parts = email.
|
|
118
|
+
});
|
|
119
|
+
return this.extractBody(full.data);
|
|
120
|
+
}
|
|
121
|
+
extractBody(email) {
|
|
122
|
+
const parts = email.payload?.parts;
|
|
97
123
|
let body = '';
|
|
98
124
|
if (parts) {
|
|
99
125
|
// Try to find plain text part first
|
|
@@ -109,9 +135,9 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
|
|
|
109
135
|
}
|
|
110
136
|
}
|
|
111
137
|
}
|
|
112
|
-
else if (email.
|
|
138
|
+
else if (email.payload?.body?.data) {
|
|
113
139
|
// Handle case where email has no parts
|
|
114
|
-
body = this.decodeBase64Url(email.
|
|
140
|
+
body = this.decodeBase64Url(email.payload.body.data);
|
|
115
141
|
}
|
|
116
142
|
if (!body) {
|
|
117
143
|
Logger_1.appLogger.warn('Email found but body could not be decoded');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolveMfaChallenge.js","sourceRoot":"","sources":["../../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":";;;AAEA,mEAIiC;AACjC,kDAA+C;AAC/C,2CAAoC;AACpC,4CAA4C;AAgC5C,MAAa,qBAAsB,SAAQ,6CAI1C;IAKC;QACE,KAAK,CACH,qBAAqB,CAAC,IAAI,EAC1B,2GAA2G,EAC3G,8CAA8C,EAC9C,gDAAgD,EAChD,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAwB,EACxB,UAA+C,EAC/C,OAAgB;QAEhB,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,sBAAsB;QACtB,MAAM,YAAY,GAAG,IAAI,mBAAM,CAAC,IAAI,CAAC,MAAM,CACzC,UAAU,CAAC,aAAa,EACxB,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACF,YAAY,CAAC,cAAc,CAAC;YAC1B,aAAa,EAAE,UAAU,CAAC,iBAAiB;SAC5C,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,mBAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAElE,mCAAmC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAC7C,OAAO,EACP,KAAK,EACL,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"SolveMfaChallenge.js","sourceRoot":"","sources":["../../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BrowserContext } from 'playwright';
|
|
2
|
+
import { BrowserDevice } from '../models/BrowserDevice';
|
|
3
|
+
import { BrowserStorageState } from '../models/BrowserStorageState';
|
|
4
|
+
import { BrowserConfig } from '../models/BrowserConfig';
|
|
5
|
+
export declare class BrowserUtils {
|
|
6
|
+
private static readonly DEFAULT_DEVICE_NAME;
|
|
7
|
+
/**
|
|
8
|
+
* Loads all the pre-canned browser device configurations from the local
|
|
9
|
+
* filesystem.
|
|
10
|
+
*
|
|
11
|
+
* The returned map keys the devices by their name (ex: 'Desktop Firefox').
|
|
12
|
+
*
|
|
13
|
+
* See `assets/devices.json` for details.
|
|
14
|
+
*/
|
|
15
|
+
static getSupportedDevices(): Map<string, BrowserDevice>;
|
|
16
|
+
static create(browserConfig: BrowserConfig, outputDir: string, storageState?: BrowserStorageState): Promise<BrowserContext>;
|
|
17
|
+
/**
|
|
18
|
+
* Gets the browser storage state including cookies, localStorage, and sessionStorage.
|
|
19
|
+
*
|
|
20
|
+
* @param browserContext The browser context to extract storage state from.
|
|
21
|
+
* @returns A promise that resolves to the complete browser storage state.
|
|
22
|
+
*/
|
|
23
|
+
static getBrowserStorageState(browserContext: BrowserContext): Promise<BrowserStorageState>;
|
|
24
|
+
/**
|
|
25
|
+
* Connects to an existing Chromium browser using the Chrome DevTools Protocol (CDP) at the given
|
|
26
|
+
* URL.
|
|
27
|
+
*/
|
|
28
|
+
private static forRemoteBrowser;
|
|
29
|
+
/**
|
|
30
|
+
* If {@link storageState} is present, must be an object conforming to what is returned by
|
|
31
|
+
* {@link BrowserContext.storageState()}.
|
|
32
|
+
*/
|
|
33
|
+
private static forDevice;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a BrowserBase session. Using this method requires the
|
|
36
|
+
* BROWSERBASE_API_KEY environment variable to be set.
|
|
37
|
+
*
|
|
38
|
+
* The returned browserBaseData object conforms to the response of the session
|
|
39
|
+
* creation API endpoint. See...
|
|
40
|
+
* https://docs.browserbase.com/reference/api/create-a-session#response-id
|
|
41
|
+
*/
|
|
42
|
+
private static forBrowserBase;
|
|
43
|
+
/**
|
|
44
|
+
* Establishes a BrowserBase session. The returned structure matches the
|
|
45
|
+
* response structore from the BrowserBase session API. See...
|
|
46
|
+
* https://docs.browserbase.com/reference/api/create-a-session#response-id
|
|
47
|
+
*/
|
|
48
|
+
private static establishBrowserBaseSession;
|
|
49
|
+
private static attachSessionStorageToBrowserContext;
|
|
50
|
+
private static patchClose;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=BrowserUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/BrowserUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAA0B,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIhF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IACjE;;;;;;;OAOG;WACW,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;WAY3C,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,cAAc,CAAC;IA8E1B;;;;;OAKG;WACiB,sBAAsB,CACxC,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IA6E/B;;;OAGG;mBACkB,gBAAgB;IAiCrC;;;OAGG;mBACkB,SAAS;IAiF9B;;;;;;;OAOG;mBACkB,cAAc;IA2BnC;;;;OAIG;mBACkB,2BAA2B;mBAkC3B,oCAAoC;IA2CzD,OAAO,CAAC,MAAM,CAAC,UAAU;CAgB1B"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BrowserUtils = void 0;
|
|
7
|
+
const playwright_1 = require("playwright");
|
|
8
|
+
const JsonUtils_1 = require("./JsonUtils");
|
|
9
|
+
const InvalidParamValueException_1 = require("../exceptions/InvalidParamValueException");
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const envVars_1 = require("../envVars");
|
|
12
|
+
const Logger_1 = require("./Logger");
|
|
13
|
+
class BrowserUtils {
|
|
14
|
+
/**
|
|
15
|
+
* Loads all the pre-canned browser device configurations from the local
|
|
16
|
+
* filesystem.
|
|
17
|
+
*
|
|
18
|
+
* The returned map keys the devices by their name (ex: 'Desktop Firefox').
|
|
19
|
+
*
|
|
20
|
+
* See `assets/devices.json` for details.
|
|
21
|
+
*/
|
|
22
|
+
static getSupportedDevices() {
|
|
23
|
+
const rawDevices = JsonUtils_1.JsonUtils.readResourceAsJson(path_1.default.join('devices.json'));
|
|
24
|
+
if (!rawDevices) {
|
|
25
|
+
throw new Error('Failed to load devices configuration');
|
|
26
|
+
}
|
|
27
|
+
return new Map(Object.entries(rawDevices));
|
|
28
|
+
}
|
|
29
|
+
static async create(browserConfig, outputDir, storageState) {
|
|
30
|
+
const type = browserConfig.using.type;
|
|
31
|
+
let browser;
|
|
32
|
+
let browserContext;
|
|
33
|
+
switch (type) {
|
|
34
|
+
case 'device': {
|
|
35
|
+
({ browser, browserContext } = await BrowserUtils.forDevice(browserConfig.using.deviceName ?? BrowserUtils.DEFAULT_DEVICE_NAME, browserConfig.using.headless ?? false, outputDir, storageState));
|
|
36
|
+
BrowserUtils.patchClose(browserContext, () => browser.close());
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'remoteInstance': {
|
|
40
|
+
({ browser, browserContext } = await BrowserUtils.forRemoteBrowser(browserConfig.using.url, outputDir, storageState));
|
|
41
|
+
BrowserUtils.patchClose(browserContext, () => browser.close());
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'browserBase': {
|
|
45
|
+
let browserBaseData;
|
|
46
|
+
({ browser, browserContext, browserBaseData } =
|
|
47
|
+
await BrowserUtils.forBrowserBase(browserConfig.using.sessionArgs, outputDir, storageState));
|
|
48
|
+
BrowserUtils.patchClose(browserContext, async () => {
|
|
49
|
+
try {
|
|
50
|
+
await browser.close();
|
|
51
|
+
}
|
|
52
|
+
catch (_error) {
|
|
53
|
+
// Ignore, the browser may have already been closed and that is fine.
|
|
54
|
+
}
|
|
55
|
+
const body = {
|
|
56
|
+
projectId: browserBaseData.projectId,
|
|
57
|
+
status: 'REQUEST_RELEASE',
|
|
58
|
+
};
|
|
59
|
+
const password = process.env[envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY] ?? '';
|
|
60
|
+
const options = {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: {
|
|
63
|
+
'X-BB-API-Key': password,
|
|
64
|
+
'Content-Type': 'application/json',
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify(body),
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
await fetch(`https://api.browserbase.com/v1/sessions/${browserBaseData.id}`, options);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// Ignore, BrowserBase sessions expire automatically anyway.
|
|
73
|
+
Logger_1.appLogger.warn('Failed to release BrowserBase session', error);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
default: {
|
|
79
|
+
throw new InvalidParamValueException_1.InvalidParamValueException('type', type);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
await BrowserUtils.attachSessionStorageToBrowserContext(browserContext, storageState);
|
|
83
|
+
return browserContext;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Gets the browser storage state including cookies, localStorage, and sessionStorage.
|
|
87
|
+
*
|
|
88
|
+
* @param browserContext The browser context to extract storage state from.
|
|
89
|
+
* @returns A promise that resolves to the complete browser storage state.
|
|
90
|
+
*/
|
|
91
|
+
static async getBrowserStorageState(browserContext) {
|
|
92
|
+
let result;
|
|
93
|
+
try {
|
|
94
|
+
// First get the standard storage state (cookies and localStorage)
|
|
95
|
+
result = await browserContext.storageState({
|
|
96
|
+
indexedDB: true,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
Logger_1.appLogger.warn('Failed to get storage state with indexedDB, falling back to cookies only', error);
|
|
101
|
+
result = await browserContext.storageState({
|
|
102
|
+
indexedDB: false,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Get all pages in the context
|
|
106
|
+
const pages = browserContext.pages();
|
|
107
|
+
// Process each page to collect sessionStorage data
|
|
108
|
+
for (const page of pages) {
|
|
109
|
+
try {
|
|
110
|
+
// Get the origin for the current page
|
|
111
|
+
const pageOrigin = new URL(page.url()).origin;
|
|
112
|
+
// Find if we already have an entry for this origin
|
|
113
|
+
let originEntry = result.origins.find((entry) => entry.origin === pageOrigin);
|
|
114
|
+
// If not, create a new entry
|
|
115
|
+
if (!originEntry) {
|
|
116
|
+
originEntry = {
|
|
117
|
+
origin: pageOrigin,
|
|
118
|
+
localStorage: [],
|
|
119
|
+
sessionStorage: [],
|
|
120
|
+
};
|
|
121
|
+
result.origins.push(originEntry);
|
|
122
|
+
}
|
|
123
|
+
else if (!('sessionStorage' in originEntry)) {
|
|
124
|
+
// If the entry exists but doesn't have sessionStorage yet, add the property
|
|
125
|
+
originEntry.sessionStorage = [];
|
|
126
|
+
}
|
|
127
|
+
// Extract sessionStorage from the page
|
|
128
|
+
const sessionStorageItems = await page.evaluate(() => {
|
|
129
|
+
const items = [];
|
|
130
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
131
|
+
const name = sessionStorage.key(i);
|
|
132
|
+
if (name) {
|
|
133
|
+
items.push({
|
|
134
|
+
name,
|
|
135
|
+
value: sessionStorage.getItem(name) || '',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return items;
|
|
140
|
+
});
|
|
141
|
+
// Add sessionStorage items to the origin entry
|
|
142
|
+
originEntry.sessionStorage = sessionStorageItems;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
Logger_1.appLogger.warn(`Failed to extract sessionStorage for page: ${page.url()}`, error);
|
|
146
|
+
// Skip pages that might have navigation errors or are about:blank.
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Connects to an existing Chromium browser using the Chrome DevTools Protocol (CDP) at the given
|
|
154
|
+
* URL.
|
|
155
|
+
*/
|
|
156
|
+
static async forRemoteBrowser(remoteBrowserInstanceUrl, outputDir, storageState) {
|
|
157
|
+
try {
|
|
158
|
+
const browser = await playwright_1.chromium.connectOverCDP(remoteBrowserInstanceUrl);
|
|
159
|
+
try {
|
|
160
|
+
const contextOptions = {
|
|
161
|
+
recordVideo: { dir: outputDir },
|
|
162
|
+
};
|
|
163
|
+
if (storageState) {
|
|
164
|
+
contextOptions.storageState = storageState;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
browser: browser,
|
|
168
|
+
browserContext: await browser.newContext(contextOptions),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
await browser.close();
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (_) {
|
|
177
|
+
throw new InvalidParamValueException_1.InvalidParamValueException('remoteBrowserInstanceUrl', remoteBrowserInstanceUrl);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* If {@link storageState} is present, must be an object conforming to what is returned by
|
|
182
|
+
* {@link BrowserContext.storageState()}.
|
|
183
|
+
*/
|
|
184
|
+
static async forDevice(deviceName, headless, outputDir, storageState) {
|
|
185
|
+
const device = BrowserUtils.getSupportedDevices().get(deviceName);
|
|
186
|
+
if (!device) {
|
|
187
|
+
throw new InvalidParamValueException_1.InvalidParamValueException('deviceName', deviceName);
|
|
188
|
+
}
|
|
189
|
+
const contextOptions = {
|
|
190
|
+
userAgent: device.userAgent,
|
|
191
|
+
recordVideo: {
|
|
192
|
+
dir: outputDir,
|
|
193
|
+
size: {
|
|
194
|
+
width: device.viewport?.width ?? 1280,
|
|
195
|
+
height: device.viewport?.height ?? 720,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
viewport: {
|
|
199
|
+
width: device.viewport?.width ?? 1280,
|
|
200
|
+
height: device.viewport?.height ?? 720,
|
|
201
|
+
},
|
|
202
|
+
screen: {
|
|
203
|
+
width: device.screen?.width ?? device.viewport?.width ?? 1280,
|
|
204
|
+
height: device.screen?.height ?? device.viewport?.height ?? 720,
|
|
205
|
+
},
|
|
206
|
+
deviceScaleFactor: device.deviceScaleFactor ?? 1.0,
|
|
207
|
+
isMobile: device.isMobile ?? false,
|
|
208
|
+
hasTouch: device.hasTouch ?? false,
|
|
209
|
+
};
|
|
210
|
+
if (storageState) {
|
|
211
|
+
contextOptions.storageState = storageState;
|
|
212
|
+
}
|
|
213
|
+
const launchOptions = {
|
|
214
|
+
headless,
|
|
215
|
+
args: [
|
|
216
|
+
'--ignore-certificate-errors',
|
|
217
|
+
'--disable-blink-features=AutomationControlled',
|
|
218
|
+
],
|
|
219
|
+
};
|
|
220
|
+
let browser;
|
|
221
|
+
switch (device.defaultBrowserType.toLowerCase()) {
|
|
222
|
+
case 'firefox':
|
|
223
|
+
browser = await playwright_1.firefox.launch(launchOptions);
|
|
224
|
+
break;
|
|
225
|
+
case 'chromium':
|
|
226
|
+
browser = await playwright_1.chromium.launch(launchOptions);
|
|
227
|
+
break;
|
|
228
|
+
case 'chrome':
|
|
229
|
+
browser = await playwright_1.chromium.launch({
|
|
230
|
+
...launchOptions,
|
|
231
|
+
channel: 'chrome',
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
case 'webkit':
|
|
235
|
+
case 'ios':
|
|
236
|
+
browser = await playwright_1.webkit.launch(launchOptions);
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
throw new InvalidParamValueException_1.InvalidParamValueException('browserType', device.defaultBrowserType);
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const browserContext = await browser.newContext(contextOptions);
|
|
243
|
+
return { browser, browserContext };
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
await browser.close();
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Creates a BrowserBase session. Using this method requires the
|
|
252
|
+
* BROWSERBASE_API_KEY environment variable to be set.
|
|
253
|
+
*
|
|
254
|
+
* The returned browserBaseData object conforms to the response of the session
|
|
255
|
+
* creation API endpoint. See...
|
|
256
|
+
* https://docs.browserbase.com/reference/api/create-a-session#response-id
|
|
257
|
+
*/
|
|
258
|
+
static async forBrowserBase(sessionArgs, outputDir, storageState) {
|
|
259
|
+
const browserBaseData = await BrowserUtils.establishBrowserBaseSession(sessionArgs);
|
|
260
|
+
const browser = await playwright_1.chromium.connectOverCDP(browserBaseData.connectUrl);
|
|
261
|
+
const contextOptions = {
|
|
262
|
+
recordVideo: { dir: outputDir },
|
|
263
|
+
};
|
|
264
|
+
if (storageState) {
|
|
265
|
+
contextOptions.storageState = storageState;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
browser: browser,
|
|
269
|
+
browserContext: await browser.newContext(contextOptions),
|
|
270
|
+
browserBaseData: browserBaseData,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Establishes a BrowserBase session. The returned structure matches the
|
|
275
|
+
* response structore from the BrowserBase session API. See...
|
|
276
|
+
* https://docs.browserbase.com/reference/api/create-a-session#response-id
|
|
277
|
+
*/
|
|
278
|
+
static async establishBrowserBaseSession(sessionArgs) {
|
|
279
|
+
const password = process.env[envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY];
|
|
280
|
+
if (!password) {
|
|
281
|
+
throw new InvalidParamValueException_1.InvalidParamValueException(envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY, null);
|
|
282
|
+
}
|
|
283
|
+
const options = {
|
|
284
|
+
method: 'POST',
|
|
285
|
+
headers: { 'X-BB-API-Key': password, 'Content-Type': 'application/json' },
|
|
286
|
+
body: JSON.stringify(sessionArgs),
|
|
287
|
+
};
|
|
288
|
+
const browserBaseData = await fetch('https://api.browserbase.com/v1/sessions', options).then((response) => response.json());
|
|
289
|
+
if (browserBaseData.error) {
|
|
290
|
+
throw new InvalidParamValueException_1.InvalidParamValueException(envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY, '(redacted)', `${browserBaseData.error}: ${browserBaseData.message}`);
|
|
291
|
+
}
|
|
292
|
+
return browserBaseData;
|
|
293
|
+
}
|
|
294
|
+
static async attachSessionStorageToBrowserContext(browserContext, storageState) {
|
|
295
|
+
// Add init script to restore sessionStorage if storage state is provided
|
|
296
|
+
if (storageState && storageState.origins) {
|
|
297
|
+
// Transform the storage state to map origins to their sessionStorage
|
|
298
|
+
const sessionStorageByOrigin = {};
|
|
299
|
+
for (const origin of storageState.origins) {
|
|
300
|
+
if (origin.sessionStorage && origin.sessionStorage.length > 0) {
|
|
301
|
+
// Create a key-value map for this origin's sessionStorage
|
|
302
|
+
const sessionStorageMap = {};
|
|
303
|
+
for (const item of origin.sessionStorage) {
|
|
304
|
+
sessionStorageMap[item.name] = item.value;
|
|
305
|
+
}
|
|
306
|
+
sessionStorageByOrigin[origin.origin] = sessionStorageMap;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Add the init script to restore sessionStorage based on the page's origin
|
|
310
|
+
await browserContext.addInitScript((storageData) => {
|
|
311
|
+
// Get current origin
|
|
312
|
+
const currentOrigin = window.location.origin;
|
|
313
|
+
// Check if we have sessionStorage data for this origin
|
|
314
|
+
if (storageData[currentOrigin]) {
|
|
315
|
+
// Restore the sessionStorage items
|
|
316
|
+
for (const [key, value] of Object.entries(storageData[currentOrigin])) {
|
|
317
|
+
window.sessionStorage.setItem(key, value);
|
|
318
|
+
}
|
|
319
|
+
console.log(`Restored ${Object.keys(storageData[currentOrigin]).length} sessionStorage items for ${currentOrigin}`);
|
|
320
|
+
}
|
|
321
|
+
}, sessionStorageByOrigin);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
static patchClose(ctx, extra) {
|
|
325
|
+
const original = ctx.close.bind(ctx);
|
|
326
|
+
ctx.close = async (...args) => {
|
|
327
|
+
try {
|
|
328
|
+
await original(...args);
|
|
329
|
+
}
|
|
330
|
+
catch { }
|
|
331
|
+
try {
|
|
332
|
+
await extra();
|
|
333
|
+
}
|
|
334
|
+
catch { }
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.BrowserUtils = BrowserUtils;
|
|
339
|
+
BrowserUtils.DEFAULT_DEVICE_NAME = 'Desktop Chromium';
|
|
340
|
+
//# sourceMappingURL=BrowserUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserUtils.js","sourceRoot":"","sources":["../../../src/utils/BrowserUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,21 @@ export declare class PlaywrightUtils {
|
|
|
28
28
|
* Note that if the Donobu control panel is present in the page, it will be
|
|
29
29
|
* excluded from the screenshot.
|
|
30
30
|
*/
|
|
31
|
-
static
|
|
31
|
+
static takeViewportScreenshot(page: Page, type?: 'png' | 'jpeg'): Promise<Buffer>;
|
|
32
|
+
/**
|
|
33
|
+
* Captures up to three screenshots of the given page.
|
|
34
|
+
*
|
|
35
|
+
* - `viewport` : exact current viewport
|
|
36
|
+
* - `aboveViewport` : up to half-viewport preview just above the fold, or `null`
|
|
37
|
+
* - `belowViewport` : up to half-viewport preview just below the fold, or `null`
|
|
38
|
+
*
|
|
39
|
+
* All images are returned as JPEG buffers.
|
|
40
|
+
*/
|
|
41
|
+
static takePageScreenshots(page: Page): Promise<{
|
|
42
|
+
aboveViewport: Buffer | null;
|
|
43
|
+
viewport: Buffer;
|
|
44
|
+
belowViewport: Buffer | null;
|
|
45
|
+
}>;
|
|
32
46
|
/**
|
|
33
47
|
* Generate valid selectors for the given element. The generated selectors are
|
|
34
48
|
* in a priority order based on their ability to identify the given element.
|
|
@@ -59,15 +73,5 @@ export declare class PlaywrightUtils {
|
|
|
59
73
|
* it is logged and ignored. If page is null, this function has no effect.
|
|
60
74
|
*/
|
|
61
75
|
static waitForPageStability(page: Page | null): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
* Takes a screenshot of the webpage as if it were scrolled down by one viewport.
|
|
64
|
-
* If the page cannot be scrolled as a whole, tries to find and scroll individual
|
|
65
|
-
* scrollable elements on the page. After taking the screenshot, it reverts to
|
|
66
|
-
* the original scroll position.
|
|
67
|
-
*
|
|
68
|
-
* @param page The Playwright Page to take a screenshot of
|
|
69
|
-
* @returns An image buffer of the scrolled down view, or undefined if scrolling isn't possible
|
|
70
|
-
*/
|
|
71
|
-
static getScrolledDownScreenShot(page: Page): Promise<Buffer | undefined>;
|
|
72
76
|
}
|
|
73
77
|
//# sourceMappingURL=PlaywrightUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlD;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CACkB;IAE3E;;;;;OAKG;IACH,gBAAuB,oCAAoC,SACmB;IAE9E;;;;;;;;OAQG;WACiB,
|
|
1
|
+
{"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlD;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CACkB;IAE3E;;;;;OAKG;IACH,gBAAuB,oCAAoC,SACmB;IAE9E;;;;;;;;OAQG;WACiB,sBAAsB,CACxC,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,KAAK,GAAG,MAAe,GAC5B,OAAO,CAAC,MAAM,CAAC;IAgBlB;;;;;;;;OAQG;WACiB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAC3D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IAwFF;;;;;;OAMG;WACiB,iBAAiB,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KAC/C,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMrB;;;;;OAKG;WACiB,wBAAwB,CAC1C,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IAWhB;;;OAGG;WACW,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;WAkBhC,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;WAI7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDnE;;;;OAIG;WACiB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB3E"}
|