automation_model 1.0.63 → 1.0.64

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 (59) hide show
  1. package/.github/workflows/npm-publish.yml +38 -0
  2. package/.vscode/launch.json +30 -0
  3. package/README.md +3 -0
  4. package/ai_config.json +53 -0
  5. package/build/auto_page.d.ts +5 -0
  6. package/build/auto_page.js +56 -0
  7. package/build/auto_page.js.map +1 -0
  8. package/build/browser_manager.d.ts +28 -0
  9. package/build/browser_manager.js +72 -0
  10. package/build/browser_manager.js.map +1 -0
  11. package/build/environment.d.ts +23 -0
  12. package/build/environment.js +12 -0
  13. package/build/environment.js.map +1 -0
  14. package/build/index.js +7 -0
  15. package/build/index.js.map +1 -0
  16. package/build/init_browser.d.ts +7 -0
  17. package/build/init_browser.js +59 -0
  18. package/build/init_browser.js.map +1 -0
  19. package/build/locator.d.ts +15 -0
  20. package/build/locator.js +172 -0
  21. package/build/locator.js.map +1 -0
  22. package/build/stable_browser.d.ts +26 -0
  23. package/build/stable_browser.js +526 -0
  24. package/build/stable_browser.js.map +1 -0
  25. package/build/table_analyze.d.ts +3 -0
  26. package/build/table_analyze.js +64 -0
  27. package/build/table_analyze.js.map +1 -0
  28. package/build/test_context.d.ts +13 -0
  29. package/build/test_context.js +12 -0
  30. package/build/test_context.js.map +1 -0
  31. package/env.json +3 -0
  32. package/package.json +14 -11
  33. package/{bin/auto_page.js → src/auto_page.ts} +58 -57
  34. package/{bin/browser_manager.js → src/browser_manager.ts} +87 -78
  35. package/src/environment.ts +24 -0
  36. package/{bin/index.js → src/index.ts} +6 -6
  37. package/src/init_browser.ts +65 -0
  38. package/{bin/locator.js → src/locator.ts} +173 -159
  39. package/{bin/stable_browser.js → src/stable_browser.ts} +523 -520
  40. package/{bin/table_analyze.js → src/table_analyze.ts} +69 -61
  41. package/src/test_context.ts +16 -0
  42. package/tests/create_new_repository.test.js +62 -0
  43. package/tests/debug.test.js +41 -0
  44. package/tests/gmail_login.test.js +39 -0
  45. package/tests/launch_page.test.js +32 -0
  46. package/tests/navigate_to_new_repository_page.test.js +45 -0
  47. package/tsconfig.json +110 -0
  48. package/bin/auto_page.d.ts +0 -3
  49. package/bin/browser_manager.d.ts +0 -16
  50. package/bin/environment.d.ts +0 -4
  51. package/bin/environment.js +0 -9
  52. package/bin/init_browser.d.ts +0 -3
  53. package/bin/init_browser.js +0 -61
  54. package/bin/locator.d.ts +0 -21
  55. package/bin/stable_browser.d.ts +0 -61
  56. package/bin/table_analyze.d.ts +0 -1
  57. package/bin/test_context.d.ts +0 -6
  58. package/bin/test_context.js +0 -9
  59. /package/{bin → build}/index.d.ts +0 -0
