automation_model 1.0.63 → 1.0.65

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/.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/lib/auto_page.d.ts +5 -0
  6. package/build/lib/auto_page.js +56 -0
  7. package/build/lib/auto_page.js.map +1 -0
  8. package/build/lib/browser_manager.d.ts +28 -0
  9. package/build/lib/browser_manager.js +72 -0
  10. package/build/lib/browser_manager.js.map +1 -0
  11. package/build/lib/environment.d.ts +23 -0
  12. package/build/lib/environment.js +12 -0
  13. package/build/lib/environment.js.map +1 -0
  14. package/build/lib/index.js +7 -0
  15. package/build/lib/index.js.map +1 -0
  16. package/build/lib/init_browser.d.ts +7 -0
  17. package/build/lib/init_browser.js +59 -0
  18. package/build/lib/init_browser.js.map +1 -0
  19. package/build/lib/locator.d.ts +15 -0
  20. package/build/lib/locator.js +172 -0
  21. package/build/lib/locator.js.map +1 -0
  22. package/build/lib/stable_browser.d.ts +26 -0
  23. package/build/lib/stable_browser.js +526 -0
  24. package/build/lib/stable_browser.js.map +1 -0
  25. package/build/lib/table_analyze.d.ts +3 -0
  26. package/build/lib/table_analyze.js +71 -0
  27. package/build/lib/table_analyze.js.map +1 -0
  28. package/build/lib/test_context.d.ts +13 -0
  29. package/build/lib/test_context.js +12 -0
  30. package/build/lib/test_context.js.map +1 -0
  31. package/build/package.json +33 -0
  32. package/env.json +3 -0
  33. package/package.json +15 -11
  34. package/{bin/auto_page.js → src/auto_page.ts} +58 -57
  35. package/{bin/browser_manager.js → src/browser_manager.ts} +87 -78
  36. package/src/environment.ts +24 -0
  37. package/{bin/index.js → src/index.ts} +6 -6
  38. package/src/init_browser.ts +65 -0
  39. package/{bin/locator.js → src/locator.ts} +173 -159
  40. package/{bin/stable_browser.js → src/stable_browser.ts} +523 -520
  41. package/{bin/table_analyze.js → src/table_analyze.ts} +69 -61
  42. package/src/test_context.ts +16 -0
  43. package/tests/create_new_repository.test.js +62 -0
  44. package/tests/debug.test.js +41 -0
  45. package/tests/gmail_login.test.js +39 -0
  46. package/tests/launch_page.test.js +32 -0
  47. package/tests/navigate_to_new_repository_page.test.js +45 -0
  48. package/tsconfig.json +110 -0
  49. package/bin/auto_page.d.ts +0 -3
  50. package/bin/browser_manager.d.ts +0 -16
  51. package/bin/environment.d.ts +0 -4
  52. package/bin/environment.js +0 -9
  53. package/bin/init_browser.d.ts +0 -3
  54. package/bin/init_browser.js +0 -61
  55. package/bin/locator.d.ts +0 -21
  56. package/bin/stable_browser.d.ts +0 -61
  57. package/bin/table_analyze.d.ts +0 -1
  58. package/bin/test_context.d.ts +0 -6
  59. package/bin/test_context.js +0 -9
  60. /package/{bin → build/lib}/index.d.ts +0 -0
