@letsscrapedata/controller 0.0.1 → 0.0.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.
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -27,12 +28,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
28
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
29
  mod
29
30
  ));
31
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
32
 
31
33
  // ../../node_modules/boolbase/index.js
32
34
  var require_boolbase = __commonJS({
33
- "../../node_modules/boolbase/index.js"(exports, module) {
35
+ "../../node_modules/boolbase/index.js"(exports2, module2) {
34
36
  "use strict";
35
- module.exports = {
37
+ module2.exports = {
36
38
  trueFunc: function trueFunc2() {
37
39
  return true;
38
40
  },
@@ -43,6 +45,23 @@ var require_boolbase = __commonJS({
43
45
  }
44
46
  });
45
47
 
48
+ // src/index.ts
49
+ var src_exports = {};
50
+ __export(src_exports, {
51
+ CheerioElement: () => CheerioElement,
52
+ CheerioPage: () => CheerioPage,
53
+ PlaywrightBrowser: () => PlaywrightBrowser,
54
+ PlaywrightBrowserContext: () => PlaywrightBrowserContext,
55
+ PlaywrightElement: () => PlaywrightElement,
56
+ PlaywrightPage: () => PlaywrightPage,
57
+ PuppeteerBrowser: () => PuppeteerBrowser,
58
+ PuppeteerBrowserContext: () => PuppeteerBrowserContext,
59
+ PuppeteerElement: () => PuppeteerElement,
60
+ PuppeteerPage: () => PuppeteerPage,
61
+ defaultProxy: () => defaultProxy
62
+ });
63
+ module.exports = __toCommonJS(src_exports);
64
+
46
65
  // src/types/types.ts
47
66
  var defaultProxy = {
48
67
  server: "default",
@@ -54,18 +73,18 @@ var defaultProxy = {
54
73
  };
55
74
 
56
75
  // src/playwright/browser.ts
57
- import EventEmitter3 from "events";
76
+ var import_node_events3 = __toESM(require("events"), 1);
58
77
 
59
78
  // src/playwright/context.ts
60
- import EventEmitter2 from "events";
61
- import { getCurrentUnixTime as getCurrentUnixTime2, logerr as logerr2, loginfo as loginfo2, logwarn as logwarn2, sleep } from "@letsscrapedata/utils";
79
+ var import_node_events2 = __toESM(require("events"), 1);
80
+ var import_utils3 = require("@letsscrapedata/utils");
62
81
 
63
82
  // src/playwright/page.ts
64
- import EventEmitter from "events";
65
- import { getCurrentUnixTime, logerr, loginfo, logwarn, unreachable as unreachable2 } from "@letsscrapedata/utils";
83
+ var import_node_events = __toESM(require("events"), 1);
84
+ var import_utils2 = require("@letsscrapedata/utils");
66
85
 
67
86
  // src/playwright/element.ts
68
- import { unreachable } from "@letsscrapedata/utils";
87
+ var import_utils = require("@letsscrapedata/utils");
69
88
  var PlaywrightElement = class _PlaywrightElement {
70
89
  #frame;
71
90
  #locator;
@@ -281,39 +300,21 @@ var PlaywrightElement = class _PlaywrightElement {
281
300
  }
282
301
  break;
283
302
  default:
284
- unreachable(type);
303
+ (0, import_utils.unreachable)(type);
285
304
  }
286
305
  return true;
287
306
  }
288
307
  async screenshot(options) {
289
308
  return await this.#locator.screenshot(options);
290
309
  }
291
- async scrollBy(x, y) {
292
- await this.#locator.page().evaluate(
293
- ([x2, y2]) => {
294
- window.scrollBy(x2, y2);
295
- },
296
- [x, y]
297
- );
298
- return true;
299
- }
300
310
  async scrollIntoView() {
301
311
  await this.#locator.scrollIntoViewIfNeeded();
302
312
  return true;
303
313
  }
304
- async scrollTo(x, y) {
305
- await this.#locator.page().evaluate(
306
- ([x2, y2]) => {
307
- window.scrollTo(x2, y2);
308
- },
309
- [x, y]
310
- );
311
- return true;
312
- }
313
314
  };
314
315
 
315
316
  // src/playwright/page.ts
316
- var PlaywrightPage = class extends EventEmitter {
317
+ var PlaywrightPage = class extends import_node_events.default {
317
318
  #lsdBrowserContext;
318
319
  #page;
319
320
  #status;
@@ -335,7 +336,7 @@ var PlaywrightPage = class extends EventEmitter {
335
336
  const cookieItems = await this.#getCookies(page);
336
337
  const domainSet = new Set(cookieItems.map((c) => c.domain));
337
338
  if (domainSet.size !== 1) {
338
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
339
+ (0, import_utils2.logwarn)(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
339
340
  }
340
341
  for (const domain of domainSet.values()) {
341
342
  await browserContext.clearCookies({ domain });
@@ -487,9 +488,9 @@ var PlaywrightPage = class extends EventEmitter {
487
488
  const page = this.#page;
488
489
  const pageId = this.#pageId;
489
490
  page.on("close", async () => {
490
- loginfo(`##browser ${pageId} closed`);
491
+ (0, import_utils2.loginfo)(`##browser ${pageId} closed`);
491
492
  if (!page.pageInfo) {
492
- logerr(`Logic error in page.on("close")`);
493
+ (0, import_utils2.logerr)(`Logic error in page.on("close")`);
493
494
  }
494
495
  this.emit("pageClose");
495
496
  this.#lsdBrowserContext.emit("pageClose", this);
@@ -503,12 +504,12 @@ var PlaywrightPage = class extends EventEmitter {
503
504
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
504
505
  pageInfo.openType = "popup";
505
506
  } else {
506
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
507
+ (0, import_utils2.logerr)(`##browser ${pageId} has popup without page.pageInfo`);
507
508
  }
508
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
509
+ (0, import_utils2.loginfo)(`##browser ${pageId} has popup ${popupPageId}`);
509
510
  this.emit("pagePopup", pageInfo);
510
511
  } else {
511
- logerr(`##browser ${pageId} has popup page with null page`);
512
+ (0, import_utils2.logerr)(`##browser ${pageId} has popup page with null page`);
512
513
  }
513
514
  });
514
515
  }
@@ -520,7 +521,7 @@ var PlaywrightPage = class extends EventEmitter {
520
521
  this.#lsdBrowserContext = browserContext;
521
522
  this.#page = page;
522
523
  this.#status = "free";
523
- const currentTime = getCurrentUnixTime();
524
+ const currentTime = (0, import_utils2.getCurrentUnixTime)();
524
525
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0 } = pageInfo ? pageInfo : {};
525
526
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId };
526
527
  this.#pageId = `page${browserIdx}-${browserContextIdx}-${pageIdx}`;
@@ -568,7 +569,7 @@ var PlaywrightPage = class extends EventEmitter {
568
569
  }
569
570
  return true;
570
571
  } catch (err) {
571
- logerr(err);
572
+ (0, import_utils2.logerr)(err);
572
573
  return false;
573
574
  }
574
575
  }
@@ -666,12 +667,19 @@ var PlaywrightPage = class extends EventEmitter {
666
667
  await this.clearResponseInterceptions();
667
668
  return true;
668
669
  }
670
+ #getWaitUntil(origWaitUntil) {
671
+ if (origWaitUntil === "networkidle0" || origWaitUntil === "networkidle2") {
672
+ return "networkidle";
673
+ } else {
674
+ return origWaitUntil;
675
+ }
676
+ }
669
677
  async goto(url, options) {
670
678
  if (!this.#page) {
671
679
  throw new Error("No valid page");
672
680
  }
673
681
  if (options) {
674
- const { referer, timeout, waitUntil } = options;
682
+ const { referer, timeout, waitUntil = "load" } = options;
675
683
  const newOptions = {};
676
684
  if (referer) {
677
685
  newOptions.referer = referer;
@@ -679,9 +687,7 @@ var PlaywrightPage = class extends EventEmitter {
679
687
  if (timeout) {
680
688
  newOptions.timeout = timeout;
681
689
  }
682
- if (waitUntil && waitUntil !== "commit") {
683
- newOptions.waitUntil = waitUntil === "networkidle" ? "networkidle0" : waitUntil;
684
- }
690
+ newOptions.waitUntil = this.#getWaitUntil(waitUntil);
685
691
  await this.#page.goto(url, newOptions);
686
692
  } else {
687
693
  await this.#page.goto(url);
@@ -752,6 +758,30 @@ var PlaywrightPage = class extends EventEmitter {
752
758
  }
753
759
  return await this.#page.screenshot(options);
754
760
  }
761
+ async scrollBy(x, y) {
762
+ if (!this.#page) {
763
+ throw new Error("No valid page");
764
+ }
765
+ await this.#page.evaluate(
766
+ ([x2, y2]) => {
767
+ window.scrollBy(x2, y2);
768
+ },
769
+ [x, y]
770
+ );
771
+ return true;
772
+ }
773
+ async scrollTo(x, y) {
774
+ if (!this.#page) {
775
+ throw new Error("No valid page");
776
+ }
777
+ await this.#page.evaluate(
778
+ ([x2, y2]) => {
779
+ window.scrollTo(x2, y2);
780
+ },
781
+ [x, y]
782
+ );
783
+ return true;
784
+ }
755
785
  async setCookies(cookies) {
756
786
  if (!this.#page) {
757
787
  throw new Error("No valid page");
@@ -812,7 +842,7 @@ var PlaywrightPage = class extends EventEmitter {
812
842
  }
813
843
  return true;
814
844
  } catch (err) {
815
- logerr(err);
845
+ (0, import_utils2.logerr)(err);
816
846
  return false;
817
847
  }
818
848
  }
@@ -822,7 +852,7 @@ var PlaywrightPage = class extends EventEmitter {
822
852
  }
823
853
  const actOptions = Array.isArray(options) ? options : [options];
824
854
  if (actOptions.length <= 0) {
825
- logwarn("Invalid paras in setRequestInterception");
855
+ (0, import_utils2.logwarn)("Invalid paras in setRequestInterception");
826
856
  return false;
827
857
  }
828
858
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -833,7 +863,7 @@ var PlaywrightPage = class extends EventEmitter {
833
863
  this.#resquestInterceptionOptions.push(option);
834
864
  break;
835
865
  default:
836
- unreachable2(option.action);
866
+ (0, import_utils2.unreachable)(option.action);
837
867
  }
838
868
  }
839
869
  if (firstRequestInterception && this.#resquestInterceptionOptions.length > 0) {
@@ -857,7 +887,7 @@ var PlaywrightPage = class extends EventEmitter {
857
887
  });
858
888
  break;
859
889
  default:
860
- unreachable2(action);
890
+ (0, import_utils2.unreachable)(action);
861
891
  }
862
892
  return true;
863
893
  } else {
@@ -866,7 +896,7 @@ var PlaywrightPage = class extends EventEmitter {
866
896
  await route.continue();
867
897
  return true;
868
898
  } catch (err) {
869
- logerr(err);
899
+ (0, import_utils2.logerr)(err);
870
900
  return false;
871
901
  }
872
902
  });