@@ -0,0 +1,26 @@
1
+ import type { Browser, Page } from "playwright";
2
+ type Params = Record<string, string>;
3
+ declare class StableBrowser {
4
+ browser: Browser;
5
+ page: Page;
6
+ logger: any;
7
+ constructor(browser: Browser, page: Page, logger?: any);
8
+ goto(url: string): Promise<void>;
9
+ _fixUsingParams(text: any, _params: Params): any;
10
+ _getLocator(locator: any, scope: any, _params: Params): any;
11
+ _locateElementByText(scope: any, text1: any, tag1: any, regex: boolean | undefined, _params: Params): Promise<any>;
12
+ _collectLocatorInformation(selectorHierarchy: any, index: number | undefined, scope: any, foundLocators: any, _params: Params): Promise<void>;
13
+ _locate(selectors: any, info: any, _params?: Params, timeout?: number): Promise<any>;
14
+ click(selector: any, _params?: Params, options?: {}, world?: null): Promise<{}>;
15
+ selectOption(selector: any, values: any, _params?: null, options?: {}, world?: null): Promise<{}>;
16
+ fill(selector: any, value: any, enter?: boolean, _params?: null, options?: {}, world?: null): Promise<{}>;
17
+ getText(selector: any, _params?: null, options?: {}, info?: {}, world?: null): Promise<any>;
18
+ containsPattern(selector: any, pattern: any, text: any, _params?: null, options?: {}, world?: null): Promise<{}>;
19
+ containsText(selector: any, text: any, _params?: null, options?: {}, world?: null): Promise<{}>;
20
+ _screenShot(options?: {}, world?: null): Promise<void>;
21
+ verifyElementExistInPage(selector: any, _params?: null, options?: {}, world?: null): Promise<{}>;
22
+ analyzeTable(selector: any, query: any, operator: any, value: any, _params?: null, options?: {}, world?: null): Promise<{}>;
23
+ waitForPageLoad(options?: {}, world?: null): Promise<void>;
24
+ _reportToWorld(world: any, properties?: {}): void;
25
+ }
26
+ export { StableBrowser };
@@ -0,0 +1,526 @@
1
+ // @ts-nocheck
2
+ import reg_parser from "regex-parser";
3
+ import { expect } from "@playwright/test";
4
+ import fs from "fs";
5
+ import path from "path";
6
+ import { getTableCells } from "./table_analyze.js";
7
+ let configuration = null;
8
+ class StableBrowser {
9
+ constructor(browser, page, logger = null) {
10
+ this.browser = browser;
11
+ this.page = page;
12
+ this.logger = logger;
13
+ // this.browser = browser;
14
+ // this.page = page;
15
+ // this.logger = logger;
16
+ if (!this.logger) {
17
+ this.logger = console;
18
+ }
19
+ }
20
+ async goto(url) {
21
+ await this.page.goto(url, {
22
+ timeout: 60000,
23
+ });
24
+ }
25
+ _fixUsingParams(text, _params) {
26
+ if (!_params || typeof text !== "string") {
27
+ return text;
28
+ }
29
+ for (let key in _params) {
30
+ text = text.replaceAll(new RegExp("{" + key + "}", "g"), _params[key]);
31
+ }
32
+ return text;
33
+ }
34
+ _getLocator(locator, scope, _params) {
35
+ if (locator.role) {
36
+ if (locator.role[1].nameReg) {
37
+ locator.role[1].name = reg_parser(locator.role[1].nameReg);
38
+ delete locator.role[1].nameReg;
39
+ }
40
+ if (locator.role[1].name) {
41
+ locator.role[1].name = this._fixUsingParams(locator.role[1].name, _params);
42
+ }
43
+ return scope.getByRole(locator.role[0], locator.role[1]);
44
+ }
45
+ if (locator.css) {
46
+ return scope.locator(this._fixUsingParams(locator.css, _params));
47
+ }
48
+ throw new Error("unknown locator type");
49
+ }
50
+ async _locateElementByText(scope, text1, tag1, regex = false, _params) {
51
+ //const stringifyText = JSON.stringify(text);
52
+ return await scope.evaluate(([text, tag]) => {
53
+ function isParent(parent, child) {
54
+ let currentNode = child.parentNode;
55
+ while (currentNode !== null) {
56
+ if (currentNode === parent) {
57
+ return true;
58
+ }
59
+ currentNode = currentNode.parentNode;
60
+ }
61
+ return false;
62
+ }
63
+ if (!tag) {
64
+ tag = "*";
65
+ }
66
+ let elements = Array.from(document.querySelectorAll(tag));
67
+ let randomToken = null;
68
+ text = text.trim();
69
+ const foundElements = [];
70
+ for (let i = 0; i < elements.length; i++) {
71
+ const element = elements[i];
72
+ if (element.innerText && element.innerText.trim() === text) {
73
+ foundElements.push(element);
74
+ }
75
+ }
76
+ let noChildElements = [];
77
+ for (let i = 0; i < foundElements.length; i++) {
78
+ let element = foundElements[i];
79
+ let hasChild = false;
80
+ for (let j = 0; j < foundElements.length; j++) {
81
+ if (i === j) {
82
+ continue;
83
+ }
84
+ if (isParent(element, foundElements[j])) {
85
+ hasChild = true;
86
+ break;
87
+ }
88
+ }
89
+ if (!hasChild) {
90
+ noChildElements.push(element);
91
+ }
92
+ }
93
+ let elementCount = 0;
94
+ if (noChildElements.length > 0) {
95
+ for (let i = 0; i < noChildElements.length; i++) {
96
+ if (randomToken === null) {
97
+ randomToken = Math.random().toString(36).substring(7);
98
+ }
99
+ let element = noChildElements[i];
100
+ element.setAttribute("data-blinq-id", "blinq-id-" + randomToken);
101
+ elementCount++;
102
+ }
103
+ }
104
+ return { elementCount: elementCount, randomToken: randomToken };
105
+ }, [text1, tag1]);
106
+ }
107
+ async _collectLocatorInformation(selectorHierarchy, index = 0, scope, foundLocators, _params) {
108
+ if (index === selectorHierarchy.length) {
109
+ return;
110
+ }
111
+ if (selectorHierarchy.length !== 1) {
112
+ this.logger.info("only single selector hierarchy supported, will use first selector");
113
+ }
114
+ let locatorSearch = selectorHierarchy[index];
115
+ let locator = null;
116
+ if (locatorSearch.text) {
117
+ let result = await this._locateElementByText(scope, locatorSearch.text, locatorSearch.tag, false, _params);
118
+ if (result.elementCount === 0) {
119
+ return;
120
+ }
121
+ locatorSearch.css = "[data-blinq-id='blinq-id-" + result.randomToken + "']";
122
+ locator = this._getLocator(locatorSearch, scope, _params);
123
+ }
124
+ else {
125
+ locator = this._getLocator(locatorSearch, scope, _params);
126
+ }
127
+ let count = await locator.count();
128
+ //let visibleCount = 0;
129
+ let visibleLocator = null;
130
+ for (let j = 0; j < count; j++) {
131
+ if ((await locator.nth(j).isVisible()) && (await locator.nth(j).isEnabled())) {
132
+ //visibleCount++;
133
+ // if (index === selectorHierarchy.length - 1) {
134
+ foundLocators.push(locator.nth(j));
135
+ // } else {
136
+ // this._collectLocatorInformation(selectorHierarchy, index + 1, locator.nth(j), foundLocators);
137
+ // }
138
+ }
139
+ }
140
+ }
141
+ async _locate(selectors, info, _params, timeout = 30000) {
142
+ let locatorsByPriority = [];
143
+ let startTime = performance.now();
144
+ let locatorsCount = 0;
145
+ while (true) {
146
+ locatorsCount = 0;
147
+ for (let i = 0; i < selectors.length; i++) {
148
+ let selectorList = selectors[i];
149
+ let foundLocators = [];
150
+ try {
151
+ await this._collectLocatorInformation(selectorList, 0, this.page, foundLocators, _params);
152
+ }
153
+ catch (e) {
154
+ foundLocators = [];
155
+ await this._collectLocatorInformation(selectorList, 0, this.page, foundLocators, _params);
156
+ }
157
+ info.log.push("total elements found " + foundLocators.length);
158
+ if (foundLocators.length === 1) {
159
+ info.log.push("found unique element");
160
+ info.box = await foundLocators[0].boundingBox();
161
+ return foundLocators[0];
162
+ }
163
+ locatorsByPriority.push(foundLocators);
164
+ locatorsCount += foundLocators.length;
165
+ }
166
+ if (locatorsCount > 0) {
167
+ break;
168
+ }
169
+ if (performance.now() - startTime > timeout) {
170
+ break;
171
+ }
172
+ await new Promise((resolve) => setTimeout(resolve, 1000));
173
+ }
174
+ this.logger.debug("unable to locate unique element, total elements found " + locatorsCount);
175
+ info.log.push("failed to locate unique element, total elements found " + locatorsCount);
176
+ for (let i = 0; i < locatorsByPriority.length; i++) {
177
+ let locators = locatorsByPriority[i];
178
+ if (locators.length > 0) {
179
+ info.box = await locators[0].boundingBox();
180
+ return locators[0];
181
+ }
182
+ }
183
+ throw new Error("failed to locate first element no elements found, " + JSON.stringify(info));
184
+ }
185
+ async click(selector, _params, options = {}, world = null) {
186
+ const info = {};
187
+ info.log = [];
188
+ info.operation = "click";
189
+ info.selector = selector;
190
+ this._reportToWorld(world, { command: "click", params: _params, selector: selector });
191
+ try {
192
+ let element = await this._locate(selector, info, _params);
193
+ await this._screenShot(options, world);
194
+ try {
195
+ await element.click({ timeout: 5000 });
196
+ }
197
+ catch (e) {
198
+ info.log.push("click failed, will try force click");
199
+ this._reportToWorld(world, { message: "click failed, will try force click" });
200
+ await element.click({ timeout: 10000, force: true });
201
+ }
202
+ this._reportToWorld(world, { result: "success", info: info });
203
+ await this.waitForPageLoad();
204
+ return info;
205
+ }
206
+ catch (e) {
207
+ this.logger.error("click failed " + JSON.stringify(info));
208
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
209
+ Object.assign(e, { info: info });
210
+ await this._screenShot(options, world);
211
+ throw e;
212
+ }
213
+ }
214
+ async selectOption(selector, values, _params = null, options = {}, world = null) {
215
+ const info = {};
216
+ info.log = [];
217
+ info.operation = "selectOptions";
218
+ info.selector = selector;
219
+ this._reportToWorld(world, { command: "select", values, params: _params, selector: selector });
220
+ try {
221
+ let element = await this._locate(selector, info, _params);
222
+ await this._screenShot(options, world);
223
+ try {
224
+ await element.selectOption(values, { timeout: 5000 });
225
+ }
226
+ catch (e) {
227
+ info.log.push("selectOption failed, will try force");
228
+ this._reportToWorld(world, { message: "select failed, will try force select" });
229
+ await element.selectOption(values, { timeout: 10000, force: true });
230
+ }
231
+ await this.waitForPageLoad();
232
+ return info;
233
+ }
234
+ catch (e) {
235
+ this.logger.error("selectOption failed " + JSON.stringify(info));
236
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
237
+ Object.assign(e, { info: info });
238
+ await this._screenShot(options, world);
239
+ throw e;
240
+ this.logger.info("click failed, will try next selector");
241
+ }
242
+ }
243
+ async fill(selector, value, enter = false, _params = null, options = {}, world = null) {
244
+ const info = {};
245
+ info.log = [];
246
+ info.operation = "fill";
247
+ info.selector = selector;
248
+ info.value = value;
249
+ this._reportToWorld(world, { command: "fill", value, enter, params: _params, selector: selector });
250
+ try {
251
+ let element = await this._locate(selector, info, _params);
252
+ await this._screenShot(options, world);
253
+ await element.fill(value, { timeout: 10000 });
254
+ await element.dispatchEvent("change");
255
+ if (enter) {
256
+ await this.page.keyboard.press("Enter");
257
+ }
258
+ await this.waitForPageLoad();
259
+ return info;
260
+ }
261
+ catch (e) {
262
+ this.logger.error("fill failed " + JSON.stringify(info));
263
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
264
+ Object.assign(e, { info: info });
265
+ await this._screenShot(options, world);
266
+ throw e;
267
+ }
268
+ }
269
+ async getText(selector, _params = null, options = {}, info = {}, world = null) {
270
+ if (!info.log) {
271
+ info.log = [];
272
+ }
273
+ let element = await this._locate(selector, info, _params);
274
+ await this._screenShot(options, world);
275
+ try {
276
+ return await element.innerText();
277
+ }
278
+ catch (e) {
279
+ this.logger.info("no innerText will use textContent");
280
+ return await element.textContent();
281
+ }
282
+ }
283
+ async containsPattern(selector, pattern, text, _params = null, options = {}, world = null) {
284
+ const info = {};
285
+ info.log = [];
286
+ info.operation = "containsPattern";
287
+ info.selector = selector;
288
+ info.value = text;
289
+ info.pattern = pattern;
290
+ let foundText = null;
291
+ this._reportToWorld(world, { command: "contains", pattern, text, params: _params, selector: selector });
292
+ try {
293
+ foundText = await this.getText(selector, _params, options, info, world);
294
+ let escapedText = text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
295
+ pattern = pattern.replace("{text}", escapedText);
296
+ let regex = new RegExp(pattern, "m");
297
+ if (!regex.test(foundText)) {
298
+ info.foundText = foundText;
299
+ throw new Error("element doesn't contain text " + text);
300
+ }
301
+ return info;
302
+ }
303
+ catch (e) {
304
+ this.logger.error("verify element contains text failed " + JSON.stringify(info));
305
+ this.logger.error("found text " + foundText + " pattern " + pattern);
306
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
307
+ Object.assign(e, { info: info });
308
+ await this._screenShot(options, world);
309
+ throw e;
310
+ }
311
+ }
312
+ async containsText(selector, text, _params = null, options = {}, world = null) {
313
+ const info = {};
314
+ info.log = [];
315
+ info.operation = "containsText";
316
+ info.selector = selector;
317
+ info.value = text;
318
+ try {
319
+ let foundText = await this.getText(selector, _params, options, info, world);
320
+ if (!foundText.includes(text)) {
321
+ info.foundText = foundText;
322
+ throw new Error("element doesn't contain text " + text);
323
+ }
324
+ return info;
325
+ }
326
+ catch (e) {
327
+ this.logger.error("verify element contains text failed " + JSON.stringify(info));
328
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
329
+ Object.assign(e, { info: info });
330
+ await this._screenShot(options, world);
331
+ throw e;
332
+ }
333
+ }
334
+ async _screenShot(options = {}, world = null) {
335
+ if (world && world.attach && world.screenshot && world.screenshotPath) {
336
+ if (!fs.existsSync(world.screenshotPath)) {
337
+ fs.mkdirSync(world.screenshotPath, { recursive: true });
338
+ }
339
+ let nextIndex = 1;
340
+ while (fs.existsSync(path.join(world.screenshotPath, nextIndex + ".png"))) {
341
+ nextIndex++;
342
+ }
343
+ const screenshotPath = path.join(world.screenshotPath, nextIndex + ".png");
344
+ await this.page.screenshot({ path: screenshotPath });
345
+ await world.attach(JSON.stringify({ path: screenshotPath }), {
346
+ mediaType: "application/json",
347
+ });
348
+ }
349
+ else if (options.screenshot) {
350
+ await this.page.screenshot({ path: options.screenshotPath });
351
+ }
352
+ }
353
+ async verifyElementExistInPage(selector, _params = null, options = {}, world = null) {
354
+ await new Promise((resolve) => setTimeout(resolve, 2000));
355
+ const info = {};
356
+ info.log = [];
357
+ info.operation = "verify";
358
+ info.selector = selector;
359
+ this._reportToWorld(world, { command: "verify", params: _params, selector: selector });
360
+ try {
361
+ const element = await this._locate(selector, info, _params);
362
+ await this._screenShot(options, world);
363
+ await expect(element).toHaveCount(1, { timeout: 10000 });
364
+ return info;
365
+ }
366
+ catch (e) {
367
+ this.logger.error("verify failed " + JSON.stringify(info));
368
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
369
+ Object.assign(e, { info: info });
370
+ await this._screenShot(options, world);
371
+ throw e;
372
+ }
373
+ }
374
+ async analyzeTable(selector, query, operator, value, _params = null, options = {}, world = null) {
375
+ const info = {};
376
+ info.log = [];
377
+ info.operation = "analyzeTable";
378
+ info.selector = selector;
379
+ info.query = query;
380
+ query = this._fixUsingParams(query, _params);
381
+ info.query_fixed = query;
382
+ info.operator = operator;
383
+ info.value = value;
384
+ this._reportToWorld(world, {
385
+ command: "analyzeTable",
386
+ query,
387
+ operator,
388
+ value,
389
+ params: _params,
390
+ selector: selector,
391
+ });
392
+ try {
393
+ let table = await this._locate(selector, info, _params);
394
+ await this._screenShot(options, world);
395
+ const cells = await getTableCells(this.page, table, query, info);
396
+ if (cells.error) {
397
+ throw new Error(cells.error);
398
+ }
399
+ if (operator === "===" || operator === "==" || operator === "=" || operator === "equals") {
400
+ if (cells.length === 0) {
401
+ throw new Error("no cells found");
402
+ }
403
+ for (let i = 0; i < cells.length; i++) {
404
+ if (cells[i] !== value) {
405
+ throw new Error("table data doesn't match");
406
+ }
407
+ }
408
+ }
409
+ else if (operator === "!==" || operator === "!=" || operator === "not_equals") {
410
+ if (cells.length === 0) {
411
+ throw new Error("no cells found");
412
+ }
413
+ for (let i = 0; i < cells.length; i++) {
414
+ if (cells[i] === value) {
415
+ throw new Error("table data doesn't match");
416
+ }
417
+ }
418
+ }
419
+ else if (operator === ">=" || operator === "greater_than_or_equal") {
420
+ if (cells.length === 0) {
421
+ throw new Error("no cells found");
422
+ }
423
+ value = Number(value);
424
+ for (let i = 0; i < cells.length; i++) {
425
+ let foundValue = Number(cells[i]);
426
+ if (foundValue < value) {
427
+ throw new Error(`found table cell value ${cells[i]} < ${value}`);
428
+ }
429
+ }
430
+ }
431
+ else if (operator === ">" || operator === "greater_than") {
432
+ if (cells.length === 0) {
433
+ throw new Error("no cells found");
434
+ }
435
+ value = Number(value);
436
+ for (let i = 0; i < cells.length; i++) {
437
+ let foundValue = Number(cells[i]);
438
+ if (foundValue <= value) {
439
+ throw new Error(`found table cell value ${cells[i]} <= ${value}`);
440
+ }
441
+ }
442
+ }
443
+ else if (operator === "<=" || operator === "less_than_or_equal") {
444
+ if (cells.length === 0) {
445
+ throw new Error("no cells found");
446
+ }
447
+ value = Number(value);
448
+ for (let i = 0; i < cells.length; i++) {
449
+ let foundValue = Number(cells[i]);
450
+ if (foundValue > value) {
451
+ throw new Error(`found table cell value ${cells[i]} > ${value}`);
452
+ }
453
+ }
454
+ }
455
+ else if (operator === "<" || operator === "less_than") {
456
+ if (cells.length === 0) {
457
+ throw new Error("no cells found");
458
+ }
459
+ value = Number(value);
460
+ for (let i = 0; i < cells.length; i++) {
461
+ let foundValue = Number(cells[i]);
462
+ if (foundValue >= value) {
463
+ throw new Error(`found table cell value ${cells[i]} >= ${value}`);
464
+ }
465
+ }
466
+ }
467
+ else {
468
+ throw new Error("unknown operator " + operator);
469
+ }
470
+ return info;
471
+ }
472
+ catch (e) {
473
+ this.logger.error("analyzeTable failed " + JSON.stringify(info));
474
+ this._reportToWorld(world, { result: "failed", info: info, error: e });
475
+ Object.assign(e, { info: info });
476
+ await this._screenShot(options, world);
477
+ throw e;
478
+ }
479
+ }
480
+ async waitForPageLoad(options = {}, world = null) {
481
+ let timeout = 10000;
482
+ this._reportToWorld(world, { command: "waitForPageLoade" });
483
+ if (!configuration) {
484
+ try {
485
+ if (fs.existsSync("ai_config.json")) {
486
+ configuration = JSON.parse(fs.readFileSync("ai_config.json"));
487
+ }
488
+ else {
489
+ configuration = {};
490
+ }
491
+ }
492
+ catch (e) {
493
+ this.logger.error("unable to read ai_config.json");
494
+ }
495
+ }
496
+ if (configuration.page_timeout) {
497
+ timeout = configuration.page_timeout;
498
+ }
499
+ if (options.page_timeout) {
500
+ timeout = options.page_timeout;
501
+ }
502
+ const waitOptions = {
503
+ timeout: timeout,
504
+ };
505
+ try {
506
+ await Promise.all([
507
+ this.page.waitForLoadState("networkidle", waitOptions),
508
+ this.page.waitForLoadState("load", waitOptions),
509
+ this.page.waitForLoadState("domcontentloaded", waitOptions),
510
+ ]);
511
+ }
512
+ catch (e) {
513
+ console.log("waitForPageLoad error, ignored");
514
+ }
515
+ await new Promise((resolve) => setTimeout(resolve, 2000));
516
+ await this._screenShot(options, world);
517
+ }
518
+ _reportToWorld(world, properties = {}) {
519
+ if (!world || !world.attach) {
520
+ return;
521
+ }
522
+ world.attach(JSON.stringify(properties), { mediaType: "application/json" });
523
+ }
524
+ }
525
+ export { StableBrowser };
526
+ //# sourceMappingURL=stable_browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable_browser.js","sourceRoot":"","sources":["../src/stable_browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Page, ElementHandle } from "playwright";
2
+ declare const getTableCells: (page: Page, element: ElementHandle, tableSelector: any, info?: any) => Promise<any[] | undefined>;
3
+ export { getTableCells };
@@ -0,0 +1,64 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ function stringifyObject(obj, indentation = 0) {
4
+ let result = "";
5
+ const indent = " ".repeat(indentation);
6
+ if (Array.isArray(obj)) {
7
+ result += "[";
8
+ for (let i = 0; i < obj.length; i++) {
9
+ result += (i > 0 ? ", " : "") + stringifyObject(obj[i], indentation + 2);
10
+ }
11
+ result += "]";
12
+ }
13
+ else if (typeof obj === "object" && obj !== null) {
14
+ result += "{";
15
+ let first = true;
16
+ for (let key in obj) {
17
+ // eslint-disable-next-line no-prototype-builtins
18
+ if (obj.hasOwnProperty(key)) {
19
+ result +=
20
+ (first ? "\n" : ",\n") +
21
+ indent +
22
+ " " +
23
+ JSON.stringify(key) +
24
+ ": " +
25
+ // @ts-ignore
26
+ stringifyObject(obj[key], indentation + 2);
27
+ first = false;
28
+ }
29
+ }
30
+ result += "\n" + indent + "}";
31
+ }
32
+ else {
33
+ result += JSON.stringify(obj);
34
+ }
35
+ return result;
36
+ }
37
+ const __filename = new URL(import.meta.url).pathname;
38
+ const currentDir = path.dirname(__filename);
39
+ const getTableCells = async (page, element, tableSelector, info = {}) => {
40
+ let script = fs.readFileSync(path.join(currentDir, "locator.js"), "utf8");
41
+ let aiConfigPath = path.join(process.cwd(), "ai_config.json");
42
+ if (fs.existsSync(aiConfigPath)) {
43
+ let aiConfig = JSON.parse(fs.readFileSync(aiConfigPath, "utf8"));
44
+ if (aiConfig.changes) {
45
+ script = script.replace("const selectors = null", "const selectors = " + stringifyObject(aiConfig.changes));
46
+ }
47
+ }
48
+ script = script.replace("const tableSelector = null", "const tableSelector = " + stringifyObject(tableSelector));
49
+ await page.evaluate(script);
50
+ try {
51
+ let result = await element.evaluate((_node) => {
52
+ console.log("tableSelector", document.tableSelector);
53
+ return document.processTableQuery(_node, document.tableSelector);
54
+ });
55
+ info.box = result.rect;
56
+ return result.cells;
57
+ }
58
+ catch (error) {
59
+ console.log("error", error);
60
+ throw error;
61
+ }
62
+ };
63
+ export { getTableCells };
64
+ //# sourceMappingURL=table_analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table_analyze.js","sourceRoot":"","sources":["../src/table_analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,SAAS,eAAe,CAAC,GAAW,EAAE,WAAW,GAAG,CAAC;IACnD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtB,MAAM,IAAI,GAAG,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;SAC1E;QACD,MAAM,IAAI,GAAG,CAAC;KACf;SAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,CAAC;QACd,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;YACnB,iDAAiD;YACjD,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBAC3B,MAAM;oBACJ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;wBACtB,MAAM;wBACN,IAAI;wBACJ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;wBACnB,IAAI;wBACJ,aAAa;wBACb,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;gBAC7C,KAAK,GAAG,KAAK,CAAC;aACf;SACF;QACD,MAAM,IAAI,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;KAC/B;SAAM;QACL,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC/B;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC5C,MAAM,aAAa,GAAG,KAAK,EAAE,IAAS,EAAE,OAAqB,EAAE,aAAiB,EAAE,OAAW,EAAE,EAAE,EAAE;IACjG,IAAI,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAC/B,IAAI,QAAQ,GAGR,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,OAAO,EAAE;YACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,oBAAoB,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;SAC7G;KACF;IACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,wBAAwB,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACjH,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI;QACF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,KAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC;KACrB;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,CAAC;KACb;AACH,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}