automation_model 1.0.436-dev → 1.0.436
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 +130 -0
- package/lib/api.d.ts +43 -1
- package/lib/api.js +241 -44
- package/lib/api.js.map +1 -1
- package/lib/auto_page.d.ts +5 -2
- package/lib/auto_page.js +177 -46
- package/lib/auto_page.js.map +1 -1
- package/lib/browser_manager.d.ts +7 -3
- package/lib/browser_manager.js +158 -51
- package/lib/browser_manager.js.map +1 -1
- package/lib/bruno.d.ts +2 -0
- package/lib/bruno.js +381 -0
- package/lib/bruno.js.map +1 -0
- package/lib/command_common.d.ts +6 -0
- package/lib/command_common.js +198 -0
- package/lib/command_common.js.map +1 -0
- package/lib/environment.d.ts +3 -0
- package/lib/environment.js +5 -2
- package/lib/environment.js.map +1 -1
- package/lib/error-messages.d.ts +6 -0
- package/lib/error-messages.js +206 -0
- package/lib/error-messages.js.map +1 -0
- package/lib/generation_scripts.d.ts +4 -0
- package/lib/generation_scripts.js +2 -0
- package/lib/generation_scripts.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/init_browser.d.ts +5 -2
- package/lib/init_browser.js +124 -7
- package/lib/init_browser.js.map +1 -1
- package/lib/locate_element.d.ts +7 -0
- package/lib/locate_element.js +215 -0
- package/lib/locate_element.js.map +1 -0
- package/lib/locator.d.ts +36 -0
- package/lib/locator.js +165 -0
- package/lib/locator.js.map +1 -1
- package/lib/locator_log.d.ts +26 -0
- package/lib/locator_log.js +69 -0
- package/lib/locator_log.js.map +1 -0
- package/lib/network.d.ts +3 -0
- package/lib/network.js +183 -0
- package/lib/network.js.map +1 -0
- package/lib/scripts/axe.mini.js +12 -0
- package/lib/stable_browser.d.ts +103 -36
- package/lib/stable_browser.js +1767 -1246
- package/lib/stable_browser.js.map +1 -1
- package/lib/table.d.ts +13 -0
- package/lib/table.js +187 -0
- package/lib/table.js.map +1 -0
- package/lib/table_helper.d.ts +19 -0
- package/lib/table_helper.js +116 -0
- package/lib/table_helper.js.map +1 -0
- package/lib/test_context.d.ts +6 -0
- package/lib/test_context.js +14 -10
- package/lib/test_context.js.map +1 -1
- package/lib/utils.d.ts +22 -2
- package/lib/utils.js +669 -11
- package/lib/utils.js.map +1 -1
- package/package.json +14 -8
package/lib/auto_page.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { browserManager } from "./browser_manager.js";
|
|
2
2
|
import { getContext } from "./init_browser.js";
|
|
3
|
-
import fs from "fs";
|
|
3
|
+
import fs, { existsSync } from "fs";
|
|
4
4
|
import path from "path";
|
|
5
|
+
import { _getDataFile, decrypt } from "./utils.js";
|
|
5
6
|
let context = null;
|
|
6
7
|
let reportFolder = "";
|
|
7
8
|
const navigate = async (path = "") => {
|
|
@@ -15,9 +16,9 @@ const navigate = async (path = "") => {
|
|
|
15
16
|
else {
|
|
16
17
|
url = new URL(path, context.environment.baseUrl).href;
|
|
17
18
|
}
|
|
18
|
-
await context.
|
|
19
|
+
await context.web.goto(url);
|
|
19
20
|
context.navigate = true;
|
|
20
|
-
await context.
|
|
21
|
+
await context.web.waitForPageLoad();
|
|
21
22
|
};
|
|
22
23
|
const _findEmptyFolder = (folder) => {
|
|
23
24
|
if (!folder) {
|
|
@@ -26,68 +27,97 @@ const _findEmptyFolder = (folder) => {
|
|
|
26
27
|
if (!fs.existsSync(folder)) {
|
|
27
28
|
fs.mkdirSync(folder);
|
|
28
29
|
}
|
|
30
|
+
if (process.env.REPORT_FOLDER) {
|
|
31
|
+
return process.env.REPORT_FOLDER;
|
|
32
|
+
}
|
|
33
|
+
if (process.env.REPORT_ID) {
|
|
34
|
+
return path.join(folder, process.env.REPORT_ID);
|
|
35
|
+
}
|
|
29
36
|
let nextIndex = 1;
|
|
30
37
|
while (fs.existsSync(path.join(folder, nextIndex.toString()))) {
|
|
31
38
|
nextIndex++;
|
|
32
39
|
}
|
|
33
40
|
return path.join(folder, nextIndex.toString());
|
|
34
41
|
};
|
|
35
|
-
const initContext = async (path, doNavigate = true, headless = false, world = null, moveToRight = -1) => {
|
|
36
|
-
if (context) {
|
|
42
|
+
const initContext = async (path, doNavigate = true, headless = false, world = null, moveToRight = -1, initScript = null, envName = null) => {
|
|
43
|
+
if (context && context.playContext && context.playContext.isClosed !== true) {
|
|
37
44
|
return context;
|
|
38
45
|
}
|
|
39
|
-
if (world && world.context) {
|
|
46
|
+
if (world && world.context && world.context.playContext && world.context.playContext.isClosed !== true) {
|
|
40
47
|
return world.context;
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
world.
|
|
45
|
-
|
|
46
|
-
if (!reportFolder) {
|
|
47
|
-
reportFolder = _findEmptyFolder();
|
|
48
|
-
if (world.attach) {
|
|
49
|
-
world.attach(reportFolder, { mediaType: "text/plain" });
|
|
50
|
-
world.attach(JSON.stringify(context.environment), {
|
|
51
|
-
mediaType: "application/json+env",
|
|
52
|
-
});
|
|
53
|
-
}
|
|
49
|
+
if (!reportFolder) {
|
|
50
|
+
reportFolder = _findEmptyFolder();
|
|
51
|
+
if (world && world.attach) {
|
|
52
|
+
world.attach(reportFolder, { mediaType: "text/plain" });
|
|
54
53
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
}
|
|
55
|
+
const globalTestDataFile = process.env.GLOBAL_TEST_DATA_FILE;
|
|
56
|
+
if (globalTestDataFile) {
|
|
57
|
+
// check if file exists
|
|
58
|
+
if (!fs.existsSync(globalTestDataFile)) {
|
|
59
|
+
console.log("GLOBAL_TEST_DATA_FILE not found: " + process.env.GLOBAL_TEST_DATA_FILE);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// if report folder does not exist, create it
|
|
63
|
+
if (!fs.existsSync(reportFolder)) {
|
|
64
|
+
fs.mkdirSync(reportFolder, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
// copy the test data file to the report folder as data.json
|
|
67
|
+
fs.copyFileSync(globalTestDataFile, reportFolder + "/data.json");
|
|
58
68
|
}
|
|
69
|
+
}
|
|
70
|
+
const screenshotPath = reportFolder + "/screenshots/";
|
|
71
|
+
if (!fs.existsSync(screenshotPath)) {
|
|
72
|
+
fs.mkdirSync(screenshotPath, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
if (world) {
|
|
59
75
|
world.reportFolder = reportFolder;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// get the window for the current target
|
|
72
|
-
const window = await client.send("Browser.getWindowBounds", {
|
|
73
|
-
windowId,
|
|
74
|
-
});
|
|
75
|
-
console.log(window);
|
|
76
|
-
await client.send("Browser.setWindowBounds", {
|
|
77
|
-
windowId,
|
|
78
|
-
bounds: {
|
|
79
|
-
left: window.bounds.left + moveToRight,
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
// close cdp
|
|
83
|
-
await client.detach();
|
|
76
|
+
world.screenshotPath = screenshotPath;
|
|
77
|
+
world.screenshot = true;
|
|
78
|
+
}
|
|
79
|
+
context = await getContext(null, headless, world, null, null, true, null, moveToRight, reportFolder, initScript);
|
|
80
|
+
if (world) {
|
|
81
|
+
world.context = context;
|
|
82
|
+
if (world.attach) {
|
|
83
|
+
world.attach(JSON.stringify(context.environment), {
|
|
84
|
+
mediaType: "application/json+env",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
84
87
|
}
|
|
88
|
+
context.reportFolder = reportFolder;
|
|
85
89
|
if (doNavigate) {
|
|
86
90
|
await navigate(path);
|
|
87
91
|
}
|
|
92
|
+
if (context) {
|
|
93
|
+
const env = getEnv(envName);
|
|
94
|
+
if (env && !process.env.CDP_CONNECT_URL) {
|
|
95
|
+
await getTestData(env, world);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
88
98
|
return context;
|
|
89
99
|
};
|
|
100
|
+
const getEnv = (envName) => {
|
|
101
|
+
let env = process.env.BLINQ_ENV;
|
|
102
|
+
if (envName) {
|
|
103
|
+
env = envName;
|
|
104
|
+
}
|
|
105
|
+
if (env) {
|
|
106
|
+
try {
|
|
107
|
+
const content = JSON.parse(fs.readFileSync(env, "utf8"));
|
|
108
|
+
return content.name;
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.log("Error reading env file: " + e);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
};
|
|
90
117
|
const closeContext = async () => {
|
|
118
|
+
if (process.env.TEMP_RUN) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
91
121
|
try {
|
|
92
122
|
if (context && context.browser) {
|
|
93
123
|
await browserManager.closeBrowser(context.browser);
|
|
@@ -98,6 +128,107 @@ const closeContext = async () => {
|
|
|
98
128
|
// ignore
|
|
99
129
|
}
|
|
100
130
|
context = null;
|
|
131
|
+
reportFolder = "";
|
|
132
|
+
};
|
|
133
|
+
const getTestData = async (currentEnv, world, dataFile, feature, scenario) => {
|
|
134
|
+
// copy the global test data located in data/data.json to the report folder
|
|
135
|
+
try {
|
|
136
|
+
if (fs.existsSync(path.join("data", "data.json"))) {
|
|
137
|
+
const filterFeatureScenario = feature || scenario;
|
|
138
|
+
const data = fs.readFileSync(path.join("data", "data.json"), "utf8");
|
|
139
|
+
const jsonData = JSON.parse(data);
|
|
140
|
+
const testData = {};
|
|
141
|
+
const allEnvData = jsonData["*"];
|
|
142
|
+
const currentEnvData = jsonData[currentEnv];
|
|
143
|
+
// Process all environment data first as a baseline
|
|
144
|
+
if (allEnvData) {
|
|
145
|
+
for (let i = 0; i < allEnvData.length; i++) {
|
|
146
|
+
const item = allEnvData[i];
|
|
147
|
+
if (process.env[item.key] && item.key.toLowerCase() !== "username" && item.key.toLowerCase() !== "user") {
|
|
148
|
+
testData[item.key] = process.env[item.key];
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Filter by feature/scenario if specified
|
|
152
|
+
if (filterFeatureScenario) {
|
|
153
|
+
if (feature && item.feature && item.feature !== feature) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (scenario && item.scenario && item.scenario !== scenario) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (item.feature || item.scenario) {
|
|
161
|
+
// Skip feature/scenario specific items when not filtering
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
let useValue = item.value;
|
|
165
|
+
if (item.DataType === "secret") {
|
|
166
|
+
testData[item.key] = "secret:" + item.value;
|
|
167
|
+
// decrypt the secret
|
|
168
|
+
useValue = decrypt("secret:" + item.value);
|
|
169
|
+
}
|
|
170
|
+
else if (item.DataType === "totp") {
|
|
171
|
+
testData[item.key] = "totp:" + item.value;
|
|
172
|
+
useValue = "totp:" + item.value;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
testData[item.key] = item.value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Then process currentEnvData to override the base values
|
|
180
|
+
if (currentEnvData) {
|
|
181
|
+
for (let i = 0; i < currentEnvData.length; i++) {
|
|
182
|
+
const item = currentEnvData[i];
|
|
183
|
+
if (process.env[item.key] && item.key.toLowerCase() !== "username" && item.key.toLowerCase() !== "user") {
|
|
184
|
+
testData[item.key] = process.env[item.key];
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Filter by feature/scenario if specified
|
|
188
|
+
if (filterFeatureScenario) {
|
|
189
|
+
if (feature && item.feature && item.feature !== feature) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (scenario && item.scenario && item.scenario !== scenario) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (item.feature || item.scenario) {
|
|
197
|
+
// Skip feature/scenario specific items when not filtering
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
let useValue = item.value;
|
|
201
|
+
if (item.DataType === "secret") {
|
|
202
|
+
testData[item.key] = "secret:" + item.value;
|
|
203
|
+
// decrypt the secret
|
|
204
|
+
useValue = decrypt("secret:" + item.value);
|
|
205
|
+
}
|
|
206
|
+
else if (item.DataType === "totp") {
|
|
207
|
+
testData[item.key] = "totp:" + item.value;
|
|
208
|
+
useValue = "totp:" + item.value;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
testData[item.key] = item.value;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (dataFile && !existsSync(path.dirname(dataFile))) {
|
|
216
|
+
fs.mkdirSync(path.dirname(dataFile), { recursive: true });
|
|
217
|
+
}
|
|
218
|
+
if (!dataFile)
|
|
219
|
+
dataFile = _getDataFile(world, context, context?.web);
|
|
220
|
+
fs.writeFileSync(dataFile, JSON.stringify(testData, null, 2));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
console.log("Error reading data.json file: " + e);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const resetTestData = async (envPath, world) => {
|
|
228
|
+
const envName = getEnv(envPath);
|
|
229
|
+
if (envName) {
|
|
230
|
+
getTestData(envName, world);
|
|
231
|
+
}
|
|
101
232
|
};
|
|
102
|
-
export { initContext, navigate, closeContext };
|
|
233
|
+
export { initContext, navigate, closeContext, resetTestData, getTestData };
|
|
103
234
|
//# sourceMappingURL=auto_page.js.map
|
package/lib/auto_page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto_page.js","sourceRoot":"","sources":["../../src/auto_page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"auto_page.js","sourceRoot":"","sources":["../../src/auto_page.ts"],"names":[],"mappings":"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"}
|
package/lib/browser_manager.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Browser as PlaywrightBrowser, BrowserContext, Page } from "playwright";
|
|
2
2
|
import type { Cookie, LocalStorage } from "./environment.js";
|
|
3
|
+
import { InitScripts } from "./generation_scripts.js";
|
|
3
4
|
type StorageState = {
|
|
4
5
|
cookies: Cookie[];
|
|
5
6
|
origins: {
|
|
@@ -12,15 +13,18 @@ declare class BrowserManager {
|
|
|
12
13
|
constructor(browsers?: Browser[]);
|
|
13
14
|
closeAll(): Promise<void>;
|
|
14
15
|
closeBrowser(browser?: PlaywrightBrowser | Browser): Promise<void>;
|
|
15
|
-
createBrowser(headless?: boolean, storageState?: StorageState, extensionPath?: string, userDataDirPath?: string): Promise<Browser>;
|
|
16
|
-
getBrowser(headless?: boolean, storageState?: StorageState, extensionPath?: string, userDataDirPath?: string): Promise<Browser>;
|
|
16
|
+
createBrowser(headless?: boolean, storageState?: StorageState, extensionPath?: string, userDataDirPath?: string, reportFolder?: string, userAgent?: string, channel?: string, aiConfig?: any, initScripts?: InitScripts | null): Promise<Browser>;
|
|
17
17
|
}
|
|
18
18
|
declare class Browser {
|
|
19
19
|
browser: PlaywrightBrowser | null;
|
|
20
20
|
context: BrowserContext | null;
|
|
21
21
|
page: Page | null;
|
|
22
|
+
headless: boolean;
|
|
23
|
+
reportFolder: string | null;
|
|
24
|
+
trace: boolean;
|
|
25
|
+
traceFolder: string | null;
|
|
22
26
|
constructor();
|
|
23
|
-
init(headless?: boolean, storageState?: StorageState, extensionPath?: string, userDataDirPath?: string): Promise<void>;
|
|
27
|
+
init(headless?: boolean, storageState?: StorageState, extensionPath?: string, userDataDirPath?: string, reportFolder?: string, userAgent?: string, channel?: string, aiConfig?: any, initScripts?: InitScripts | null): Promise<void>;
|
|
24
28
|
close(): Promise<void>;
|
|
25
29
|
}
|
|
26
30
|
declare const browserManager: BrowserManager;
|
package/lib/browser_manager.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { chromium, firefox, webkit, } from "playwright";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
// Get __filename and __dirname in ESM
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
2
8
|
class BrowserManager {
|
|
9
|
+
browsers;
|
|
3
10
|
constructor(browsers = []) {
|
|
4
11
|
this.browsers = browsers;
|
|
5
12
|
}
|
|
@@ -9,9 +16,12 @@ class BrowserManager {
|
|
|
9
16
|
}
|
|
10
17
|
async closeBrowser(browser) {
|
|
11
18
|
if (!browser && this.browsers.length > 0) {
|
|
12
|
-
|
|
19
|
+
for (let i = 0; i < this.browsers.length; i++) {
|
|
20
|
+
await this.browsers[i].close();
|
|
21
|
+
}
|
|
22
|
+
this.browsers = [];
|
|
13
23
|
}
|
|
14
|
-
if (browser) {
|
|
24
|
+
if (browser && !process.env.IGNORE_BROWSER_CLOSE) {
|
|
15
25
|
await browser.close();
|
|
16
26
|
for (let i = 0; i < this.browsers.length; i++) {
|
|
17
27
|
if (this.browsers[i].browser === browser || this.browsers[i] === browser) {
|
|
@@ -22,67 +32,71 @@ class BrowserManager {
|
|
|
22
32
|
}
|
|
23
33
|
}
|
|
24
34
|
}
|
|
25
|
-
async createBrowser(headless = false, storageState, extensionPath, userDataDirPath) {
|
|
35
|
+
async createBrowser(headless = false, storageState, extensionPath, userDataDirPath, reportFolder, userAgent, channel, aiConfig, initScripts = null) {
|
|
26
36
|
const browser = new Browser();
|
|
27
|
-
await browser.init(headless, storageState, extensionPath, userDataDirPath);
|
|
37
|
+
await browser.init(headless, storageState, extensionPath, userDataDirPath, reportFolder, userAgent, channel, aiConfig, initScripts);
|
|
28
38
|
this.browsers.push(browser);
|
|
29
39
|
return browser;
|
|
30
40
|
}
|
|
31
|
-
async getBrowser(headless = false, storageState, extensionPath, userDataDirPath) {
|
|
32
|
-
if (this.browsers.length === 0) {
|
|
33
|
-
return await this.createBrowser(headless, storageState, extensionPath, userDataDirPath);
|
|
34
|
-
}
|
|
35
|
-
return this.browsers[0];
|
|
36
|
-
}
|
|
37
41
|
}
|
|
38
42
|
class Browser {
|
|
43
|
+
browser;
|
|
44
|
+
context;
|
|
45
|
+
page;
|
|
46
|
+
headless = false;
|
|
47
|
+
reportFolder = null;
|
|
48
|
+
trace = false;
|
|
49
|
+
traceFolder = null;
|
|
39
50
|
constructor() {
|
|
40
51
|
this.browser = null;
|
|
41
52
|
this.context = null;
|
|
42
53
|
this.page = null;
|
|
43
54
|
}
|
|
44
|
-
async init(headless = false, storageState, extensionPath, userDataDirPath) {
|
|
55
|
+
async init(headless = false, storageState, extensionPath, userDataDirPath, reportFolder, userAgent, channel, aiConfig, initScripts = null) {
|
|
56
|
+
if (!aiConfig) {
|
|
57
|
+
aiConfig = {};
|
|
58
|
+
}
|
|
59
|
+
// if (!downloadsPath) {
|
|
60
|
+
// downloadsPath = "downloads";
|
|
61
|
+
// }
|
|
62
|
+
// // check if downloads path exists
|
|
63
|
+
// if (!fs.existsSync(downloadsPath)) {
|
|
64
|
+
// fs.mkdirSync(downloadsPath, { recursive: true });
|
|
65
|
+
// }
|
|
66
|
+
this.headless = headless;
|
|
67
|
+
if (reportFolder) {
|
|
68
|
+
this.reportFolder = reportFolder;
|
|
69
|
+
}
|
|
45
70
|
let viewport = null;
|
|
46
71
|
if (process.env.HEADLESS === "true") {
|
|
47
72
|
headless = true;
|
|
73
|
+
this.headless = true;
|
|
48
74
|
}
|
|
49
75
|
else if (process.env.HEADLESS === "false") {
|
|
50
76
|
headless = false;
|
|
77
|
+
this.headless = false;
|
|
51
78
|
}
|
|
52
79
|
if (process.env.VIEWPORT) {
|
|
53
80
|
let viewportParts = process.env.VIEWPORT.split(",");
|
|
54
81
|
viewport = { width: parseInt(viewportParts[0]), height: parseInt(viewportParts[1]) };
|
|
55
82
|
}
|
|
83
|
+
else if (!aiConfig.noViewport) {
|
|
84
|
+
viewport = { width: 1280, height: 800 };
|
|
85
|
+
}
|
|
86
|
+
const args = ["--ignore-https-errors", "--ignore-certificate-errors"];
|
|
87
|
+
if (process.env.CDP_LISTEN_PORT) {
|
|
88
|
+
args.push(`--remote-debugging-port=${process.env.CDP_LISTEN_PORT}`);
|
|
89
|
+
}
|
|
56
90
|
if (!extensionPath && userDataDirPath) {
|
|
57
91
|
this.context = await chromium.launchPersistentContext(userDataDirPath, {
|
|
58
92
|
headless: false,
|
|
59
93
|
timeout: 0,
|
|
60
94
|
bypassCSP: true,
|
|
61
|
-
args: ["--ignore-https-errors", "--no-incognito", "--ignore-certificate-errors"
|
|
95
|
+
args: ["--ignore-https-errors", "--no-incognito", "--ignore-certificate-errors"],
|
|
62
96
|
});
|
|
63
|
-
// this.browser = await chromium.connectOverCDP({
|
|
64
|
-
// endpointURL: `http://localhost:${cdpPort}`,
|
|
65
|
-
// });
|
|
66
|
-
// if (!this.browser) {
|
|
67
|
-
// throw new Error("Could not connect to browser");
|
|
68
|
-
// }
|
|
69
|
-
// this.context = await this.browser.newContext();
|
|
70
|
-
//this.page = await this.context.newPage();
|
|
71
|
-
// if (this.browser.contexts?.length > 0) {
|
|
72
|
-
// this.context = (this.browser.contexts as BrowserContext[])[0];
|
|
73
|
-
// //this.context = await this.browser.contexts[0];
|
|
74
|
-
// if (this.context.pages.length > 0) {
|
|
75
|
-
// this.page = await this.context.pages[0];
|
|
76
|
-
// } else {
|
|
77
|
-
// this.page = await this.context.newPage();
|
|
78
|
-
// }
|
|
79
|
-
// } else {
|
|
80
|
-
// this.context = await this.browser.newContext();
|
|
81
|
-
// this.page = await this.context.newPage();
|
|
82
|
-
// }
|
|
83
97
|
}
|
|
84
98
|
else if (extensionPath) {
|
|
85
|
-
this.context = await chromium.launchPersistentContext(userDataDirPath
|
|
99
|
+
this.context = await chromium.launchPersistentContext(userDataDirPath ?? "", {
|
|
86
100
|
headless: headless,
|
|
87
101
|
timeout: 0,
|
|
88
102
|
bypassCSP: true,
|
|
@@ -92,7 +106,6 @@ class Browser {
|
|
|
92
106
|
"--load-extension=" + extensionPath,
|
|
93
107
|
"--no-incognito",
|
|
94
108
|
"--ignore-certificate-errors",
|
|
95
|
-
"--disable-site-isolation-trials"
|
|
96
109
|
],
|
|
97
110
|
});
|
|
98
111
|
}
|
|
@@ -101,24 +114,51 @@ class Browser {
|
|
|
101
114
|
this.browser = await firefox.launch({
|
|
102
115
|
headless: headless,
|
|
103
116
|
timeout: 0,
|
|
104
|
-
args
|
|
117
|
+
args,
|
|
118
|
+
//downloadsPath: downloadsPath,
|
|
105
119
|
});
|
|
106
120
|
}
|
|
107
121
|
else if (process.env.BROWSER === "webkit") {
|
|
108
122
|
this.browser = await webkit.launch({
|
|
109
123
|
headless: headless,
|
|
110
124
|
timeout: 0,
|
|
111
|
-
args
|
|
125
|
+
args,
|
|
126
|
+
//downloadsPath: downloadsPath,
|
|
112
127
|
});
|
|
113
128
|
}
|
|
129
|
+
else if (channel) {
|
|
130
|
+
{
|
|
131
|
+
this.browser = await chromium.launch({
|
|
132
|
+
headless: headless,
|
|
133
|
+
timeout: 0,
|
|
134
|
+
args,
|
|
135
|
+
channel: channel,
|
|
136
|
+
//downloadsPath: downloadsPath,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
114
140
|
else {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
141
|
+
if (process.env.CDP_CONNECT_URL) {
|
|
142
|
+
this.browser = await chromium.connectOverCDP(process.env.CDP_CONNECT_URL);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.browser = await chromium.launch({
|
|
146
|
+
headless: headless,
|
|
147
|
+
timeout: 0,
|
|
148
|
+
args,
|
|
149
|
+
//downloadsPath: downloadsPath,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
120
152
|
}
|
|
153
|
+
// downloadsPath
|
|
121
154
|
let contextOptions = {};
|
|
155
|
+
if (aiConfig.contextOptions) {
|
|
156
|
+
contextOptions = aiConfig.contextOptions;
|
|
157
|
+
console.log("contextOptions: " + JSON.stringify(contextOptions));
|
|
158
|
+
}
|
|
159
|
+
if (!contextOptions["acceptDownloads"]) {
|
|
160
|
+
contextOptions["acceptDownloads"] = true;
|
|
161
|
+
}
|
|
122
162
|
if (storageState) {
|
|
123
163
|
contextOptions.storageState = storageState;
|
|
124
164
|
contextOptions.bypassCSP = true;
|
|
@@ -127,12 +167,86 @@ class Browser {
|
|
|
127
167
|
if (viewport) {
|
|
128
168
|
contextOptions.viewport = viewport;
|
|
129
169
|
}
|
|
130
|
-
|
|
170
|
+
else {
|
|
171
|
+
if (!this.headless) {
|
|
172
|
+
contextOptions.viewport = null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (userAgent) {
|
|
176
|
+
contextOptions.userAgent = userAgent;
|
|
177
|
+
}
|
|
178
|
+
if (!this.context && this.browser) {
|
|
179
|
+
if (this.browser.contexts().length > 0) {
|
|
180
|
+
this.context = this.browser.contexts()[this.browser.contexts().length - 1];
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
this.context = await this.browser.newContext(contextOptions);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if ((process.env.TRACE === "true" || aiConfig.trace === true) && this.context) {
|
|
188
|
+
this.trace = true;
|
|
189
|
+
const traceFolder = path.join(this.reportFolder, "trace");
|
|
190
|
+
//const traceFile = path.join(traceFolder, "trace.zip");
|
|
191
|
+
if (!fs.existsSync(traceFolder)) {
|
|
192
|
+
fs.mkdirSync(traceFolder, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
this.traceFolder = traceFolder;
|
|
195
|
+
await this.context.tracing.start({ screenshots: true, snapshots: true });
|
|
196
|
+
}
|
|
197
|
+
if (initScripts && this.context) {
|
|
198
|
+
if (initScripts.recorderCjs) {
|
|
199
|
+
await this.context.addInitScript({
|
|
200
|
+
content: `
|
|
201
|
+
(() => {
|
|
202
|
+
const module = {};
|
|
203
|
+
${initScripts.recorderCjs}
|
|
204
|
+
const sss = new (module.exports.InjectedScript())(
|
|
205
|
+
window,
|
|
206
|
+
true,
|
|
207
|
+
"javascript",
|
|
208
|
+
[],
|
|
209
|
+
${0},
|
|
210
|
+
"${this.browser?.browserType().name()}",
|
|
211
|
+
[]
|
|
212
|
+
);
|
|
213
|
+
})();`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (initScripts.scripts) {
|
|
217
|
+
for (let script of initScripts.scripts) {
|
|
218
|
+
await this.context.addInitScript({
|
|
219
|
+
content: script,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
let axeMinJsPath = path.join(__dirname, "..", "scripts", "axe.mini.js");
|
|
225
|
+
// Check if the file exists
|
|
226
|
+
if (!fs.existsSync(axeMinJsPath)) {
|
|
227
|
+
axeMinJsPath = path.join(__dirname, "scripts", "axe.mini.js");
|
|
228
|
+
}
|
|
229
|
+
// Read the content of axe.min.js synchronously
|
|
230
|
+
const axeMinJsContent = fs.readFileSync(axeMinJsPath, "utf-8");
|
|
231
|
+
await this.context?.addInitScript({
|
|
232
|
+
content: axeMinJsContent,
|
|
233
|
+
});
|
|
234
|
+
if (this.context && this.context.pages().length > 0) {
|
|
235
|
+
this.page = this.context.pages()[this.context.pages().length - 1];
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
this.page = await this.context.newPage();
|
|
239
|
+
}
|
|
240
|
+
if (this.context) {
|
|
241
|
+
this.context.on("close", () => {
|
|
242
|
+
this.context.isClosed = true;
|
|
243
|
+
});
|
|
131
244
|
}
|
|
132
|
-
// }
|
|
133
|
-
this.page = await this.context.newPage();
|
|
134
245
|
}
|
|
135
246
|
async close() {
|
|
247
|
+
if (process.env.IGNORE_BROWSER_CLOSE === "true") {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
136
250
|
if (this.browser !== null) {
|
|
137
251
|
await this.browser.close();
|
|
138
252
|
this.browser = null;
|
|
@@ -143,11 +257,4 @@ class Browser {
|
|
|
143
257
|
}
|
|
144
258
|
const browserManager = new BrowserManager();
|
|
145
259
|
export { browserManager };
|
|
146
|
-
// let browser = await browserManager.createBrowser();
|
|
147
|
-
// browser.page.goto("https://www.cnn.com");
|
|
148
|
-
// let browser2 = await browserManager.createBrowser();
|
|
149
|
-
// await browser2.page.goto("https://www.google.com");
|
|
150
|
-
// // sleep for 2 seconds
|
|
151
|
-
// await new Promise((r) => setTimeout(r, 1000));
|
|
152
|
-
// await browserManager.closeAll();
|
|
153
260
|
//# sourceMappingURL=browser_manager.js.map
|