@dyyz1993/agent-browser 0.12.0 → 0.13.0

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 (57) hide show
  1. package/bin/agent-browser-linux-x64 +0 -0
  2. package/dist/actions.d.ts +2 -1
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +137 -24
  5. package/dist/actions.js.map +1 -1
  6. package/dist/browser.d.ts +40 -0
  7. package/dist/browser.d.ts.map +1 -1
  8. package/dist/browser.js +101 -1
  9. package/dist/browser.js.map +1 -1
  10. package/dist/cli/commands.d.ts.map +1 -1
  11. package/dist/cli/commands.js +27 -2
  12. package/dist/cli/commands.js.map +1 -1
  13. package/dist/cli/output.d.ts.map +1 -1
  14. package/dist/cli/output.js +24 -0
  15. package/dist/cli/output.js.map +1 -1
  16. package/dist/cli.js +0 -0
  17. package/dist/daemon.d.ts.map +1 -1
  18. package/dist/daemon.js +25 -1
  19. package/dist/daemon.js.map +1 -1
  20. package/dist/protocol.d.ts.map +1 -1
  21. package/dist/protocol.js +18 -0
  22. package/dist/protocol.js.map +1 -1
  23. package/dist/rc-config.d.ts.map +1 -1
  24. package/dist/rc-config.js +2 -1
  25. package/dist/rc-config.js.map +1 -1
  26. package/dist/types.d.ts +16 -1
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js.map +1 -1
  29. package/package.json +2 -1
  30. package/bin/agent-browser-darwin-arm64 +0 -0
  31. package/scripts/check_goods_container.js +0 -35
  32. package/scripts/check_page_content.js +0 -36
  33. package/scripts/click_applause_rate.js +0 -30
  34. package/scripts/explore_jd_page.js +0 -31
  35. package/scripts/extract_all_jd_data.js +0 -80
  36. package/scripts/extract_jd_product_detail.js +0 -62
  37. package/scripts/extract_jd_products_correct_links.js +0 -78
  38. package/scripts/extract_jd_products_final.js +0 -80
  39. package/scripts/extract_jd_reviews.js +0 -48
  40. package/scripts/extract_jd_seafood_final.js +0 -78
  41. package/scripts/extract_multiple_products.js +0 -77
  42. package/scripts/extract_products_no_scroll.js +0 -68
  43. package/scripts/extract_products_simple.js +0 -68
  44. package/scripts/find_applause_rate.js +0 -26
  45. package/scripts/find_jd_links.js +0 -28
  46. package/scripts/find_main_content.js +0 -20
  47. package/scripts/find_product_cards.js +0 -38
  48. package/scripts/find_root_content.js +0 -26
  49. package/scripts/find_unique_products.js +0 -55
  50. package/scripts/get_jd_product_detail.js +0 -16
  51. package/scripts/get_jd_products.js +0 -23
  52. package/scripts/get_jd_seafood_products.js +0 -44
  53. package/scripts/get_product_details_from_images.js +0 -54
  54. package/scripts/verify-form.sh +0 -67
  55. package/scripts/verify-login.sh +0 -65
  56. package/scripts/verify-recording.sh +0 -80
  57. package/scripts/verify-upload.sh +0 -41
Binary file
package/dist/actions.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { BrowserManager, ScreencastFrame } from './browser.js';
2
- import type { AnyCommand, Response } from './types.js';
2
+ import type { AnyCommand, Response, AddInitScriptCommand } from './types.js';
3
3
  /**
4
4
  * Set the callback for screencast frames
5
5
  * This is called by the daemon to set up frame streaming
@@ -47,4 +47,5 @@ export declare function toAIFriendlyError(error: unknown, selector: string): Err
47
47
  * Execute a command and return a response
48
48
  */
49
49
  export declare function executeCommand(command: AnyCommand, browser: BrowserManager): Promise<Response>;
