@empiricalrun/test-gen 0.10.0 → 0.10.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @empiricalrun/test-gen
2
2
 
3
+ ## 0.10.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 4c9f5a6: fix: inject pw locator script on page.goto
8
+ - 5763c7e: fix: remove hasText filter from assert action
9
+
10
+ ## 0.10.1
11
+
12
+ ### Patch Changes
13
+
14
+ - dbacd41: chore: browsing agent should bubble up exit on error
15
+ - 7b7d1fe: chore: remove redundant try-catch from browsing agent
16
+
3
17
  ## 0.10.0
4
18
 
5
19
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"assertTextVisibility.d.ts","sourceRoot":"","sources":["../../src/actions/assertTextVisibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAGrD,eAAO,MAAM,6CAA6C,2BAChC,CAAC;AAE3B,eAAO,MAAM,mCAAmC,EAAE,yBA8DjD,CAAC"}
1
+ {"version":3,"file":"assertTextVisibility.d.ts","sourceRoot":"","sources":["../../src/actions/assertTextVisibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAGrD,eAAO,MAAM,6CAA6C,2BAChC,CAAC;AAE3B,eAAO,MAAM,mCAAmC,EAAE,yBAmDjD,CAAC"}
@@ -7,14 +7,8 @@ const assertTextVisibilityActionGenerator = (page) => {
7
7
  return {
8
8
  execute: async (args) => {
9
9
  const css = args.css_selector;
10
- const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(args.css_selector, page, {
11
- hasText: args.text,
12
- });
13
- await page
14
- .locator(css)
15
- .filter({ hasText: args.text })
16
- .first()
17
- .isVisible({ timeout: 3000 });
10
+ const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(args.css_selector, page);
11
+ await page.locator(css).first().isVisible({ timeout: 3000 });
18
12
  return {
19
13
  locator,
20
14
  };
@@ -22,7 +16,7 @@ const assertTextVisibilityActionGenerator = (page) => {
22
16
  // TODO: args transformer to be kept at a single place
23
17
  template: (args, options) => {
24
18
  const css = args.css_selector;
25
- const assertStr = `await expect(page.locator("${css}").filter({ hasText: "${args.text}"}).first()).toBeVisible();`;
19
+ const assertStr = `await expect(page.locator("${css}")).toBeVisible();`;
26
20
  if (options?.locator) {
27
21
  return `
28
22
  // ${assertStr}
@@ -40,10 +34,6 @@ const assertTextVisibilityActionGenerator = (page) => {
40
34
  parameters: {
41
35
  type: "object",
42
36
  properties: {
43
- text: {
44
- type: "string",
45
- description: "text to be asserted",
46
- },
47
37
  css_selector: {
48
38
  type: "string",
49
39
  description: "CSS selector to identify the element uniquely and click it. When creating CSS selectors, ensure they are unique and specific enough to select only one element, even if there are multiple elements of the same type (like multiple h1 elements)",
@@ -53,7 +43,7 @@ const assertTextVisibilityActionGenerator = (page) => {
53
43
  description: "reason for calling this function",
54
44
  },
55
45
  },
56
- required: ["css_selector", "text", "reason"],
46
+ required: ["css_selector", "reason"],
57
47
  },
58
48
  },
59
49
  },
@@ -1 +1 @@
1
- {"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../src/actions/goto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,yBAoCjC,CAAC"}
1
+ {"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../src/actions/goto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,yBAqCjC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.gotoActionGenerator = exports.PLAYWRIGHT_GOTO_ACTION_NAME = void 0;
4
+ const utils_1 = require("../agent/browsing/utils");
4
5
  exports.PLAYWRIGHT_GOTO_ACTION_NAME = "page_goto";
5
6
  const gotoActionGenerator = (page) => {
6
7
  return {
@@ -8,6 +9,7 @@ const gotoActionGenerator = (page) => {
8
9
  const url = args.url;
9
10
  await page.goto(url);
10
11
  await page.waitForTimeout(3000);
12
+ await (0, utils_1.injectPwLocatorGenerator)(page);
11
13
  },
12
14
  // TODO: args transformer to be kept at a single place
13
15
  template: (args) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAWlC,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,YAAY,CAAC,EAAE;QACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACE,mBA4DP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYlC,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,YAAY,CAAC,EAAE;QACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACE,mBAwDP"}
@@ -10,6 +10,7 @@ const provider_1 = require("../../bin/ai/prompts/provider");
10
10
  const trace_1 = __importDefault(require("../../bin/ai/trace"));
11
11
  const logger_1 = require("../../bin/logger");
12
12
  const html_1 = require("../../utils/html");
13
+ const utils_1 = require("./utils");
13
14
  const logger = new logger_1.CustomLogger();
14
15
  async function browsingAgent(task, page, options = {}) {
15
16
  const trace = new trace_1.default({ name: "browsing-agent" });
@@ -17,11 +18,7 @@ async function browsingAgent(task, page, options = {}) {
17
18
  const tools = actions.getActionSchemas();
18
19
  let isTaskDone = false;
19
20
  const previousActions = [];
20
- const resp = await fetch("https://assets-test.empirical.run/pw-selector.js");
21
- const script = await resp.text();
22
- await page.addScriptTag({
23
- content: script,
24
- });
21
+ await (0, utils_1.injectPwLocatorGenerator)(page);
25
22
  let lastActionErrors = [];
26
23
  // await page.waitForTimeout(3_00_000)
27
24
  while (!isTaskDone) {
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/run.ts"],"names":[],"mappings":"AAOA,wBAAsB,+BAA+B,CAAC,YAAY,EAAE,MAAM,iBAwBzE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/run.ts"],"names":[],"mappings":"AAOA,wBAAsB,+BAA+B,CAAC,YAAY,EAAE,MAAM,iBAsBzE"}
@@ -14,25 +14,22 @@ async function generateTestsUsingBrowsingAgent(testFilePath) {
14
14
  const port = await (0, detect_port_1.default)(3030);
15
15
  const fileService = new server_1.FileService({ port });
16
16
  await fileService.startFileService();
17
- try {
18
- fileService.setFilePath(testFilePath);
19
- //TODO: change this to per test
20
- //TODO: support multiple projects (browsers)
21
- const command = [`npx`, `playwright`, `test`, testFilePath];
22
- if (!process.env.CI) {
23
- command.push(`--headed`);
24
- }
25
- await (0, exec_1.cmd)(command, {
26
- env: {
27
- APP_PORT: port.toString(),
28
- PW_TEST_HTML_REPORT_OPEN: "never",
29
- },
30
- });
31
- await (0, web_1.removeTestOnly)(testFilePath);
17
+ fileService.setFilePath(testFilePath);
18
+ //TODO: change this to per test
19
+ //TODO: support multiple projects (browsers)
20
+ let command = `npx playwright test ${testFilePath} --retries 0`;
21
+ if (!process.env.CI) {
22
+ command = command.concat(` --headed`);
32
23
  }
33
- catch (e) {
34
- // TODO: better error handling -- e.g. undo preparation work
35
- console.error(e);
24
+ const exitCode = await (0, exec_1.cmd)(command.split(" "), {
25
+ env: {
26
+ APP_PORT: port.toString(),
27
+ PW_TEST_HTML_REPORT_OPEN: "never",
28
+ },
29
+ });
30
+ if (exitCode != 0) {
31
+ process.exit(exitCode);
36
32
  }
33
+ await (0, web_1.removeTestOnly)(testFilePath);
37
34
  }
38
35
  exports.generateTestsUsingBrowsingAgent = generateTestsUsingBrowsingAgent;
@@ -1,4 +1,6 @@
1
+ import { Page } from "playwright";
1
2
  import { TestGenConfig } from "../../types";
2
3
  export declare function prepareFileForBrowsingAgent(genConfig: TestGenConfig): Promise<void>;
4
+ export declare function injectPwLocatorGenerator(page: Page): Promise<void>;
3
5
  export declare function canRunBrowsingAgent(filePath: string): void;
4
6
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,aAAa,iBAiBzE;AAWD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,QA4BnD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIlC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,aAAa,iBAiBzE;AAWD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,iBAMxD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,QA4BnD"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.canRunBrowsingAgent = exports.prepareFileForBrowsingAgent = void 0;
6
+ exports.canRunBrowsingAgent = exports.injectPwLocatorGenerator = exports.prepareFileForBrowsingAgent = void 0;
7
7
  const child_process_1 = require("child_process");
8
8
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
9
  const logger_1 = require("../../bin/logger");
@@ -29,6 +29,14 @@ ${steps}\`, page, test);
29
29
  });
30
30
  `;
31
31
  }
32
+ async function injectPwLocatorGenerator(page) {
33
+ const resp = await fetch("https://assets-test.empirical.run/pw-selector.js");
34
+ const script = await resp.text();
35
+ await page.addScriptTag({
36
+ content: script,
37
+ });
38
+ }
39
+ exports.injectPwLocatorGenerator = injectPwLocatorGenerator;
32
40
  function canRunBrowsingAgent(filePath) {
33
41
  if (!fs_extra_1.default.existsSync(filePath)) {
34
42
  throw new Error(`File for browsing agent to run not found: ${filePath}`);
@@ -1,4 +1,4 @@
1
1
  export declare function cmd(command: string[], options: {
2
2
  env?: Record<string, string>;
3
- }): Promise<string | number>;
3
+ }): Promise<number>;
4
4
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAGA,wBAAgB,GAAG,CACjB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAe1B"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAGA,wBAAgB,GAAG,CACjB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,CAAC,CAejB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-gen",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"