@@ -884,7 +914,7 @@ var PlaywrightPage = class extends EventEmitter {
884
914
  return;
885
915
  }
886
916
  for (const option of this.#responseInterceptionOptions) {
887
- const { requestMatch, responseMatch, cacheArray, handler, handlerOptions } = option;
917
+ const { requestMatch, responseMatch, responseItems, handler, handlerOptions } = option;
888
918
  let matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
889
919
  if (matchedFlag && responseMatch) {
890
920
  const { minLength, maxLength } = responseMatch;
@@ -897,20 +927,20 @@ var PlaywrightPage = class extends EventEmitter {
897
927
  if (!matchedFlag) {
898
928
  continue;
899
929
  }
900
- if (Array.isArray(cacheArray)) {
930
+ if (Array.isArray(responseItems)) {
901
931
  const requestMethod = request.method();
902
932
  const requestUrl = request.url();
903
933
  const reqData2 = request.postData();
904
934
  const requestData = reqData2 ? reqData2 : "";
905
935
  const responseData = await response.text();
906
- cacheArray.push({
936
+ responseItems.push({
907
937
  pageUrl,
908
938
  requestMethod,
909
939
  requestUrl,
910
940
  requestData,
911
941
  responseData
912
942
  });
913
- loginfo(`##browser cache matched response: ${requestUrl}`);
943
+ (0, import_utils2.loginfo)(`##browser cache matched response: ${requestUrl}`);
914
944
  }
915
945
  if (typeof handler === "function") {
916
946
  await handler(response, handlerOptions);
@@ -918,7 +948,7 @@ var PlaywrightPage = class extends EventEmitter {
918
948
  }
919
949
  return;
920
950
  } catch (err) {
921
- logerr(err);
951
+ (0, import_utils2.logerr)(err);
922
952
  return;
923
953
  }
924
954
  }
@@ -933,7 +963,7 @@ var PlaywrightPage = class extends EventEmitter {
933
963
  }
934
964
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
935
965
  for (const option of actOptions) {
936
- if (option?.cacheArray || option?.handler) {
966
+ if (option?.responseItems || option?.handler) {
937
967
  this.#responseInterceptionOptions.push(option);
938
968
  } else {
939
969
  throw new Error(`Invalid ResponseInterceptionOption`);
@@ -990,6 +1020,30 @@ var PlaywrightPage = class extends EventEmitter {
990
1020
  this.#status = "busy";
991
1021
  return true;
992
1022
  }
1023
+ async waitForElement(selector, options = {}) {
1024
+ if (!this.#page) {
1025
+ throw new Error("No valid page");
1026
+ }
1027
+ const locator = this.#page.locator(selector);
1028
+ const { timeout = 3e4, state = "visible" } = options;
1029
+ await locator.waitFor({ state, timeout });
1030
+ return true;
1031
+ }
1032
+ async waitForNavigation(options) {
1033
+ if (!this.#page) {
1034
+ throw new Error("No valid page");
1035
+ }
1036
+ const { url = "", timeout = 3e4, waitUntil = "load" } = options;
1037
+ const newWaitUntil = this.#getWaitUntil(waitUntil);
1038
+ if (url) {
1039
+ await this.#page.waitForURL(url, { timeout, waitUntil: newWaitUntil });
1040
+ } else if (newWaitUntil === "commit") {
1041
+ throw new Error("commit is not supported in PlaywrightPage.waitForNavigation");
1042
+ } else {
1043
+ await this.#page.waitForLoadState(newWaitUntil, { timeout });
1044
+ }
1045
+ return true;
1046
+ }
993
1047
  async windowMember(keys) {
994
1048
  if (!this.#page) {
995
1049
  throw new Error("No valid page");
@@ -1018,7 +1072,7 @@ var PlaywrightPage = class extends EventEmitter {
1018
1072
  };
1019
1073
 
1020
1074
  // src/playwright/context.ts
1021
- var PlaywrightBrowserContext = class extends EventEmitter2 {
1075
+ var PlaywrightBrowserContext = class extends import_node_events2.default {
1022
1076
  #lsdBrowser;
1023
1077
  #browserIdx;
1024
1078
  #browserContextIdx;
@@ -1037,12 +1091,12 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1037
1091
  }
1038
1092
  const pages = this.#browserContext.pages();
1039
1093
  const openType = this.#lsdBrowser.browserCreationMethod();
1040
- const lastStatusUpdateTime = getCurrentUnixTime2();
1094
+ const lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1041
1095
  for (const page of pages) {
1042
1096
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0 };
1043
1097
  const lsdPage = new PlaywrightPage(this, page, pageInfo);
1044
1098
  this.#lsdPages.push(lsdPage);
1045
- loginfo2(`##browser ${lsdPage.id()} ${openType}ed`);
1099
+ (0, import_utils3.loginfo)(`##browser ${lsdPage.id()} ${openType}ed`);
1046
1100
  }
1047
1101
  }
1048
1102
  constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0) {
@@ -1057,7 +1111,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1057
1111
  this.#browserIdx = browserIdx;
1058
1112
  this.#browserContextIdx = browserContextIdx;
1059
1113
  this.#browserContext = browserContext;
1060
- this.#createTime = getCurrentUnixTime2();
1114
+ this.#createTime = (0, import_utils3.getCurrentUnixTime)();
1061
1115
  this.#incognito = incognito === false ? false : true;
1062
1116
  this.#proxy = proxy?.server ? proxy : null;
1063
1117
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -1070,29 +1124,29 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1070
1124
  const pageInfo = page.pageInfo;
1071
1125
  if (pageInfo) {
1072
1126
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
1073
- logwarn2(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1127
+ (0, import_utils3.logwarn)(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1074
1128
  } else {
1075
- const currentTime = getCurrentUnixTime2();
1129
+ const currentTime = (0, import_utils3.getCurrentUnixTime)();
1076
1130
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0 };
1077
1131
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1078
1132
  this.#lsdPages.push(lsdPage);
1079
- loginfo2(`##browser ${lsdPage.id()} created`);
1133
+ (0, import_utils3.loginfo)(`##browser ${lsdPage.id()} created`);
1080
1134
  }
1081
1135
  });
1082
1136
  browserContext.on("close", (bc) => {
1083
1137
  if (browserContext !== bc) {
1084
- logerr2(`##browser different browserContext in browserContext.on("close")`);
1138
+ (0, import_utils3.logerr)(`##browser different browserContext in browserContext.on("close")`);
1085
1139
  }
1086
1140
  this.#lsdBrowser.emit("browserContextClose", this);
1087
1141
  });
1088
1142
  this.on("pageClose", (lsdPage) => {
1089
1143
  if (!(lsdPage instanceof PlaywrightPage)) {
1090
- logerr2(`Invalid data in LsdBrowserContext.on("pageClose)`);
1144
+ (0, import_utils3.logerr)(`Invalid data in LsdBrowserContext.on("pageClose)`);
1091
1145
  return;
1092
1146
  }
1093
1147
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
1094
1148
  if (idx < 0) {
1095
- logerr2(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1149
+ (0, import_utils3.logerr)(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1096
1150
  return;
1097
1151
  }
1098
1152
  this.#lsdPages.splice(idx, 1);
@@ -1115,15 +1169,15 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1115
1169
  this.#gettingPage = true;
1116
1170
  return true;
1117
1171
  } else {
1118
- await sleep(200);
1172
+ await (0, import_utils3.sleep)(200);
1119
1173
  }
1120
1174
  }
1121
- logwarn2(`Cannot get the gettingLock.`);
1175
+ (0, import_utils3.logwarn)(`Cannot get the gettingLock.`);
1122
1176
  return false;
1123
1177
  }
1124
1178
  #freeGettingLock() {
1125
1179
  if (!this.#gettingPage) {
1126
- logwarn2(`Getting lock is already free now.`);
1180
+ (0, import_utils3.logwarn)(`Getting lock is already free now.`);
1127
1181
  }
1128
1182
  this.#gettingPage = false;
1129
1183
  }
@@ -1132,7 +1186,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1132
1186
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
1133
1187
  }
1134
1188
  if (maxPageFreeSeconds <= 0) {
1135
- logwarn2(`Please set valid maxPageFreeSeconds to close free pages`);
1189
+ (0, import_utils3.logwarn)(`Please set valid maxPageFreeSeconds to close free pages`);
1136
1190
  return false;
1137
1191
  }
1138
1192
  const gotLock = await this.#tryToGetGettingLock();
@@ -1140,7 +1194,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1140
1194
  return false;
1141
1195
  }
1142
1196
  try {
1143
- const maxUpdateTime = getCurrentUnixTime2() - this.#maxPageFreeSeconds;
1197
+ const maxUpdateTime = (0, import_utils3.getCurrentUnixTime)() - this.#maxPageFreeSeconds;
1144
1198
  let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
1145
1199
  if (freePages.length === this.#lsdPages.length) {
1146
1200
  freePages = freePages.slice(1);
@@ -1151,7 +1205,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1151
1205
  this.#freeGettingLock();
1152
1206
  return true;
1153
1207
  } catch (err) {
1154
- logerr2(err);
1208
+ (0, import_utils3.logerr)(err);
1155
1209
  this.#freeGettingLock();
1156
1210
  return false;
1157
1211
  }
@@ -1192,7 +1246,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1192
1246
  return null;
1193
1247
  }
1194
1248
  } catch (err) {
1195
- logerr2(err);
1249
+ (0, import_utils3.logerr)(err);
1196
1250
  this.#freeGettingLock();
1197
1251
  return null;
1198
1252
  }
@@ -1255,8 +1309,8 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1255
1309
  };
1256
1310
 
1257
1311
  // src/playwright/browser.ts
1258
- import { logerr as logerr3, loginfo as loginfo3, logwarn as logwarn3 } from "@letsscrapedata/utils";
1259
- var PlaywrightBrowser = class extends EventEmitter3 {
1312
+ var import_utils4 = require("@letsscrapedata/utils");
1313
+ var PlaywrightBrowser = class extends import_node_events3.default {
1260
1314
  #browser;
1261
1315
  #browserIdx;
1262
1316
  #lsdBrowserContexts;
@@ -1301,38 +1355,38 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1301
1355
  this.#executablePath = executablePath;
1302
1356
  this.#nextBrowserContextIdx = 1;
1303
1357
  this.#closeFreePagesIntervalId = null;
1304
- loginfo3(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1358
+ (0, import_utils4.loginfo)(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1305
1359
  const browserContexts = browser.contexts();
1306
1360
  if (browserContexts.length > 0) {
1307
- logwarn3(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1361
+ (0, import_utils4.logwarn)(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1308
1362
  }
1309
1363
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1310
1364
  for (const browserContext of browserContexts) {
1311
1365
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx++, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds());
1312
1366
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1313
- loginfo3(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1367
+ (0, import_utils4.loginfo)(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1314
1368
  }
1315
1369
  browser.on("disconnected", () => {
1316
- loginfo3(`##browser ${this.id()} disconnected`);
1370
+ (0, import_utils4.loginfo)(`##browser ${this.id()} disconnected`);
1317
1371
  if (this.#lsdBrowserContexts.length > 0) {
1318
- logerr3(`${this.id()} has browserContexts when disconnected`);
1372
+ (0, import_utils4.logerr)(`${this.id()} has browserContexts when disconnected`);
1319
1373
  }
1320
1374
  });
1321
1375
  this.on("browserContextClose", (lsdBrowserContext) => {
1322
1376
  if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
1323
- logerr3(`Invalid data in LsdBrowser.on("browserContextClose)`);
1377
+ (0, import_utils4.logerr)(`Invalid data in LsdBrowser.on("browserContextClose)`);
1324
1378
  return;
1325
1379
  }
1326
1380
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
1327
1381
  if (idx < 0) {
1328
- logerr3(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1382
+ (0, import_utils4.logerr)(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1329
1383
  return;
1330
1384
  }
1331
- loginfo3(`##browser ${lsdBrowserContext.id()} closed
1385
+ (0, import_utils4.loginfo)(`##browser ${lsdBrowserContext.id()} closed
1332
1386
  `);
1333
1387
  this.#lsdBrowserContexts.splice(idx, 1);
1334
1388
  if (this.#lsdBrowserContexts.length === 0) {
1335
- loginfo3(`##browser ${this.id()} has no browserContexts now`);
1389
+ (0, import_utils4.loginfo)(`##browser ${this.id()} has no browserContexts now`);
1336
1390
  }
1337
1391
  return;
1338
1392
  });
@@ -1350,7 +1404,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1350
1404
  // 常用方法(按常见调用顺序排序)
1351
1405
  async newBrowserContext(options) {
1352
1406
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
1353
- logwarn3(`##browser ${this.id()} can not create more new browserContext`);
1407
+ (0, import_utils4.logwarn)(`##browser ${this.id()} can not create more new browserContext`);
1354
1408
  return null;
1355
1409
  }
1356
1410
  const browserContextOptions = {};
@@ -1365,7 +1419,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1365
1419
  const browserContext = await this.#browser.newContext(browserContextOptions);
1366
1420
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, true, proxy, this.#browserIdx++, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds());
1367
1421
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1368
- loginfo3(`##browser ${lsdBrowserContext.id()} created`);
1422
+ (0, import_utils4.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
1369
1423
  return lsdBrowserContext;
1370
1424
  }
1371
1425
  async close() {
@@ -1416,16 +1470,16 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1416
1470
  };
1417
1471
 
1418
1472
  // src/puppeteer/browser.ts
1419
- import EventEmitter6 from "events";
1473
+ var import_node_events6 = __toESM(require("events"), 1);
1420
1474
 
1421
1475
  // src/puppeteer/context.ts
1422
- import EventEmitter5 from "events";
1476
+ var import_node_events5 = __toESM(require("events"), 1);
1423
1477
 
1424
1478
  // src/puppeteer/page.ts
1425
- import EventEmitter4 from "events";
1479
+ var import_node_events4 = __toESM(require("events"), 1);
1426
1480
 
1427
1481
  // src/puppeteer/element.ts
1428
- import { logerr as logerr4, unreachable as unreachable3 } from "@letsscrapedata/utils";
1482
+ var import_utils5 = require("@letsscrapedata/utils");
1429
1483
  var PuppeteerElement = class _PuppeteerElement {
1430
1484
  #frame;
1431
1485
  #$ele;
@@ -1513,7 +1567,7 @@ var PuppeteerElement = class _PuppeteerElement {
1513
1567
  }
1514
1568
  return retObj;
1515
1569
  } catch (err) {
1516
- logerr4(err);
1570
+ (0, import_utils5.logerr)(err);
1517
1571
  return retObj;
1518
1572
  }
1519
1573
  }
@@ -1663,44 +1717,24 @@ var PuppeteerElement = class _PuppeteerElement {
1663
1717
  }
1664
1718
  break;
1665
1719
  default:
1666
- unreachable3(type);
1720
+ (0, import_utils5.unreachable)(type);
1667
1721
  }
1668
1722
  return true;
1669
1723
  }
1670
1724
  async screenshot(options) {
1671
1725
  return await this.#$ele.screenshot(options);
1672
1726
  }
1673
- async scrollBy(x, y) {
1674
- await this.#frame.evaluate(
1675
- (x2, y2) => {
1676
- window.scrollBy(x2, y2);
1677
- },
1678
- x,
1679
- y
1680
- );
1681
- return true;
1682
- }
1683
1727
  async scrollIntoView() {
1684
1728
  await this.#frame.evaluate((ele) => {
1685
1729
  ele.scrollIntoView();
1686
1730
  }, this.#$ele);
1687
1731
  return true;
1688
1732
  }
1689
- async scrollTo(x, y) {
1690
- await this.#frame.evaluate(
1691
- (x2, y2) => {
1692
- window.scrollTo(x2, y2);
1693
- },
1694
- x,
1695
- y
1696
- );
1697
- return true;
1698
- }
1699
1733
  };
1700
1734
 
1701
1735
  // src/puppeteer/page.ts
1702
- import { getCurrentUnixTime as getCurrentUnixTime3, logerr as logerr5, loginfo as loginfo4, unreachable as unreachable4 } from "@letsscrapedata/utils";
1703
- var PuppeteerPage = class extends EventEmitter4 {
1736
+ var import_utils6 = require("@letsscrapedata/utils");
1737
+ var PuppeteerPage = class extends import_node_events4.default {
1704
1738
  #lsdBrowserContext;
1705
1739
  #page;
1706
1740
  #status;
@@ -1859,9 +1893,9 @@ var PuppeteerPage = class extends EventEmitter4 {
1859
1893
  const page = this.#page;
1860
1894
  const pageId = this.#pageId;
1861
1895
  page.on("close", async () => {
1862
- loginfo4(`##browser ${pageId} closed`);
1896
+ (0, import_utils6.loginfo)(`##browser ${pageId} closed`);
1863
1897
  if (!page.pageInfo) {
1864
- logerr5(`Logic error in page.on("close")`);
1898
+ (0, import_utils6.logerr)(`Logic error in page.on("close")`);
1865
1899
  }
1866
1900
  this.emit("pageClose");
1867
1901
  this.#lsdBrowserContext.emit("pageClose", this);
@@ -1875,12 +1909,12 @@ var PuppeteerPage = class extends EventEmitter4 {
1875
1909
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
1876
1910
  pageInfo.openType = "popup";
1877
1911
  } else {
1878
- logerr5(`##browser ${pageId} has popup without page.pageInfo`);
1912
+ (0, import_utils6.logerr)(`##browser ${pageId} has popup without page.pageInfo`);
1879
1913
  }
1880
- loginfo4(`##browser ${pageId} has popup ${popupPageId}`);
1914
+ (0, import_utils6.loginfo)(`##browser ${pageId} has popup ${popupPageId}`);
1881
1915
  this.emit("pagePopup", pageInfo);
1882
1916
  } else {
1883
- logerr5(`##browser ${pageId} has popup page with null page`);
1917
+ (0, import_utils6.logerr)(`##browser ${pageId} has popup page with null page`);
1884
1918
  }
1885
1919
  });
1886
1920
  }
@@ -1892,7 +1926,7 @@ var PuppeteerPage = class extends EventEmitter4 {
1892
1926
  this.#lsdBrowserContext = browserContext;
1893
1927
  this.#page = page;
1894
1928
  this.#status = "free";
1895
- const currentTime = getCurrentUnixTime3();
1929
+ const currentTime = (0, import_utils6.getCurrentUnixTime)();
1896
1930
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0 } = pageInfo ? pageInfo : {};
1897
1931
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId };
1898
1932
  this.#pageId = `page${browserIdx}-${browserContextIdx}-${pageIdx}`;
@@ -2037,12 +2071,21 @@ var PuppeteerPage = class extends EventEmitter4 {
2037
2071
  await this.clearResponseInterceptions();
2038
2072
  return true;
2039
2073
  }
2074
+ #getWaitUntil(origWaitUntil) {
2075
+ if (origWaitUntil === "networkidle") {
2076
+ return "networkidle0";
2077
+ } else if (origWaitUntil === "commit") {
2078
+ throw new Error("commit is not supported in PuppeteerPage");
2079
+ } else {
2080
+ return origWaitUntil;
2081
+ }
2082
+ }
2040
2083
  async goto(url, options) {
2041
2084
  if (!this.#page) {
2042
2085
  throw new Error("No valid page");
2043
2086
  }
2044
2087
  if (options) {
2045
- const { referer, timeout, waitUntil } = options;
2088
+ const { referer, timeout, waitUntil = "load" } = options;
2046
2089
  const newOptions = {};
2047
2090
  if (referer) {
2048
2091
  newOptions.referer = referer;
@@ -2051,7 +2094,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2051
2094
  newOptions.timeout = timeout;
2052
2095
  }
2053
2096
  if (waitUntil && waitUntil !== "commit") {
2054
- newOptions.waitUntil = waitUntil === "networkidle" ? "networkidle0" : waitUntil;
2097
+ newOptions.waitUntil = this.#getWaitUntil(waitUntil);
2055
2098
  }
2056
2099
  await this.#page.goto(url, newOptions);
2057
2100
  } else {
@@ -2123,6 +2166,30 @@ var PuppeteerPage = class extends EventEmitter4 {
2123
2166
  }
2124
2167
  return await this.#page.screenshot(options);
2125
2168
  }
2169
+ async scrollBy(x, y) {
2170
+ if (!this.#page) {
2171
+ throw new Error("No valid page");
2172
+ }
2173
+ await this.#page.evaluate(
2174
+ ([x2, y2]) => {
2175
+ window.scrollBy(x2, y2);
2176
+ },
2177
+ [x, y]
2178
+ );
2179
+ return true;
2180
+ }
2181
+ async scrollTo(x, y) {
2182
+ if (!this.#page) {
2183
+ throw new Error("No valid page");
2184
+ }
2185
+ await this.#page.evaluate(
2186
+ ([x2, y2]) => {
2187
+ window.scrollTo(x2, y2);
2188
+ },
2189
+ [x, y]
2190
+ );
2191
+ return true;
2192
+ }
2126
2193
  async setCookies(cookies) {
2127
2194
  if (!this.#page) {
2128
2195
  throw new Error("No valid page");
@@ -2220,7 +2287,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2220
2287
  });
2221
2288
  break;
2222
2289
  default:
2223
- unreachable4(action);
2290
+ (0, import_utils6.unreachable)(action);
2224
2291
  }
2225
2292
  return true;
2226
2293
  }
@@ -2255,7 +2322,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2255
2322
  return false;
2256
2323
  }