50
+ export declare function handleAddInitScript(command: AddInitScriptCommand, browser: BrowserManager): Promise<Response>;
50
51
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAyBpE,OAAO,KAAK,EAEV,UAAU,EACV,QAAQ,EA4HT,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,GAClD,IAAI,CAEN;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChE;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,GAAG,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,qBAAqB,CAEzD;AA+BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAkEzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,CAAC,CAiRnB"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAyBpE,OAAO,KAAK,EAEV,UAAU,EACV,QAAQ,EAyFR,oBAAoB,EAoCrB,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,GAClD,IAAI,CAEN;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChE;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,GAAG,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,qBAAqB,CAEzD;AA+BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAkEzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,CAAC,CAuRnB;AAy9DD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
package/dist/actions.js CHANGED
@@ -154,6 +154,8 @@ export async function executeCommand(command, browser) {
154
154
  return await handleTabNew(cmd, browser);
155
155
  case 'tab_list':
156
156
  return await handleTabList(cmd, browser);
157
+ case 'frames':
158
+ return await handleFrames(cmd, browser);
157
159
  case 'tab_switch':
158
160
  return await handleTabSwitch(cmd, browser);
159
161
  case 'tab_close':
@@ -182,6 +184,8 @@ export async function executeCommand(command, browser) {
182
184
  return await handleUnroute(cmd, browser);
183
185
  case 'requests':
184
186
  return await handleRequests(cmd, browser);
187
+ case 'websockets':
188
+ return await handleWebSockets(cmd, browser);
185
189
  case 'download':
186
190
  return await handleDownload(cmd, browser);
187
191
  case 'geolocation':
@@ -360,6 +364,8 @@ export async function executeCommand(command, browser) {
360
364
  return await handleAsk(cmd, browser);
361
365
  case 'config':
362
366
  return handleConfig(cmd);
367
+ case 'history':
368
+ return await handleHistory(cmd, browser);
363
369
  default: {
364
370
  const unknownCommand = cmd;
365
371
  return errorResponse(unknownCommand.id, `Unknown action: ${unknownCommand.action}`);
@@ -426,6 +432,7 @@ async function handleClick(command, browser) {
426
432
  result.diff = diffResult.output;
427
433
  result.diffScope = diffResult.diff.scope;
428
434
  }
435
+ browser.recordCommand('click', command.selector, undefined, true);
429
436
  return successResponse(command.id, result);
430
437
  }
431
438
  const diffResult = await performDiff(locator, command.diffScope, async () => {
@@ -446,6 +453,7 @@ async function handleClick(command, browser) {
446
453
  result.diff = diffResult.output;
447
454
  result.diffScope = diffResult.diff.scope;
448
455
  }
456
+ browser.recordCommand('click', command.selector, undefined, true);
449
457
  return successResponse(command.id, result);
450
458
  }
451
459
  async function handleType(command, browser) {
@@ -476,6 +484,7 @@ async function handleType(command, browser) {
476
484
  result.diff = diffResult.output;
477
485
  result.diffScope = diffResult.diff.scope;
478
486
  }
487
+ browser.recordCommand('type', command.selector, command.text, true);
479
488
  return successResponse(command.id, result);
480
489
  }
481
490
  const diffResult = await performDiff(locator, command.diffScope, async () => {
@@ -499,6 +508,7 @@ async function handleType(command, browser) {
499
508
  result.diff = diffResult.output;
500
509
  result.diffScope = diffResult.diff.scope;
501
510
  }
511
+ browser.recordCommand('type', command.selector, command.text, true);
502
512
  return successResponse(command.id, result);
503
513
  }
504
514
  async function handlePress(command, browser) {
@@ -612,7 +622,6 @@ async function handleScreenshot(command, browser) {
612
622
  async function handleSnapshot(command, browser) {
613
623
  let effectiveSelector = command.selector;
614
624
  let detectionResult = null;
615
- // 如果未指定 selector,自动检测主体区域
616
625
  if (!command.selector) {
617
626
  const page = browser.getPage();
618
627
  detectionResult = await detectMainContent(page);
@@ -627,6 +636,8 @@ async function handleSnapshot(command, browser) {
627
636
  framePath: command.inFrame,
628
637
  path: command.path,
629
638
  attrs: command.attrs,
639
+ selectors: command.selectors,
640
+ all: command.all,
630
641
  });
631
642
  const simpleRefs = {};
632
643
  const refs = snapshot.refs || {};
@@ -670,9 +681,12 @@ async function handleEvaluate(command, browser) {
670
681
  const page = browser.getPage();
671
682
  result = await page.evaluate(script);
672
683
  }
684
+ browser.recordCommand('eval', 'javascript', script.length > 200 ? script.substring(0, 200) + '...' : script, true);
673
685
  return successResponse(command.id, { result });
674
686
  }
675
687
  catch (error) {
688
+ const script = command.script || command.file || '';
689
+ browser.recordCommand('eval', 'javascript', script.length > 200 ? script.substring(0, 200) + '...' : script, false);
676
690
  console.error('Error in handleEvaluate:', error);
677
691
  return errorResponse(command.id, error instanceof Error ? error.message : String(error));
678
692
  }
@@ -774,6 +788,7 @@ async function handleSelect(command, browser) {
774
788
  result.diff = diffResult.output;
775
789
  result.diffScope = diffResult.diff.scope;
776
790
  }
791
+ browser.recordCommand('select', command.selector, values.join(','), true);
777
792
  return successResponse(command.id, result);
778
793
  }
779
794
  async function handleHover(command, browser) {
@@ -850,6 +865,16 @@ async function handleTabList(command, browser) {
850
865
  active: browser.getActiveIndex(),
851
866
  });
852
867
  }
868
+ async function handleFrames(command, browser) {
869
+ const frames = browser.listFrames();
870
+ if (frames.length === 0) {
871
+ return successResponse(command.id, {
872
+ frames: [],
873
+ tip: 'No iframes found on this page.',
874
+ });
875
+ }
876
+ return successResponse(command.id, { frames });
877
+ }
853
878
  async function handleTabSwitch(command, browser) {
854
879
  const result = await browser.switchTo(command.index);
855
880
  const page = browser.getPage();
@@ -898,6 +923,7 @@ async function handleFill(command, browser) {
898
923
  result.diff = diffResult.output;
899
924
  result.diffScope = diffResult.diff.scope;
900
925
  }
926
+ browser.recordCommand('fill', command.selector, command.value, true);
901
927
  return successResponse(command.id, result);
902
928
  }
903
929
  const diffResult = await performDiff(locator, command.diffScope, async () => {
@@ -925,6 +951,7 @@ async function handleFill(command, browser) {
925
951
  result.diff = diffResult.output;
926
952
  result.diffScope = diffResult.diff.scope;
927
953
  }
954
+ browser.recordCommand('fill', command.selector, command.value, true);
928
955
  return successResponse(command.id, result);
929
956
  }
930
957
  async function handleCheck(command, browser) {
@@ -948,6 +975,7 @@ async function handleCheck(command, browser) {
948
975
  result.diff = diffResult.output;
949
976
  result.diffScope = diffResult.diff.scope;
950
977
  }
978
+ browser.recordCommand('check', command.selector, undefined, true);
951
979
  return successResponse(command.id, result);
952
980
  }
953
981
  async function handleUncheck(command, browser) {
@@ -971,6 +999,7 @@ async function handleUncheck(command, browser) {
971
999
  result.diff = diffResult.output;
972
1000
  result.diffScope = diffResult.diff.scope;
973
1001
  }
1002
+ browser.recordCommand('uncheck', command.selector, undefined, true);
974
1003
  return successResponse(command.id, result);
975
1004
  }
976
1005
  async function handleUpload(command, browser) {
@@ -1069,32 +1098,85 @@ async function handleGetByRole(command, browser) {
1069
1098
  name: command.name,
1070
1099
  exact: command.exact,
1071
1100
  });
1072
- switch (command.subaction) {
1073
- case 'click':
1074
- await locator.click();
1075
- return successResponse(command.id, { clicked: true });
1076
- case 'fill':
1077
- await locator.fill(command.value ?? '');
1078
- return successResponse(command.id, { filled: true });
1079
- case 'check':
1080
- await locator.check();
1081
- return successResponse(command.id, { checked: true });
1082
- case 'hover':
1083
- await locator.hover();
1084
- return successResponse(command.id, { hovered: true });
1101
+ try {
1102
+ switch (command.subaction) {
1103
+ case 'click':
1104
+ await locator.click();
1105
+ return successResponse(command.id, { clicked: true });
1106
+ case 'fill':
1107
+ await locator.fill(command.value ?? '');
1108
+ return successResponse(command.id, { filled: true });
1109
+ case 'check':
1110
+ await locator.check();
1111
+ return successResponse(command.id, { checked: true });
1112
+ case 'hover':
1113
+ await locator.hover();
1114
+ return successResponse(command.id, { hovered: true });
1115
+ }
1085
1116
  }
1117
+ catch (error) {
1118
+ const msg = error instanceof Error ? error.message : String(error);
1119
+ if (msg.includes('strict mode violation')) {
1120
+ const countMatch = msg.match(/resolved to (\d+) elements/);
1121
+ const count = countMatch ? countMatch[1] : 'multiple';
1122
+ const first = locator.first();
1123
+ const warning = `Matched ${count} elements, used first match. Use 'find nth <index> role "${command.role}" --click' for a specific match.`;
1124
+ switch (command.subaction) {
1125
+ case 'click':
1126
+ await first.click();
1127
+ return successResponse(command.id, { clicked: true, warning });
1128
+ case 'fill':
1129
+ await first.fill(command.value ?? '');
1130
+ return successResponse(command.id, { filled: true, warning });
1131
+ case 'check':
1132
+ await first.check();
1133
+ return successResponse(command.id, { checked: true, warning });
1134
+ case 'hover':
1135
+ await first.hover();
1136
+ return successResponse(command.id, { hovered: true, warning });
1137
+ }
1138
+ }
1139
+ throw error;
1140
+ }
1141
+ return successResponse(command.id, {});
1086
1142
  }
1087
1143
  async function handleGetByText(command, browser) {
1088
1144
  const frame = browser.getFrame(command.inFrame);
1089
1145
  const locator = frame.getByText(command.text, { exact: command.exact });
1090
- switch (command.subaction) {
1091
- case 'click':
1092
- await locator.click();
1093
- return successResponse(command.id, { clicked: true });
1094
- case 'hover':
1095
- await locator.hover();
1096
- return successResponse(command.id, { hovered: true });
1146
+ try {
1147
+ switch (command.subaction) {
1148
+ case 'click':
1149
+ await locator.click();
1150
+ return successResponse(command.id, { clicked: true });
1151
+ case 'hover':
1152
+ await locator.hover();
1153
+ return successResponse(command.id, { hovered: true });
1154
+ }
1097
1155
  }
1156
+ catch (error) {
1157
+ const msg = error instanceof Error ? error.message : String(error);
1158
+ if (msg.includes('strict mode violation')) {
1159
+ const countMatch = msg.match(/resolved to (\d+) elements/);
1160
+ const count = countMatch ? countMatch[1] : 'multiple';
1161
+ const first = locator.first();
1162
+ switch (command.subaction) {
1163
+ case 'click':
1164
+ await first.click();
1165
+ return successResponse(command.id, {
1166
+ clicked: true,
1167
+ warning: `Matched ${count} elements, used first match. Use 'find nth <index> text "${command.text}" --click' for a specific match.`,
1168
+ });
1169
+ case 'hover':
1170
+ await first.hover();
1171
+ return successResponse(command.id, {
1172
+ hovered: true,
1173
+ warning: `Matched ${count} elements, used first match. Use 'find nth <index> text "${command.text}" --hover' for a specific match.`,
1174
+ });
1175
+ }
1176
+ }
1177
+ throw error;
1178
+ }
1179
+ return successResponse(command.id, {});
1098
1180
  }
1099
1181
  async function handleGetByLabel(command, browser) {
1100
1182
  const frame = browser.getFrame(command.inFrame);
@@ -1234,6 +1316,20 @@ async function handleRequests(command, browser) {
1234
1316
  }
1235
1317
  return successResponse(command.id, result);
1236
1318
  }
1319
+ async function handleWebSockets(command, browser) {
1320
+ if (command.clear) {
1321
+ browser.clearWebSockets();
1322
+ return successResponse(command.id, { cleared: true });
1323
+ }
1324
+ const wasTracking = browser.wsTrackingEnabled;
1325
+ browser.startWebSocketTracking();
1326
+ const sockets = browser.getWebSockets(command.filter);
1327
+ const result = { websockets: sockets };
1328
+ if (sockets.length === 0 && !wasTracking) {
1329
+ result.hint = 'WebSocket tracking just activated. Reload or navigate to capture connections.';
1330
+ }
1331
+ return successResponse(command.id, result);
1332
+ }
1237
1333
  async function handleDownload(command, browser) {
1238
1334
  const page = browser.getPage();
1239
1335
  const locator = browser.getLocator(command.selector, command.inFrame);
@@ -1807,10 +1903,19 @@ async function handleScrollIntoView(command, browser) {
1807
1903
  await page.locator(command.selector).scrollIntoViewIfNeeded();
1808
1904
  return successResponse(command.id, { scrolled: true });
1809
1905
  }
1810
- async function handleAddInitScript(command, browser) {
1811
- const context = browser.getPage().context();
1906
+ export async function handleAddInitScript(command, browser) {
1907
+ const page = browser.getPage();
1908
+ const context = page.context();
1812
1909
  await context.addInitScript(command.script);
1813
- return successResponse(command.id, { added: true });
1910
+ const tips = [];
1911
+ try {
1912
+ await page.evaluate(command.script);
1913
+ }
1914
+ catch (e) {
1915
+ const msg = e instanceof Error ? e.message : String(e);
1916
+ tips.push(`Init script error on current page: ${msg}. Script will work on next navigation.`);
1917
+ }
1918
+ return successResponse(command.id, { added: true }, tips.length ? tips : undefined);
1814
1919
  }
1815
1920
  async function handleKeyDown(command, browser) {
1816
1921
  const page = browser.getPage();
@@ -2257,4 +2362,12 @@ function handleConfig(command) {
2257
2362
  ];
2258
2363
  return successResponse(command.id, { config, output: lines.join('\n') });
2259
2364
  }
2365
+ async function handleHistory(command, browser) {
2366
+ if (command.clear) {
2367
+ browser.clearHistory();
2368
+ return successResponse(command.id, { cleared: true });
2369
+ }
2370
+ const history = browser.getHistory(command.filter);
2371
+ return successResponse(command.id, { history });
2372
+ }
2260
2373
  //# sourceMappingURL=actions.js.map