@@ -0,0 +1,38 @@
1
+ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2
+ # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3
+
4
+ name: Javascript client CI
5
+
6
+ on:
7
+ push:
8
+ branches: ["main"]
9
+ pull_request:
10
+ branches: ["main"]
11
+
12
+ jobs:
13
+ build-javascript-client:
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - uses: actions/checkout@v3
18
+ - name: Use Node.js 16.x
19
+ uses: actions/setup-node@v3
20
+ with:
21
+ node-version: 16.x
22
+ cache: "npm"
23
+ cache-dependency-path: "**/package-lock.json"
24
+ - run: npm install
25
+ working-directory: ${{ github.workspace }}
26
+ - name: Install Playwright dependencies
27
+ run: npx playwright install
28
+ working-directory: ${{ github.workspace }}
29
+ - run: npm run build
30
+ working-directory: ${{ github.workspace }}
31
+ - run: npm test
32
+ working-directory: ${{ github.workspace }}
33
+ - name: publish server to npm
34
+ uses: JS-DevTools/npm-publish@v1
35
+ with:
36
+ token: ${{ secrets.NPM_PASSWORD }}
37
+ package: ${{ github.workspace }}/build/package.json
38
+ check-version: true
@@ -0,0 +1,30 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "type": "node",
9
+ "request": "launch",
10
+ "name": "launch_page",
11
+ "skipFiles": ["<node_internals>/**"],
12
+ "program": "${workspaceFolder}/tests/launch_page.js",
13
+ // set default directory to the workspace folder
14
+ "cwd": "${workspaceFolder}",
15
+ "stopOnEntry": false,
16
+ "console": "integratedTerminal"
17
+ },
18
+ {
19
+ "type": "node",
20
+ "request": "launch",
21
+ "name": "debug",
22
+ "skipFiles": ["<node_internals>/**"],
23
+ "program": "${workspaceFolder}/tests/debug.js",
24
+ // set default directory to the workspace folder
25
+ "cwd": "${workspaceFolder}",
26
+ "stopOnEntry": false,
27
+ "console": "integratedTerminal"
28
+ }
29
+ ]
30
+ }
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # automation_model
2
+ An automation infrastructure module to be use for generative AI automation projects.
3
+
package/ai_config.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "page_timeout": 60000,
3
+ "changes": [
4
+ {
5
+ "css": "gb-side-navigation-menu-item",
6
+ "changes": {
7
+ "role": "link"
8
+ }
9
+ },
10
+ {
11
+ "css": "gb-toolbar-icon",
12
+ "changes": {
13
+ "role": "button"
14
+ }
15
+ },
16
+ {
17
+ "css": "gb-period-picker-button",
18
+ "changes": {
19
+ "role": "button"
20
+ }
21
+ },
22
+ {
23
+ "css": "gb-simple-table",
24
+ "changes": {
25
+ "role": "table"
26
+ }
27
+ },
28
+ {
29
+ "css": ".header-row",
30
+ "changes": {
31
+ "role": "row"
32
+ }
33
+ },
34
+ {
35
+ "css": ".table-row",
36
+ "changes": {
37
+ "role": "row"
38
+ }
39
+ },
40
+ {
41
+ "css": "gb-simple-data-cell",
42
+ "changes": {
43
+ "role": "cell"
44
+ }
45
+ },
46
+ {
47
+ "css": "gb-header-cell",
48
+ "changes": {
49
+ "role": "columnheader"
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,5 @@
1
+ import type { TestContext } from "./test_context.js";
2
+ declare const navigate: (path?: string) => Promise<void>;
3
+ declare const initContext: (path: string, doNavigate?: boolean, headless?: boolean, world?: any) => Promise<TestContext>;
4
+ declare const closeContext: () => Promise<void>;
5
+ export { initContext, navigate, closeContext };
@@ -0,0 +1,56 @@
1
+ import { browserManager } from "./browser_manager.js";
2
+ import { getContext } from "./init_browser.js";
3
+ import fs from "fs";
4
+ import path from "path";
5
+ let context = null;
6
+ const navigate = async (path = "") => {
7
+ let url = null;
8
+ if (path === null) {
9
+ url = context.environment.baseUrl;
10
+ }
11
+ else {
12
+ url = new URL(path, context.environment.baseUrl).href;
13
+ }
14
+ await context.stable.goto(url);
15
+ await context.stable.waitForPageLoad();
16
+ };
17
+ const _findEmptyFolder = (folder) => {
18
+ if (!folder) {
19
+ folder = "./runs";
20
+ }
21
+ if (!fs.existsSync(folder)) {
22
+ fs.mkdirSync(folder);
23
+ }
24
+ let nextIndex = 1;
25
+ while (fs.existsSync(path.join(folder, nextIndex.toString()))) {
26
+ nextIndex++;
27
+ }
28
+ return path.join(folder, nextIndex.toString());
29
+ };
30
+ const initContext = async (path, doNavigate = true, headless = false, world = null) => {
31
+ if (context) {
32
+ return context;
33
+ }
34
+ context = await getContext(null, headless);
35
+ if (world) {
36
+ world.screenshot = true;
37
+ const reportFolder = _findEmptyFolder();
38
+ if (world.attach) {
39
+ world.attach(reportFolder, { mediaType: "text/plain" });
40
+ }
41
+ world.screenshotPath = reportFolder;
42
+ context.reportFolder = reportFolder;
43
+ }
44
+ if (doNavigate) {
45
+ await navigate(path);
46
+ }
47
+ return context;
48
+ };
49
+ const closeContext = async () => {
50
+ if (context && context.browser) {
51
+ await browserManager.closeBrowser(context.browser);
52
+ }
53
+ context = null;
54
+ };
55
+ export { initContext, navigate, closeContext };
56
+ //# sourceMappingURL=auto_page.js.map
@@ -0,0 +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;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,IAAI,OAAO,GAAoB,IAAI,CAAC;AACpC,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;IACnC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,IAAI,KAAK,IAAI,EAAE;QACjB,GAAG,GAAG,OAAQ,CAAC,WAAY,CAAC,OAAQ,CAAC;KACtC;SAAM;QACL,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAQ,CAAC,WAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;KACzD;IACD,MAAM,OAAQ,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAQ,CAAC,MAAO,CAAC,eAAe,EAAE,CAAC;AAC3C,CAAC,CAAC;AACF,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC1C,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,QAAQ,CAAC;KACnB;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QAC1B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;KACtB;IACD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;QAC7D,SAAS,EAAE,CAAC;KACb;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AACF,MAAM,WAAW,GAAG,KAAK,EAAE,IAAW,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAY,IAAI,EAAE,EAAE;IAC/F,IAAI,OAAO,EAAE;QACX,OAAO,OAAO,CAAC;KAChB;IACD,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,KAAK,EAAE;QACT,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;SACzD;QACD,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;QACpC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;KACrC;IAED,IAAI,UAAU,EAAE;QACd,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;KACtB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AACF,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;IAC9B,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE;QAC9B,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KACpD;IACD,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC,CAAC;AACF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Browser as PlaywrightBrowser, BrowserContext, Page } from "playwright";
2
+ import type { Cookie, LocalStorage } from "./environment.js";
3
+ type StorageState = {
4
+ cookies: Cookie[];
5
+ origins: {
6
+ origin: string;
7
+ localStorage: LocalStorage;
8
+ }[];
9
+ };
10
+ declare class BrowserManager {
11
+ browsers: Browser[];
12
+ constructor(browsers?: Browser[]);
13
+ closeAll(): Promise<void>;
14
+ closeBrowser(browser?: PlaywrightBrowser | Browser): Promise<void>;
15
+ createBrowser(headless?: boolean, storageState?: StorageState): Promise<Browser>;
16
+ getBrowser(headless?: boolean, storageState?: StorageState): Promise<Browser>;
17
+ }
18
+ declare class Browser {
19
+ browser: PlaywrightBrowser | null;
20
+ context: BrowserContext | null;
21
+ page: Page | null;
22
+ constructor();
23
+ init(headless?: boolean, storageState?: StorageState): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ declare const browserManager: BrowserManager;
27
+ export { browserManager };
28
+ export type { BrowserManager, Browser };
@@ -0,0 +1,72 @@
1
+ import { chromium } from "playwright";
2
+ class BrowserManager {
3
+ constructor(browsers = []) {
4
+ this.browsers = browsers;
5
+ }
6
+ async closeAll() {
7
+ await Promise.all(this.browsers.map((browser) => browser.close()));
8
+ this.browsers = [];
9
+ }
10
+ async closeBrowser(browser) {
11
+ if (!browser && this.browsers.length > 0) {
12
+ browser = this.browsers[0];
13
+ }
14
+ if (browser) {
15
+ await browser.close();
16
+ for (let i = 0; i < this.browsers.length; i++) {
17
+ if (this.browsers[i].browser === browser || this.browsers[i] === browser) {
18
+ this.browsers.splice(i, 1);
19
+ i--;
20
+ break;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ async createBrowser(headless = false, storageState) {
26
+ const browser = new Browser();
27
+ await browser.init(headless, storageState);
28
+ this.browsers.push(browser);
29
+ return browser;
30
+ }
31
+ async getBrowser(headless = false, storageState) {
32
+ if (this.browsers.length === 0) {
33
+ return await this.createBrowser(headless, storageState);
34
+ }
35
+ return this.browsers[0];
36
+ }
37
+ }
38
+ class Browser {
39
+ constructor() {
40
+ this.browser = null;
41
+ this.context = null;
42
+ this.page = null;
43
+ }
44
+ async init(headless = false, storageState) {
45
+ this.browser = await chromium.launch({
46
+ headless: headless,
47
+ timeout: 0,
48
+ args: ["--ignore-https-errors"],
49
+ });
50
+ const contextOptions = !!storageState ? { storageState } : undefined;
51
+ this.context = await this.browser.newContext(contextOptions);
52
+ this.page = await this.context.newPage();
53
+ }
54
+ async close() {
55
+ if (this.browser !== null) {
56
+ await this.browser.close();
57
+ this.browser = null;
58
+ this.context = null;
59
+ this.page = null;
60
+ }
61
+ }
62
+ }
63
+ const browserManager = new BrowserManager();
64
+ export { browserManager };
65
+ // let browser = await browserManager.createBrowser();
66
+ // browser.page.goto("https://www.cnn.com");
67
+ // let browser2 = await browserManager.createBrowser();
68
+ // await browser2.page.goto("https://www.google.com");
69
+ // // sleep for 2 seconds
70
+ // await new Promise((r) => setTimeout(r, 1000));
71
+ // await browserManager.closeAll();
72
+ //# sourceMappingURL=browser_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser_manager.js","sourceRoot":"","sources":["../../src/browser_manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ type Cookie = {
2
+ name: string;
3
+ value: string;
4
+ domain?: string;
5
+ path?: string;
6
+ expires?: number;
7
+ httpOnly?: boolean;
8
+ secure?: boolean;
9
+ sameSite?: string;
10
+ };
11
+ type LocalStorage = Record<string, string>;
12
+ declare class Environment {
13
+ baseUrl?: string | undefined;
14
+ cookies: Cookie[];
15
+ origins: {
16
+ origin: string;
17
+ localStorage: LocalStorage;
18
+ }[];
19
+ constructor(baseUrl?: string | undefined);
20
+ setBaseUrl(url: string): void;
21
+ }
22
+ export { Environment };
23
+ export type { Cookie, LocalStorage };
@@ -0,0 +1,12 @@
1
+ class Environment {
2
+ constructor(baseUrl) {
3
+ this.baseUrl = baseUrl;
4
+ this.cookies = [];
5
+ this.origins = [];
6
+ }
7
+ setBaseUrl(url) {
8
+ this.baseUrl = url;
9
+ }
10
+ }
11
+ export { Environment };
12
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW;IAGf,YAAmB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAFnC,YAAO,GAAY,EAAE,CAAA;QACrB,YAAO,GAAgD,EAAE,CAAA;IAEzD,CAAC;IACD,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;CACF;AACD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "./auto_page.js";
2
+ export * from "./init_browser.js";
3
+ export * from "./stable_browser.js";
4
+ export * from "./environment.js";
5
+ export * from "./auto_page.js";
6
+ export * from "./browser_manager.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Environment } from "./environment.js";
2
+ import { TestContext } from "./test_context.js";
3
+ import { Browser as PlaywrightBrowser } from "playwright";
4
+ import { Browser } from "./browser_manager.js";
5
+ declare const getContext: (environment: Environment | null, headless?: boolean, logger?: null) => Promise<TestContext>;
6
+ declare const closeBrowser: (browser?: Browser | PlaywrightBrowser) => Promise<void>;
7
+ export { getContext, closeBrowser };
@@ -0,0 +1,59 @@
1
+ import fs from "node:fs";
2
+ import { Environment } from "./environment.js";
3
+ import { browserManager } from "./browser_manager.js";
4
+ import { TestContext } from "./test_context.js";
5
+ import { StableBrowser } from "./stable_browser.js";
6
+ // let environment = null;
7
+ // init browser create context and page, if context and page are not null
8
+ const getContext = async function (environment, headless = false, logger) {
9
+ if (environment === null) {
10
+ environment = initEnvironment();
11
+ }
12
+ const { cookies, origins } = environment;
13
+ const storageState = { cookies, origins };
14
+ let browser = await browserManager.getBrowser(headless, storageState);
15
+ let context = new TestContext();
16
+ context.browser = browser.browser;
17
+ context.playContext = browser.context;
18
+ context.page = browser.page;
19
+ context.environment = environment;
20
+ context.stable = new StableBrowser(context.browser, context.page, logger);
21
+ // await _initCookies(context);
22
+ return context;
23
+ };
24
+ // const _initCookies = async function (context) {
25
+ // if (context.environment.cookies) {
26
+ // const cookies = [];
27
+ // for (let i = 0; i < context.environment.cookies.length; i++) {
28
+ // const cookie = context.environment.cookies[i];
29
+ // if (cookie.expires && cookie.expires == "undefined") {
30
+ // delete cookie.expires;
31
+ // }
32
+ // cookies.push(cookie);
33
+ // }
34
+ // await context.playContext.addCookies(cookies);
35
+ // }
36
+ // };
37
+ const closeBrowser = async function (browser) {
38
+ await browserManager.closeBrowser(browser);
39
+ };
40
+ const initEnvironment = function () {
41
+ // if (environment === null) {
42
+ const environment = new Environment();
43
+ try {
44
+ const data = fs.readFileSync("env.json", "utf8");
45
+ //console.log("data", data);
46
+ const envObject = JSON.parse(data);
47
+ //console.log("envObject", envObject);
48
+ Object.assign(environment, envObject);
49
+ //console.log("env", environment);
50
+ console.log("Base url: " + environment.baseUrl);
51
+ }
52
+ catch (err) {
53
+ console.error("Error reading env.json", err);
54
+ }
55
+ // }
56
+ return environment;
57
+ };
58
+ export { getContext, closeBrowser };
59
+ //# sourceMappingURL=init_browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init_browser.js","sourceRoot":"","sources":["../../src/init_browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,0BAA0B;AAE1B,yEAAyE;AACzE,MAAM,UAAU,GAAG,KAAK,WAAW,WAA6B,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAa;IAC/F,IAAI,WAAW,KAAK,IAAI,EAAE;QACxB,WAAW,GAAG,eAAe,EAAE,CAAC;KACjC;IACD,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,WAAW,CAAC;IACvC,MAAM,YAAY,GAAG,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;IACxC,IAAI,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IACtC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;IAElC,OAAO,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,IAAK,EAAE,MAAM,CAAC,CAAC;IAC5E,+BAA+B;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AACF,kDAAkD;AAClD,uCAAuC;AACvC,0BAA0B;AAC1B,qEAAqE;AACrE,uDAAuD;AACvD,+DAA+D;AAC/D,iCAAiC;AACjC,UAAU;AACV,8BAA8B;AAC9B,QAAQ;AACR,qDAAqD;AACrD,MAAM;AACN,KAAK;AAEL,MAAM,YAAY,GAAG,KAAK,WAAW,OAAmC;IACtE,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,8BAA8B;IAC5B,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,IAAI;QACF,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,4BAA4B;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,sCAAsC;QACtC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;KACjD;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;KAC9C;IACH,IAAI;IACJ,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare function processTableQuery(table: Element, query: string): {
2
+ cells: any[];
3
+ error?: undefined;
4
+ rect?: undefined;
5
+ } | {
6
+ error: string;
7
+ cells?: undefined;
8
+ rect?: undefined;
9
+ } | {
10
+ cells: any[];
11
+ rect: DOMRect | null;
12
+ error?: undefined;
13
+ };
14
+ type TprocessTableQuery = typeof processTableQuery;
15
+ export type { TprocessTableQuery };
@@ -0,0 +1,172 @@
1
+ const selectors = null;
2
+ document.selectors = selectors;
3
+ const tableSelector = null;
4
+ document.tableSelector = tableSelector;
5
+ // locator | operator | value
6
+ // table.rows | >= | 1
7
+ // table[1]["Availability"].text | equals | 100%
8
+ // table[*][2].text |not_equals| error
9
+ function processTableQuery(table, query) {
10
+ if (document.selectors && document.selectors.length > 0) {
11
+ for (let i = 0; i < document.selectors.length; i++) {
12
+ const selector = document.selectors[i];
13
+ const allElementsList = document.querySelectorAll(selector.css);
14
+ const allElements = Array.from(allElementsList);
15
+ for (let j = 0; j < allElements.length; j++) {
16
+ const element = allElements[j];
17
+ element.setAttribute("data-blinq-role", selector.changes.role);
18
+ }
19
+ }
20
+ }
21
+ const rows = Array.from(table.querySelectorAll("tr, [data-blinq-role='row'], [role='row']"));
22
+ const _rows = rows.length;
23
+ const _columnNames = [];
24
+ let _columns = 0;
25
+ let columnheader = [];
26
+ if (rows.length > 0) {
27
+ //const rowheader = rows[0];
28
+ columnheader = Array.from(table.querySelectorAll("th, [data-blinq-role='columnheader'], [role='columnheader']"));
29
+ console.log("columnheader length", columnheader.length);
30
+ _columns = columnheader.length;
31
+ for (let i = 0; i < columnheader.length; i++) {
32
+ const cell = columnheader[i];
33
+ const cellText = cell.innerText;
34
+ _columnNames.push(cellText);
35
+ }
36
+ }
37
+ let _rowStartIndex = 0;
38
+ // if (columnheader.length > 0) {
39
+ // tableData.rowStartIndex = 1;
40
+ // }
41
+ const tableData = {
42
+ rows: _rows,
43
+ columns: _columns,
44
+ columnNames: _columnNames,
45
+ rowStartIndex: _rowStartIndex,
46
+ };
47
+ if (query.startsWith("table.")) {
48
+ const result = [];
49
+ const property = query.substring(6);
50
+ //console.log("property", property);
51
+ // @ts-ignore
52
+ const value = tableData[property];
53
+ //console.log("value", value);
54
+ result.push(value);
55
+ return { cells: result };
56
+ }
57
+ const pattern = /^table\[(.+)\]\[(.+)\]\.(.+)$/;
58
+ const match = query.match(pattern);
59
+ if (!match) {
60
+ return { error: "Invalid quary" };
61
+ }
62
+ const rowSelector = match[1];
63
+ let columnSelector = match[2];
64
+ const property = match[3];
65
+ let selectedRows = [];
66
+ if (rowSelector === "*") {
67
+ selectedRows = rows;
68
+ }
69
+ else {
70
+ // @ts-ignore
71
+ if (isNaN(rowSelector)) {
72
+ return { error: "Invalid row selector" };
73
+ }
74
+ const rowIndex = parseInt(rowSelector);
75
+ if (rowIndex < 0 || rowIndex >= rows.length) {
76
+ return { error: "Invalid row selector" };
77
+ }
78
+ selectedRows.push(rows[rowIndex]);
79
+ }
80
+ console.log("selectedRows count", selectedRows.length);
81
+ const selectedCells = [];
82
+ // @ts-ignore
83
+ if (isNaN(columnSelector)) {
84
+ if (columnSelector.startsWith('"') && columnSelector.endsWith('"')) {
85
+ columnSelector = columnSelector.substring(1, columnSelector.length - 1);
86
+ }
87
+ else if (columnSelector.startsWith("'") && columnSelector.endsWith("'")) {
88
+ columnSelector = columnSelector.substring(1, columnSelector.length - 1);
89
+ }
90
+ if (columnheader.length === 0) {
91
+ return { error: "No column header available" };
92
+ }
93
+ let foundHeader = null;
94
+ for (let i = 0; i < columnheader.length; i++) {
95
+ const cell = columnheader[i];
96
+ const cellText = cell.innerText;
97
+ console.log("cellText", cellText);
98
+ if (cellText === columnSelector) {
99
+ foundHeader = cell;
100
+ break;
101
+ }
102
+ }
103
+ if (!foundHeader) {
104
+ return { error: "No column header found" };
105
+ }
106
+ const foundHeaderRec = foundHeader.getBoundingClientRect();
107
+ for (let i = 0; i < selectedRows.length; i++) {
108
+ const row = selectedRows[i];
109
+ const cells = Array.from(row.querySelectorAll("td, [data-blinq-role='cell'], [role='cell']"));
110
+ console.log("cells count", cells.length);
111
+ for (let j = 0; j < cells.length; j++) {
112
+ const cell = cells[j];
113
+ const rec = cell.getBoundingClientRect();
114
+ const xCenter = rec.left + rec.width / 2;
115
+ if (foundHeaderRec.left <= xCenter && xCenter <= foundHeaderRec.right) {
116
+ selectedCells.push(cell);
117
+ }
118
+ }
119
+ }
120
+ }
121
+ else {
122
+ const columnIndex = parseInt(columnSelector);
123
+ if (columnIndex < 0 || columnIndex >= columnheader.length) {
124
+ return { error: "Column index out of bounds" };
125
+ }
126
+ for (let i = 0; i < selectedRows.length; i++) {
127
+ const row = selectedRows[i];
128
+ const cells = Array.from(row.querySelectorAll("td, [data-blinq-role='cell'], [role='cell']"));
129
+ selectedCells.push(cells[columnIndex]);
130
+ }
131
+ }
132
+ let rect = null;
133
+ const result = [];
134
+ for (let i = 0; i < selectedCells.length; i++) {
135
+ let added = false;
136
+ if (property === "element") {
137
+ added = true;
138
+ result.push(selectedCells[i]);
139
+ }
140
+ else {
141
+ if (property === "text" || property === "innerText") {
142
+ added = true;
143
+ result.push(selectedCells[i].innerText);
144
+ }
145
+ else {
146
+ if (selectedCells[i].hasAttribute(property)) {
147
+ added = true;
148
+ result.push(selectedCells[i].getAttribute(property));
149
+ }
150
+ else {
151
+ added = true;
152
+ // @ts-ignore
153
+ result.push(selectedCells[i][property]);
154
+ }
155
+ }
156
+ if (added) {
157
+ rect = rect ? merge(rect, selectedCells[i].getBoundingClientRect()) : selectedCells[i].getBoundingClientRect();
158
+ }
159
+ }
160
+ }
161
+ return { cells: result, rect };
162
+ }
163
+ const merge = (rec1, rec2) => {
164
+ const x = Math.min(rec1.left, rec2.left);
165
+ const y = Math.min(rec1.top, rec2.top);
166
+ const width = Math.max(rec1.right, rec2.right) - x;
167
+ const height = Math.max(rec1.bottom, rec2.bottom) - y;
168
+ return { x, y, width, height };
169
+ };
170
+ document.processTableQuery = processTableQuery;
171
+ export {};
172
+ //# sourceMappingURL=locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.js","sourceRoot":"","sources":["../../src/locator.ts"],"names":[],"mappings":"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"}