@empiricalrun/test-gen 0.46.2 → 0.46.3
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 +7 -0
- package/dist/agent/browsing/index.d.ts +5 -1
- package/dist/agent/browsing/index.d.ts.map +1 -1
- package/dist/agent/browsing/index.js +7 -4
- package/dist/agent/master/browser-tests/index.spec.js +31 -27
- package/dist/agent/master/run.d.ts.map +1 -1
- package/dist/agent/master/run.js +7 -1
- package/package.json +1 -1
- package/playwright.config.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,10 @@ export type BrowsingAgentOptions = Partial<TestGenConfigOptions> & {
|
|
|
7
7
|
disallowedStrings?: string[];
|
|
8
8
|
};
|
|
9
9
|
};
|
|
10
|
+
export type BrowserAgentAction = {
|
|
11
|
+
action: string;
|
|
12
|
+
code: string | undefined;
|
|
13
|
+
};
|
|
10
14
|
export declare function executeTaskUsingBrowsingAgent({ action, page, actions, llm, options, trace, }: {
|
|
11
15
|
action: string;
|
|
12
16
|
page: Page;
|
|
@@ -14,5 +18,5 @@ export declare function executeTaskUsingBrowsingAgent({ action, page, actions, l
|
|
|
14
18
|
llm: LLM;
|
|
15
19
|
trace?: TraceClient;
|
|
16
20
|
options: BrowsingAgentOptions;
|
|
17
|
-
}): Promise<
|
|
21
|
+
}): Promise<BrowserAgentAction | undefined>;
|
|
18
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,GAAG,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAQlD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG;IACjE,YAAY,CAAC,EAAE;QACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,EAClD,MAAM,EACN,IAAI,EACJ,OAAO,EACP,GAAG,EACH,OAAO,EACP,KAAK,GACN,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,iBAAiB,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,GAAG,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAQlD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG;IACjE,YAAY,CAAC,EAAE;QACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,EAClD,MAAM,EACN,IAAI,EACJ,OAAO,EACP,GAAG,EACH,OAAO,EACP,KAAK,GACN,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,iBAAiB,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAoE1C"}
|
|
@@ -9,7 +9,7 @@ const html_1 = require("../../utils/html");
|
|
|
9
9
|
const utils_1 = require("../utils");
|
|
10
10
|
const o1_completion_1 = require("./o1-completion");
|
|
11
11
|
async function executeTaskUsingBrowsingAgent({ action, page, actions, llm, options, trace, }) {
|
|
12
|
-
let generatedCodeSteps
|
|
12
|
+
let generatedCodeSteps;
|
|
13
13
|
const tools = actions.getBrowsingActionSchemas();
|
|
14
14
|
const testgenUpdatesReporter = new reporter_1.TestGenUpdatesReporter();
|
|
15
15
|
const browsingAgentSpan = trace?.span({
|
|
@@ -55,11 +55,14 @@ async function executeTaskUsingBrowsingAgent({ action, page, actions, llm, optio
|
|
|
55
55
|
const toolCallsSpan = browsingAgentSpan?.span({ name: "tool-calls" });
|
|
56
56
|
for (const i in toolCalls) {
|
|
57
57
|
const toolCall = toolCalls[i];
|
|
58
|
+
const args = (0, utils_1.parseJson)(toolCall.function.arguments);
|
|
58
59
|
try {
|
|
59
60
|
const code = await actions.executeAction(toolCall.function.name, (0, utils_1.parseJson)(toolCall.function.arguments), toolCallsSpan);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
generatedCodeSteps = {
|
|
62
|
+
// Passing reason as action, in order to pass the correct action that took place to runtime planner
|
|
63
|
+
action: args.reason,
|
|
64
|
+
code,
|
|
65
|
+
};
|
|
63
66
|
}
|
|
64
67
|
catch (e) {
|
|
65
68
|
void testgenUpdatesReporter.sendMessage(e.message);
|
|
@@ -10,27 +10,31 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
const utils_1 = require("../../browsing/utils");
|
|
11
11
|
const element_annotation_1 = require("../element-annotation");
|
|
12
12
|
const run_1 = require("../run");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
const test = test_1.test.extend({
|
|
14
|
+
server: [
|
|
15
|
+
// eslint-disable-next-line no-empty-pattern
|
|
16
|
+
async ({}, use, workerInfo) => {
|
|
17
|
+
const port = 2345 + workerInfo.workerIndex;
|
|
18
|
+
const server = http_server_1.default.createServer({
|
|
19
|
+
root: path_1.default.join(process.cwd(), "test-data"),
|
|
20
|
+
});
|
|
21
|
+
await new Promise((resolve) => {
|
|
22
|
+
server.listen(port, () => {
|
|
23
|
+
console.log(`Server running at http://localhost:${port}`);
|
|
24
|
+
resolve();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
await use({
|
|
28
|
+
port,
|
|
29
|
+
baseURL: `http://localhost:${port}`,
|
|
30
|
+
});
|
|
31
|
+
server.close();
|
|
32
|
+
},
|
|
33
|
+
{ scope: "worker" },
|
|
34
|
+
],
|
|
31
35
|
});
|
|
32
|
-
|
|
33
|
-
await page.goto(
|
|
36
|
+
test("able to scroll and interact with elements", async ({ page, server }) => {
|
|
37
|
+
await page.goto(`${server.baseURL}/blog-page.html`);
|
|
34
38
|
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
35
39
|
task: `fill test@test.com into the email field and click the submit`,
|
|
36
40
|
page,
|
|
@@ -41,8 +45,8 @@ test_1.test.afterAll(() => {
|
|
|
41
45
|
(0, test_1.expect)(response.code).toContain("await page.getByPlaceholder('Enter your email').fill(\"test@test.com\")");
|
|
42
46
|
(0, test_1.expect)(response.code).toContain("await page.getByRole('button', { name: 'Subscribe' }).click()");
|
|
43
47
|
});
|
|
44
|
-
|
|
45
|
-
await page.goto(
|
|
48
|
+
test("scroll when element does not exist", async ({ page, server }) => {
|
|
49
|
+
await page.goto(`${server.baseURL}/blog-page.html`);
|
|
46
50
|
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
47
51
|
task: `click search button`,
|
|
48
52
|
page,
|
|
@@ -52,8 +56,8 @@ test_1.test.afterAll(() => {
|
|
|
52
56
|
(0, test_1.expect)(response.importPaths.length).toBe(0);
|
|
53
57
|
(0, test_1.expect)(response.code.length).toBe(0);
|
|
54
58
|
});
|
|
55
|
-
|
|
56
|
-
await page.goto(
|
|
59
|
+
test("agent can click icons accurately", async ({ page, server }) => {
|
|
60
|
+
await page.goto(`${server.baseURL}/icons-navbar.html`);
|
|
57
61
|
await (0, test_1.expect)(page.getByText("select an icon")).toBeVisible();
|
|
58
62
|
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
59
63
|
task: `click on the gear icon`,
|
|
@@ -72,9 +76,9 @@ test_1.test.afterAll(() => {
|
|
|
72
76
|
(0, test_1.expect)(icons.length).toBe(4); // 1 for each unique icon
|
|
73
77
|
fs_1.default.unlinkSync(iconsRegistryFile);
|
|
74
78
|
});
|
|
75
|
-
|
|
79
|
+
test("annotate and enrich annotations correctly", async ({ page, server }) => {
|
|
76
80
|
await (0, utils_1.injectPwLocatorGenerator)(page);
|
|
77
|
-
await page.goto(
|
|
81
|
+
await page.goto(`${server.baseURL}/iframe-elements.html`);
|
|
78
82
|
const { annotationKeys: keys } = await (0, element_annotation_1.getAnnotationKeys)({
|
|
79
83
|
page,
|
|
80
84
|
preference: {
|
|
@@ -92,7 +96,7 @@ test_1.test.afterAll(() => {
|
|
|
92
96
|
// 2 clickable divs: 1 in main frame, 1 in iframe
|
|
93
97
|
(0, test_1.expect)(keys.filter((k) => k.text.includes("Lorem Ipsum")).length).toBe(2);
|
|
94
98
|
});
|
|
95
|
-
|
|
99
|
+
test("fill action with multiple pages", async ({ context }) => {
|
|
96
100
|
const page1 = await context.newPage();
|
|
97
101
|
const page2 = await context.newPage();
|
|
98
102
|
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAqBlC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,oBAAoB,EAErB,MAAM,aAAa,CAAC;AA6BrB,wBAAsB,0BAA0B,CAAC,EAC/C,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;;;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAqBlC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,oBAAoB,EAErB,MAAM,aAAa,CAAC;AA6BrB,wBAAsB,0BAA0B,CAAC,EAC/C,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;;;GAmYA"}
|
package/dist/agent/master/run.js
CHANGED
|
@@ -282,7 +282,7 @@ async function createTestUsingMasterAgent({ task, page, testCase, specPath, opti
|
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
else {
|
|
285
|
-
|
|
285
|
+
const browserAction = await (0, browsing_1.executeTaskUsingBrowsingAgent)({
|
|
286
286
|
trace: masterAgentActionSpan,
|
|
287
287
|
action: output.action,
|
|
288
288
|
page,
|
|
@@ -290,6 +290,12 @@ async function createTestUsingMasterAgent({ task, page, testCase, specPath, opti
|
|
|
290
290
|
llm,
|
|
291
291
|
actions,
|
|
292
292
|
});
|
|
293
|
+
if (browserAction) {
|
|
294
|
+
output.action = browserAction.action;
|
|
295
|
+
if (browserAction.code) {
|
|
296
|
+
generatedCodeSteps.push(browserAction.code);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
293
299
|
}
|
|
294
300
|
}
|
|
295
301
|
// resetting error count as there is a successful action
|
package/package.json
CHANGED