2257
2324
  for (const option of actOptions) {
2258
- const { requestMatch, responseMatch, cacheArray, handler, handlerOptions } = option;
2325
+ const { requestMatch, responseMatch, responseItems, handler, handlerOptions } = option;
2259
2326
  let matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
2260
2327
  if (matchedFlag && responseMatch) {
2261
2328
  const { minLength, maxLength } = responseMatch;
@@ -2268,13 +2335,13 @@ var PuppeteerPage = class extends EventEmitter4 {
2268
2335
  if (!matchedFlag) {
2269
2336
  continue;
2270
2337
  }
2271
- if (Array.isArray(cacheArray)) {
2338
+ if (Array.isArray(responseItems)) {
2272
2339
  const requestMethod = request.method();
2273
2340
  const requestUrl = request.url();
2274
2341
  const reqData2 = request.postData();
2275
2342
  const requestData = reqData2 ? reqData2 : "";
2276
2343
  const responseData = await response.text();
2277
- cacheArray.push({
2344
+ responseItems.push({
2278
2345
  pageUrl,
2279
2346
  requestMethod,
2280
2347
  requestUrl,
@@ -2341,6 +2408,33 @@ var PuppeteerPage = class extends EventEmitter4 {
2341
2408
  this.#status = "busy";
2342
2409
  return true;
2343
2410
  }
2411
+ async waitForElement(selector, options = {}) {
2412
+ if (!this.#page) {
2413
+ throw new Error("No valid page");
2414
+ }
2415
+ const { timeout = 3e4, state = "visible" } = options;
2416
+ if (state === "visible") {
2417
+ await this.#page.waitForSelector(selector, { timeout, visible: true });
2418
+ } else if (state === "hidden") {
2419
+ await this.#page.waitForSelector(selector, { timeout, hidden: true });
2420
+ } else {
2421
+ throw new Error(`${state} is not supported in PuppeteerPage.waitForElement`);
2422
+ }
2423
+ return true;
2424
+ }
2425
+ async waitForNavigation(options) {
2426
+ if (!this.#page) {
2427
+ throw new Error("No valid page");
2428
+ }
2429
+ const { url = "", timeout = 3e4, waitUntil = "load" } = options;
2430
+ const newWaitUntil = this.#getWaitUntil(waitUntil);
2431
+ if (url) {
2432
+ throw new Error("url is not supported in PuppeteerPage.waitForNavigation");
2433
+ } else {
2434
+ await this.#page.waitForNavigation({ timeout, waitUntil: newWaitUntil });
2435
+ }
2436
+ return true;
2437
+ }
2344
2438
  async windowMember(keys) {
2345
2439
  if (!this.#page) {
2346
2440
  throw new Error("No valid page");
@@ -2369,8 +2463,8 @@ var PuppeteerPage = class extends EventEmitter4 {
2369
2463
  };
2370
2464
 
2371
2465
  // src/puppeteer/context.ts
2372
- import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr6, loginfo as loginfo5, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2373
- var PuppeteerBrowserContext = class extends EventEmitter5 {
2466
+ var import_utils7 = require("@letsscrapedata/utils");
2467
+ var PuppeteerBrowserContext = class extends import_node_events5.default {
2374
2468
  #lsdBrowser;
2375
2469
  #browserIdx;
2376
2470
  #browserContextIdx;
@@ -2394,7 +2488,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2394
2488
  }
2395
2489
  const pages = await this.#browserContext.pages();
2396
2490
  const openType = this.#lsdBrowser.browserCreationMethod();
2397
- const lastStatusUpdateTime = getCurrentUnixTime4();
2491
+ const lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
2398
2492
  for (const page of pages) {
2399
2493
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0 };
2400
2494
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
@@ -2402,7 +2496,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2402
2496
  await lsdPage.setUserAgent(this.#userAgent);
2403
2497
  }
2404
2498
  this.#lsdPages.push(lsdPage);
2405
- loginfo5(`##browser ${lsdPage.id()} ${openType}ed`);
2499
+ (0, import_utils7.loginfo)(`##browser ${lsdPage.id()} ${openType}ed`);
2406
2500
  }
2407
2501
  }
2408
2502
  constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "") {
@@ -2418,7 +2512,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2418
2512
  this.#browserContextIdx = browserContextIdx;
2419
2513
  this.#browserContext = browserContext;
2420
2514
  this.#userAgent = userAgent;
2421
- this.#createTime = getCurrentUnixTime4();
2515
+ this.#createTime = (0, import_utils7.getCurrentUnixTime)();
2422
2516
  this.#incognito = incognito === false ? false : true;
2423
2517
  this.#proxy = proxy?.server ? proxy : null;
2424
2518
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -2436,27 +2530,27 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2436
2530
  const pageInfo = page.pageInfo;
2437
2531
  if (pageInfo) {
2438
2532
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2439
- logwarn4(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2533
+ (0, import_utils7.logwarn)(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2440
2534
  } else {
2441
- const currentTime = getCurrentUnixTime4();
2535
+ const currentTime = (0, import_utils7.getCurrentUnixTime)();
2442
2536
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0 };
2443
2537
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
2444
2538
  if (this.#userAgent) {
2445
2539
  await lsdPage.setUserAgent(this.#userAgent);
2446
2540
  }
2447
2541
  this.#lsdPages.push(lsdPage);
2448
- loginfo5(`##browser ${lsdPage.id()} created`);
2542
+ (0, import_utils7.loginfo)(`##browser ${lsdPage.id()} created`);
2449
2543
  }
2450
2544
  }
2451
2545
  });
2452
2546
  this.on("pageClose", (lsdPage) => {
2453
2547
  if (!(lsdPage instanceof PuppeteerPage)) {
2454
- logerr6(`Invalid data in LsdBrowserContext.on("pageClose)`);
2548
+ (0, import_utils7.logerr)(`Invalid data in LsdBrowserContext.on("pageClose)`);
2455
2549
  return;
2456
2550
  }
2457
2551
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
2458
2552
  if (idx < 0) {
2459
- logerr6(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
2553
+ (0, import_utils7.logerr)(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
2460
2554
  return;
2461
2555
  }
2462
2556
  this.#lsdPages.splice(idx, 1);
@@ -2482,15 +2576,15 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2482
2576
  this.#gettingPage = true;
2483
2577
  return true;
2484
2578
  } else {
2485
- await sleep2(200);
2579
+ await (0, import_utils7.sleep)(200);
2486
2580
  }
2487
2581
  }
2488
- logwarn4(`Cannot get the gettingLock.`);
2582
+ (0, import_utils7.logwarn)(`Cannot get the gettingLock.`);
2489
2583
  return false;
2490
2584
  }
2491
2585
  #freeGettingLock() {
2492
2586
  if (!this.#gettingPage) {
2493
- logwarn4(`Getting lock is already free now.`);
2587
+ (0, import_utils7.logwarn)(`Getting lock is already free now.`);
2494
2588
  }
2495
2589
  this.#gettingPage = false;
2496
2590
  }
@@ -2499,7 +2593,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2499
2593
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
2500
2594
  }
2501
2595
  if (maxPageFreeSeconds <= 0) {
2502
- logwarn4(`Please set valid maxPageFreeSeconds to close free pages`);
2596
+ (0, import_utils7.logwarn)(`Please set valid maxPageFreeSeconds to close free pages`);
2503
2597
  return false;
2504
2598
  }
2505
2599
  const gotLock = await this.#tryToGetGettingLock();
@@ -2507,7 +2601,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2507
2601
  return false;
2508
2602
  }
2509
2603
  try {
2510
- const maxUpdateTime = getCurrentUnixTime4() - this.#maxPageFreeSeconds;
2604
+ const maxUpdateTime = (0, import_utils7.getCurrentUnixTime)() - this.#maxPageFreeSeconds;
2511
2605
  let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
2512
2606
  if (freePages.length === this.#lsdPages.length) {
2513
2607
  freePages = freePages.slice(1);
@@ -2518,7 +2612,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2518
2612
  this.#freeGettingLock();
2519
2613
  return true;
2520
2614
  } catch (err) {
2521
- logerr6(err);
2615
+ (0, import_utils7.logerr)(err);
2522
2616
  this.#freeGettingLock();
2523
2617
  return false;
2524
2618
  }
@@ -2533,7 +2627,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2533
2627
  }
2534
2628
  try {
2535
2629
  if (this.#lsdPages.length === 0) {
2536
- await sleep2(1e3);
2630
+ await (0, import_utils7.sleep)(1e3);
2537
2631
  }
2538
2632
  let lsdPage = this.#lsdPages.find((p) => p.isFree());
2539
2633
  if (lsdPage) {
@@ -2561,7 +2655,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2561
2655
  return null;
2562
2656
  }
2563
2657
  } catch (err) {
2564
- logerr6(err);
2658
+ (0, import_utils7.logerr)(err);
2565
2659
  this.#freeGettingLock();
2566
2660
  return null;
2567
2661
  }
@@ -2624,8 +2718,8 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2624
2718
  };
2625
2719
 
2626
2720
  // src/puppeteer/browser.ts
2627
- import { logerr as logerr7, loginfo as loginfo6, logwarn as logwarn5 } from "@letsscrapedata/utils";
2628
- var PuppeteerBrowser = class extends EventEmitter6 {
2721
+ var import_utils8 = require("@letsscrapedata/utils");
2722
+ var PuppeteerBrowser = class extends import_node_events6.default {
2629
2723
  #browser;
2630
2724
  #browserIdx;
2631
2725
  #lsdBrowserContexts;
@@ -2673,35 +2767,35 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2673
2767
  this.#executablePath = executablePath;
2674
2768
  this.#nextBrowserContextIdx = 1;
2675
2769
  this.#closeFreePagesIntervalId = null;
2676
- loginfo6(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
2770
+ (0, import_utils8.loginfo)(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
2677
2771
  const browserContexts = browser.browserContexts();
2678
2772
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
2679
2773
  for (const browserContext of browserContexts) {
2680
2774
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent());
2681
2775
  this.#lsdBrowserContexts.push(lsdBrowserContext);
2682
- loginfo6(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
2776
+ (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
2683
2777
  }
2684
2778
  browser.on("disconnected", () => {
2685
- loginfo6(`##browser ${this.id()} disconnected`);
2779
+ (0, import_utils8.loginfo)(`##browser ${this.id()} disconnected`);
2686
2780
  if (this.#lsdBrowserContexts.length > 0) {
2687
- logerr7(`${this.id()} has browserContexts when disconnected`);
2781
+ (0, import_utils8.logerr)(`${this.id()} has browserContexts when disconnected`);
2688
2782
  }
2689
2783
  });
2690
2784
  this.on("browserContextClose", (lsdBrowserContext) => {
2691
2785
  if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
2692
- logerr7(`Invalid data in LsdBrowser.on("browserContextClose)`);
2786
+ (0, import_utils8.logerr)(`Invalid data in LsdBrowser.on("browserContextClose)`);
2693
2787
  return;
2694
2788
  }
2695
2789
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
2696
2790
  if (idx < 0) {
2697
- logerr7(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
2791
+ (0, import_utils8.logerr)(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
2698
2792
  return;
2699
2793
  }
2700
- loginfo6(`##browser ${lsdBrowserContext.id()} closed
2794
+ (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} closed
2701
2795
  `);
2702
2796
  this.#lsdBrowserContexts.splice(idx, 1);
2703
2797
  if (this.#lsdBrowserContexts.length === 0) {
2704
- loginfo6(`##browser ${this.id()} has no browserContexts now`);
2798
+ (0, import_utils8.loginfo)(`##browser ${this.id()} has no browserContexts now`);
2705
2799
  }
2706
2800
  return;
2707
2801
  });
@@ -2719,7 +2813,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2719
2813
  // 常用方法(按常见调用顺序排序)
2720
2814
  async newBrowserContext(options) {
2721
2815
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
2722
- logwarn5(`##browser ${this.id()} can not create more new browserContext`);
2816
+ (0, import_utils8.logwarn)(`##browser ${this.id()} can not create more new browserContext`);
2723
2817
  return null;
2724
2818
  }
2725
2819
  const browserContextOptions = {};
@@ -2731,7 +2825,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2731
2825
  const userAgent = options?.userAgent ? options.userAgent : "";
2732
2826
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent);
2733
2827
  this.#lsdBrowserContexts.push(lsdBrowserContext);
2734
- loginfo6(`##browser ${lsdBrowserContext.id()} created`);
2828
+ (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
2735
2829
  return lsdBrowserContext;
2736
2830
  }
2737
2831
  async close() {
@@ -2784,7 +2878,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2784
2878
  };
2785
2879
 
2786
2880
  // src/cheerio/page.ts
2787
- import EventEmitter7 from "events";
2881
+ var import_node_events7 = __toESM(require("events"), 1);
2788
2882
 
2789
2883
  // ../../node_modules/cheerio/lib/esm/options.js
2790
2884
  var defaultOpts = {
@@ -16656,29 +16750,34 @@ var CheerioElement = class _CheerioElement {
16656
16750
  return Array.from(Object.keys(element.attribs));
16657
16751
  }
16658
16752
  }
16659
- #findNodes(selector) {
16753
+ #findNodes(selector, absolute) {
16660
16754
  if (selector.startsWith("./") || selector.startsWith("/")) {
16661
16755
  throw new Error("Do not support XPath in cheerio.");
16662
16756
  }
16663
16757
  if (selector === ".") {
16664
16758
  return [this.#node];
16665
16759
  }
16666
- const cheerioNode = this.#node.find(selector);
16667
- if (cheerioNode.length > 0) {
16668
- const nodes = [];
16760
+ const nodes = [];
16761
+ const cheerioNode = !absolute ? this.#node.find(selector) : this.#node._root?.find(selector);
16762
+ if (!cheerioNode) {
16763
+ return nodes;
16764
+ } else if (cheerioNode.length > 0) {
16669
16765
  const len = cheerioNode.length;
16670
16766
  for (let i = 0; i < len; i++) {
16671
16767
  nodes.push(cheerioNode.eq(i));
16672
16768
  }
16673
16769
  return nodes;
16674
16770
  } else {
16675
- return [];
16771
+ return nodes;
16676
16772
  }
16677
16773
  }
16678
- async findElement(selectorOrXpath) {
16774
+ async findElement(selectorOrXpath, iframeOptions = [], absolute = false) {
16775
+ if (!iframeOptions) {
16776
+ return null;
16777
+ }
16679
16778
  const selectors = typeof selectorOrXpath === "string" ? [selectorOrXpath] : selectorOrXpath;
16680
16779
  for (const selector of selectors) {
16681
- const nodes = this.#findNodes(selector);
16780
+ const nodes = this.#findNodes(selector, absolute);
16682
16781
  if (nodes.length > 0) {
16683
16782
  const cheerioElement = new _CheerioElement(nodes[0]);
16684
16783
  return cheerioElement;
@@ -16686,10 +16785,13 @@ var CheerioElement = class _CheerioElement {
16686
16785
  }
16687
16786
  return null;
16688
16787
  }
16689
- async findElements(selectorOrXpath) {
16788
+ async findElements(selectorOrXpath, iframeOptions = [], absolute = false) {
16789
+ if (!iframeOptions) {
16790
+ return [];
16791
+ }
16690
16792
  const selectors = typeof selectorOrXpath === "string" ? [selectorOrXpath] : selectorOrXpath;
16691
16793
  for (const selector of selectors) {
16692
- const nodes = this.#findNodes(selector);
16794
+ const nodes = this.#findNodes(selector, absolute);
16693
16795
  if (nodes.length > 0) {
16694
16796
  const cheerioElements = nodes.map((node) => new _CheerioElement(node));
16695
16797
  return cheerioElements;
@@ -16738,19 +16840,13 @@ var CheerioElement = class _CheerioElement {
16738
16840
  async screenshot() {
16739
16841
  throw new Error("Not supported in CheerioElement.");
16740
16842
  }
16741
- async scrollBy() {
16742
- throw new Error("Not supported in CheerioElement.");
16743
- }
16744
16843
  async scrollIntoView() {
16745
16844
  throw new Error("Not supported in CheerioElement.");
16746
16845
  }
16747
- async scrollTo() {
16748
- throw new Error("Not supported in CheerioElement.");
16749
- }
16750
16846
  };
16751
16847
 
16752
16848
  // src/cheerio/page.ts
16753
- var CheerioPage = class extends EventEmitter7 {
16849
+ var CheerioPage = class extends import_node_events7.default {
16754
16850
  #document;
16755
16851
  constructor(html3 = "") {
16756
16852
  super();
@@ -16867,6 +16963,12 @@ var CheerioPage = class extends EventEmitter7 {
16867
16963
  async screenshot() {
16868
16964
  throw new Error("Not supported in CheerioPage.");
16869
16965
  }
16966
+ async scrollBy() {
16967
+ throw new Error("Not supported in CheerioElement.");
16968
+ }
16969
+ async scrollTo() {
16970
+ throw new Error("Not supported in CheerioElement.");
16971
+ }
16870
16972
  async setCookies() {
16871
16973
  throw new Error("Not supported in CheerioPage.");
16872
16974
  }
@@ -16909,16 +17011,22 @@ var CheerioPage = class extends EventEmitter7 {
16909
17011
  use() {
16910
17012
  throw new Error("Not supported in CheerioPage.");
16911
17013
  }
17014
+ waitForElement() {
17015
+ throw new Error("Not supported in CheerioPage.");
17016
+ }
17017
+ waitForNavigation() {
17018
+ throw new Error("Not supported in CheerioPage.");
17019
+ }
16912
17020
  async windowMember() {
16913
17021
  throw new Error("Not supported in CheerioPage.");
16914
17022
  }
16915
17023
  };
16916
17024
 
16917
17025
  // src/controller/controller.ts
16918
- import os from "os";
16919
- import puppeteer from "puppeteer";
16920
- import playwright from "playwright";
16921
- import { logwarn as logwarn6 } from "@letsscrapedata/utils";
17026
+ var import_os = __toESM(require("os"), 1);
17027
+ var import_puppeteer = __toESM(require("puppeteer"), 1);
17028
+ var import_playwright = __toESM(require("playwright"), 1);
17029
+ var import_utils15 = require("@letsscrapedata/utils");
16922
17030
  var LsdBrowserController = class _LsdBrowserController {
16923
17031
  static #forbidConstructor = false;
16924
17032
  #nextBrowserIdx;
@@ -16930,19 +17038,19 @@ var LsdBrowserController = class _LsdBrowserController {
16930
17038
  if (_LsdBrowserController.#forbidConstructor) {
16931
17039
  throw new Error("Only one LsdBrowserController instance can be created!");
16932
17040
  }
16933
- this.#osPlatform = os.platform();
17041
+ this.#osPlatform = import_os.default.platform();
16934
17042
  this.#nextBrowserIdx = 1;
16935
17043
  _LsdBrowserController.#forbidConstructor = true;
16936
17044
  }
16937
17045
  #playwrightBrowserType(browserType, connectFlag = false) {
16938
17046
  if (browserType === "chromium") {
16939
- return playwright.chromium;
17047
+ return import_playwright.default.chromium;
16940
17048
  } else if (connectFlag) {
16941
17049
  throw new Error(`playwright only can connect to chromium browser, not support ${browserType} browser`);
16942
17050
  } else if (browserType === "firefox") {
16943
- return playwright.firefox;
17051
+ return import_playwright.default.firefox;
16944
17052
  } else if (browserType === "webkit") {
16945
- return playwright.webkit;
17053
+ return import_playwright.default.webkit;
16946
17054
  } else {
16947
17055
  throw new Error(`Invalid playwright browserType ${browserType}`);
16948
17056
  }
@@ -16974,17 +17082,17 @@ var LsdBrowserController = class _LsdBrowserController {
16974
17082
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, timeout, args, executablePath, headless, incognito, proxy, proxyPerBrowserContext, userDataDir, userAgent };
16975
17083
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
16976
17084
  if (idx >= 0) {
16977
- logwarn6(`Please use options.incognito instead when launching new browser.`);
17085
+ (0, import_utils15.logwarn)(`Please use options.incognito instead when launching new browser.`);
16978
17086
  args.splice(idx, 1);
16979
17087
  }
16980
17088
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
16981
17089
  if (idx >= 0) {
16982
- logwarn6(`Please use options.proxy instead when launching new browser.`);
17090
+ (0, import_utils15.logwarn)(`Please use options.proxy instead when launching new browser.`);
16983
17091
  args.splice(idx, 1);
16984
17092
  }
16985
17093
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
16986
17094
  if (idx >= 0) {
16987
- logwarn6(`Please use options.userDataDir instead when launching new browser.`);
17095
+ (0, import_utils15.logwarn)(`Please use options.userDataDir instead when launching new browser.`);
16988
17096
  args.splice(idx, 1);
16989
17097
  }
16990
17098
  if (browserControllerType === "playwright") {
@@ -17036,9 +17144,9 @@ var LsdBrowserController = class _LsdBrowserController {
17036
17144
  launchOptions.args = args;
17037
17145
  }
17038
17146
  if (!actOptions.executablePath) {
17039
- actOptions.executablePath = puppeteer.executablePath();
17147
+ actOptions.executablePath = import_puppeteer.default.executablePath();
17040
17148
  }
17041
- const browser = await puppeteer.launch(launchOptions);
17149
+ const browser = await import_puppeteer.default.launch(launchOptions);
17042
17150
  const lsdBrowser = new PuppeteerBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++);
17043
17151
  return lsdBrowser;
17044
17152
  } else {
@@ -17057,7 +17165,7 @@ var LsdBrowserController = class _LsdBrowserController {
17057
17165
  return lsdBrowser;
17058
17166
  } else if (browserControllerType === "puppeteer") {
17059
17167
  this.#puppeteerProduct(browserType);
17060
- const browser = await puppeteer.connect({ browserURL: browserUrl });
17168
+ const browser = await import_puppeteer.default.connect({ browserURL: browserUrl });
17061
17169
  const lsdBrowser = new PuppeteerBrowser(browser, browserType, "connect", options, this.#nextBrowserIdx++);
17062
17170
  ;
17063
17171
  return lsdBrowser;
@@ -17067,7 +17175,8 @@ var LsdBrowserController = class _LsdBrowserController {
17067
17175
  }
17068
17176
  };
17069
17177
  var controller = new LsdBrowserController();
17070
- export {
17178
+ // Annotate the CommonJS export names for ESM import in node:
17179
+ 0 && (module.exports = {
17071
17180
  CheerioElement,
17072
17181
  CheerioPage,
17073
17182
  PlaywrightBrowser,
@@ -17079,4 +17188,4 @@ export {
17079
17188
  PuppeteerElement,
17080
17189
  PuppeteerPage,
17081
17190
  defaultProxy
17082
- };
17191
+ });