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.
Files changed (60) hide show
  1. package/README.md +130 -0
  2. package/lib/api.d.ts +43 -1
  3. package/lib/api.js +241 -44
  4. package/lib/api.js.map +1 -1
  5. package/lib/auto_page.d.ts +5 -2
  6. package/lib/auto_page.js +177 -46
  7. package/lib/auto_page.js.map +1 -1
  8. package/lib/browser_manager.d.ts +7 -3
  9. package/lib/browser_manager.js +158 -51
  10. package/lib/browser_manager.js.map +1 -1
  11. package/lib/bruno.d.ts +2 -0
  12. package/lib/bruno.js +381 -0
  13. package/lib/bruno.js.map +1 -0
  14. package/lib/command_common.d.ts +6 -0
  15. package/lib/command_common.js +198 -0
  16. package/lib/command_common.js.map +1 -0
  17. package/lib/environment.d.ts +3 -0
  18. package/lib/environment.js +5 -2
  19. package/lib/environment.js.map +1 -1
  20. package/lib/error-messages.d.ts +6 -0
  21. package/lib/error-messages.js +206 -0
  22. package/lib/error-messages.js.map +1 -0
  23. package/lib/generation_scripts.d.ts +4 -0
  24. package/lib/generation_scripts.js +2 -0
  25. package/lib/generation_scripts.js.map +1 -0
  26. package/lib/index.d.ts +2 -0
  27. package/lib/index.js +2 -0
  28. package/lib/index.js.map +1 -1
  29. package/lib/init_browser.d.ts +5 -2
  30. package/lib/init_browser.js +124 -7
  31. package/lib/init_browser.js.map +1 -1
  32. package/lib/locate_element.d.ts +7 -0
  33. package/lib/locate_element.js +215 -0
  34. package/lib/locate_element.js.map +1 -0
  35. package/lib/locator.d.ts +36 -0
  36. package/lib/locator.js +165 -0
  37. package/lib/locator.js.map +1 -1
  38. package/lib/locator_log.d.ts +26 -0
  39. package/lib/locator_log.js +69 -0
  40. package/lib/locator_log.js.map +1 -0
  41. package/lib/network.d.ts +3 -0
  42. package/lib/network.js +183 -0
  43. package/lib/network.js.map +1 -0
  44. package/lib/scripts/axe.mini.js +12 -0
  45. package/lib/stable_browser.d.ts +103 -36
  46. package/lib/stable_browser.js +1767 -1246
  47. package/lib/stable_browser.js.map +1 -1
  48. package/lib/table.d.ts +13 -0
  49. package/lib/table.js +187 -0
  50. package/lib/table.js.map +1 -0
  51. package/lib/table_helper.d.ts +19 -0
  52. package/lib/table_helper.js +116 -0
  53. package/lib/table_helper.js.map +1 -0
  54. package/lib/test_context.d.ts +6 -0
  55. package/lib/test_context.js +14 -10
  56. package/lib/test_context.js.map +1 -1
  57. package/lib/utils.d.ts +22 -2
  58. package/lib/utils.js +669 -11
  59. package/lib/utils.js.map +1 -1
  60. 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.stable.goto(url);
19
+ await context.web.goto(url);
19
20
  context.navigate = true;
20
- await context.stable.waitForPageLoad();
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
- context = await getContext(null, headless);
43
- if (world) {
44
- world.context = context;
45
- world.screenshot = true;
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
- world.screenshotPath = reportFolder + "/screenshots/";
56
- if (!fs.existsSync(world.screenshotPath)) {
57
- fs.mkdirSync(world.screenshotPath, { recursive: true });
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
- context.reportFolder = reportFolder;
61
- }
62
- if (moveToRight > 0) {
63
- // move the borwser to the top right corner of the screen
64
- // create a cdp session
65
- // Get CDP session
66
- const playContext = context.playContext;
67
- const client = await playContext.newCDPSession(context.page);
68
- // Get window ID for the current target
69
- const { windowId } = await client.send("Browser.getWindowForTarget");
70
- console.log(windowId);
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
@@ -1 +1 @@
1
- {"version":3,"file":"auto_page.js","sourceRoot":"","sources":["../../src/auto_page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto_page.js","sourceRoot":"","sources":["../../src/auto_page.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -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
- browser = this.browsers[0];
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", "--disable-site-isolation-trials"],
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 !== null && userDataDirPath !== void 0 ? 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: ["--ignore-https-errors", "--ignore-certificate-errors", "--disable-site-isolation-trials"],
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: ["--ignore-https-errors", "--ignore-certificate-errors", "--disable-site-isolation-trials"],
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
- this.browser = await chromium.launch({
116
- headless: headless,
117
- timeout: 0,
118
- args: ["--ignore-https-errors", "--ignore-certificate-errors", "--disable-site-isolation-trials"],
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
- this.context = await this.browser.newContext(contextOptions);
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