@letsscrapedata/controller 0.0.64 → 0.0.66
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/dist/index.cjs +409 -212
- package/dist/index.d.cts +37 -2
- package/dist/index.d.ts +37 -2
- package/dist/index.js +405 -212
- package/package.json +3 -1
package/dist/index.js
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
// src/types/types.ts
|
|
2
|
+
var ControllerEvent = /* @__PURE__ */ ((ControllerEvent2) => {
|
|
3
|
+
ControllerEvent2["BROWSERCONTEXT_CLOSE"] = "close";
|
|
4
|
+
ControllerEvent2["BROWSERCONTEXT_PAGE"] = "page";
|
|
5
|
+
ControllerEvent2["BROWSERCONTEXT_TARGETCREATED"] = "targetcreated";
|
|
6
|
+
ControllerEvent2["BROWSER_DISCONNECTED"] = "disconnected";
|
|
7
|
+
ControllerEvent2["PAGE_CLOSE"] = "close";
|
|
8
|
+
ControllerEvent2["PAGE_POUP"] = "popup";
|
|
9
|
+
ControllerEvent2["PAGE_REQUEST"] = "request";
|
|
10
|
+
ControllerEvent2["PAGE_RESPONSE"] = "response";
|
|
11
|
+
return ControllerEvent2;
|
|
12
|
+
})(ControllerEvent || {});
|
|
13
|
+
var LsdPageEvent = /* @__PURE__ */ ((LsdPageEvent2) => {
|
|
14
|
+
LsdPageEvent2["PAGE_CLOSE"] = "pageClose";
|
|
15
|
+
LsdPageEvent2["PAGE_POPUP"] = "pagePopup";
|
|
16
|
+
return LsdPageEvent2;
|
|
17
|
+
})(LsdPageEvent || {});
|
|
18
|
+
var LsdBrowserContextEvent = /* @__PURE__ */ ((LsdBrowserContextEvent2) => {
|
|
19
|
+
LsdBrowserContextEvent2["PAGE_CLOSE"] = "pageClose";
|
|
20
|
+
return LsdBrowserContextEvent2;
|
|
21
|
+
})(LsdBrowserContextEvent || {});
|
|
22
|
+
var LsdBrowserEvent = /* @__PURE__ */ ((LsdBrowserEvent2) => {
|
|
23
|
+
LsdBrowserEvent2["BROWSER_CONTEXT_CLOSE"] = "browserContextClose";
|
|
24
|
+
return LsdBrowserEvent2;
|
|
25
|
+
})(LsdBrowserEvent || {});
|
|
26
|
+
|
|
1
27
|
// src/utils/log.ts
|
|
2
28
|
import { log, LogLevel } from "@letsscrapedata/utils";
|
|
3
29
|
var pkgLog = log;
|
|
@@ -9,6 +35,9 @@ function setControllerLogFun(logFun) {
|
|
|
9
35
|
return false;
|
|
10
36
|
}
|
|
11
37
|
}
|
|
38
|
+
async function logdbg(...args) {
|
|
39
|
+
await pkgLog(LogLevel.DBG, ...args);
|
|
40
|
+
}
|
|
12
41
|
async function loginfo(...args) {
|
|
13
42
|
await pkgLog(LogLevel.INF, ...args);
|
|
14
43
|
}
|
|
@@ -356,6 +385,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
356
385
|
#responseInterceptionOptions;
|
|
357
386
|
#client;
|
|
358
387
|
#responseCb;
|
|
388
|
+
#isDebugTask;
|
|
359
389
|
#hasValidUrl(page) {
|
|
360
390
|
const url = page.url();
|
|
361
391
|
return url.toLowerCase().startsWith("http");
|
|
@@ -371,7 +401,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
371
401
|
const cookieItems = await this.#getCookies(page);
|
|
372
402
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
373
403
|
if (domainSet.size !== 1) {
|
|
374
|
-
logwarn(
|
|
404
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
375
405
|
}
|
|
376
406
|
for (const domain of domainSet.values()) {
|
|
377
407
|
await browserContext.clearCookies({ domain });
|
|
@@ -577,15 +607,15 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
577
607
|
}
|
|
578
608
|
const page = this.#page;
|
|
579
609
|
const pageId = this.#pageId;
|
|
580
|
-
page.on("close"
|
|
581
|
-
loginfo(`##browser
|
|
610
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
611
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
582
612
|
if (!page.pageInfo) {
|
|
583
|
-
logerr(
|
|
613
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
584
614
|
}
|
|
585
|
-
this.emit("pageClose");
|
|
586
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
615
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
616
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
587
617
|
});
|
|
588
|
-
page.on("popup"
|
|
618
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
589
619
|
if (p) {
|
|
590
620
|
let evtData = null;
|
|
591
621
|
const pageInfo = p.pageInfo;
|
|
@@ -599,12 +629,12 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
599
629
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
600
630
|
}
|
|
601
631
|
} else {
|
|
602
|
-
logerr(`##browser
|
|
632
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
603
633
|
}
|
|
604
|
-
loginfo(`##browser
|
|
605
|
-
this.emit("pagePopup"
|
|
634
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
635
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
606
636
|
} else {
|
|
607
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
637
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
608
638
|
}
|
|
609
639
|
});
|
|
610
640
|
}
|
|
@@ -619,12 +649,14 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
619
649
|
const currentTime = getCurrentUnixTime();
|
|
620
650
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
621
651
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
622
|
-
this.#pageId = `
|
|
652
|
+
this.#pageId = `PlaywrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
623
653
|
this.#closeWhenFree = false;
|
|
624
654
|
this.#resquestInterceptionOptions = [];
|
|
625
655
|
this.#responseInterceptionOptions = [];
|
|
626
656
|
this.#client = null;
|
|
627
657
|
this.#responseCb = null;
|
|
658
|
+
this.#isDebugTask = false;
|
|
659
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
628
660
|
this.#addPageOn();
|
|
629
661
|
}
|
|
630
662
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -705,7 +737,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
705
737
|
}
|
|
706
738
|
async close() {
|
|
707
739
|
if (this.#status === "closed") {
|
|
708
|
-
logwarn(
|
|
740
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
709
741
|
return true;
|
|
710
742
|
} else if (this.#status === "busy") {
|
|
711
743
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -716,6 +748,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
716
748
|
await this.#page.close();
|
|
717
749
|
this.#page = null;
|
|
718
750
|
this.#status = "closed";
|
|
751
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
719
752
|
return true;
|
|
720
753
|
}
|
|
721
754
|
closeWhenFree() {
|
|
@@ -746,7 +779,10 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
746
779
|
if (!this.#page) {
|
|
747
780
|
throw new Error("No valid page");
|
|
748
781
|
}
|
|
749
|
-
|
|
782
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
783
|
+
if (typeof height === "undefined") {
|
|
784
|
+
height = 0;
|
|
785
|
+
}
|
|
750
786
|
return height;
|
|
751
787
|
}
|
|
752
788
|
async evaluate(func, args) {
|
|
@@ -797,10 +833,11 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
797
833
|
return [];
|
|
798
834
|
}
|
|
799
835
|
async free() {
|
|
800
|
-
if (this.#status === "free") {
|
|
801
|
-
logwarn(
|
|
836
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
837
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
802
838
|
}
|
|
803
839
|
this.#status = "free";
|
|
840
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
804
841
|
await this.clearRequestInterceptions();
|
|
805
842
|
await this.clearResponseInterceptions();
|
|
806
843
|
return true;
|
|
@@ -897,9 +934,18 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
897
934
|
if (!this.#page) {
|
|
898
935
|
throw new Error("No valid page");
|
|
899
936
|
}
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
937
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
938
|
+
if (typeof bodyHeight === "undefined") {
|
|
939
|
+
bodyHeight = 0;
|
|
940
|
+
}
|
|
941
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
942
|
+
if (typeof documentHeight === "undefined") {
|
|
943
|
+
documentHeight = 0;
|
|
944
|
+
}
|
|
945
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
946
|
+
if (typeof windowHeight === "undefined") {
|
|
947
|
+
windowHeight = 0;
|
|
948
|
+
}
|
|
903
949
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
904
950
|
return pageHeight;
|
|
905
951
|
}
|
|
@@ -913,8 +959,14 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
913
959
|
if (!this.#page) {
|
|
914
960
|
throw new Error("No valid page");
|
|
915
961
|
}
|
|
916
|
-
|
|
917
|
-
|
|
962
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
963
|
+
if (typeof offsetWidth === "undefined") {
|
|
964
|
+
offsetWidth = 0;
|
|
965
|
+
}
|
|
966
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
967
|
+
if (typeof windowWidth === "undefined") {
|
|
968
|
+
windowWidth = 0;
|
|
969
|
+
}
|
|
918
970
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
919
971
|
return pageWidth;
|
|
920
972
|
}
|
|
@@ -1022,6 +1074,8 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1022
1074
|
}
|
|
1023
1075
|
if (typeof taskId === "number") {
|
|
1024
1076
|
actPageInfo.taskId = taskId;
|
|
1077
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
1078
|
+
this.#isDebugTask = !!debug;
|
|
1025
1079
|
}
|
|
1026
1080
|
if (typeof relatedId === "number") {
|
|
1027
1081
|
actPageInfo.relatedId = relatedId;
|
|
@@ -1065,7 +1119,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1065
1119
|
}
|
|
1066
1120
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
1067
1121
|
if (actOptions.length <= 0) {
|
|
1068
|
-
logwarn("
|
|
1122
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
1069
1123
|
return false;
|
|
1070
1124
|
}
|
|
1071
1125
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -1086,6 +1140,13 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1086
1140
|
const { requestMatch, action, fulfill } = option;
|
|
1087
1141
|
const request = route.request();
|
|
1088
1142
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
1143
|
+
if (this.#isDebugTask) {
|
|
1144
|
+
if (matchedFlag) {
|
|
1145
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
1146
|
+
} else {
|
|
1147
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1089
1150
|
if (matchedFlag) {
|
|
1090
1151
|
switch (action) {
|
|
1091
1152
|
case "abort":
|
|
@@ -1137,6 +1198,13 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1137
1198
|
matchedFlag = false;
|
|
1138
1199
|
}
|
|
1139
1200
|
}
|
|
1201
|
+
if (this.#isDebugTask) {
|
|
1202
|
+
if (matchedFlag) {
|
|
1203
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
1204
|
+
} else {
|
|
1205
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1140
1208
|
if (!matchedFlag) {
|
|
1141
1209
|
continue;
|
|
1142
1210
|
}
|
|
@@ -1172,7 +1240,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1172
1240
|
}
|
|
1173
1241
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
1174
1242
|
if (actOptions.length <= 0) {
|
|
1175
|
-
logwarn("
|
|
1243
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
1176
1244
|
return false;
|
|
1177
1245
|
}
|
|
1178
1246
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -1185,7 +1253,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1185
1253
|
}
|
|
1186
1254
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
1187
1255
|
this.#responseCb = this.#responseListener.bind(this);
|
|
1188
|
-
this.#page.on("response"
|
|
1256
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
1189
1257
|
}
|
|
1190
1258
|
return true;
|
|
1191
1259
|
}
|
|
@@ -1233,6 +1301,7 @@ var PlaywrightPage = class extends EventEmitter {
|
|
|
1233
1301
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
1234
1302
|
}
|
|
1235
1303
|
this.#status = "busy";
|
|
1304
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
1236
1305
|
return true;
|
|
1237
1306
|
}
|
|
1238
1307
|
async waitForElement(selector, options = {}) {
|
|
@@ -1371,11 +1440,10 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1371
1440
|
for (const page of pages) {
|
|
1372
1441
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
1373
1442
|
const lsdPage = new PlaywrightPage(this, page, pageInfo);
|
|
1443
|
+
this.#lsdPages.push(lsdPage);
|
|
1374
1444
|
if (this.#maxViewportOfNewPage) {
|
|
1375
1445
|
await lsdPage.maximizeViewport();
|
|
1376
1446
|
}
|
|
1377
|
-
this.#lsdPages.push(lsdPage);
|
|
1378
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
1379
1447
|
}
|
|
1380
1448
|
}
|
|
1381
1449
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -1405,8 +1473,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1405
1473
|
this.#lsdPages = [];
|
|
1406
1474
|
this.#nextPageIdx = 1;
|
|
1407
1475
|
this.#gettingPage = false;
|
|
1476
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
1408
1477
|
this.#initPages();
|
|
1409
|
-
browserContext.on("page"
|
|
1478
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
1410
1479
|
const pageInfo = page.pageInfo;
|
|
1411
1480
|
if (pageInfo) {
|
|
1412
1481
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -1415,27 +1484,26 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1415
1484
|
const currentTime2 = getCurrentUnixTime2();
|
|
1416
1485
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
1417
1486
|
const lsdPage = new PlaywrightPage(this, page, pageInfo2);
|
|
1487
|
+
this.#lsdPages.push(lsdPage);
|
|
1418
1488
|
if (this.#maxViewportOfNewPage) {
|
|
1419
1489
|
await lsdPage.maximizeViewport();
|
|
1420
1490
|
}
|
|
1421
|
-
this.#lsdPages.push(lsdPage);
|
|
1422
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
1423
1491
|
}
|
|
1424
1492
|
});
|
|
1425
|
-
browserContext.on("close"
|
|
1493
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
1426
1494
|
if (browserContext !== bc) {
|
|
1427
1495
|
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
1428
1496
|
}
|
|
1429
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
1497
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
1430
1498
|
});
|
|
1431
|
-
this.on("pageClose"
|
|
1499
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
1432
1500
|
if (!(lsdPage instanceof PlaywrightPage)) {
|
|
1433
|
-
logerr(
|
|
1501
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
1434
1502
|
return;
|
|
1435
1503
|
}
|
|
1436
1504
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
1437
1505
|
if (idx < 0) {
|
|
1438
|
-
logerr(
|
|
1506
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
1439
1507
|
return;
|
|
1440
1508
|
}
|
|
1441
1509
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -1452,7 +1520,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1452
1520
|
if (this.#browserContext) {
|
|
1453
1521
|
this.#status = "closed";
|
|
1454
1522
|
this.#lastStatusUpdateTime = getCurrentUnixTime2();
|
|
1455
|
-
loginfo(
|
|
1523
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
1456
1524
|
await this.#browserContext.close();
|
|
1457
1525
|
}
|
|
1458
1526
|
return true;
|
|
@@ -1467,12 +1535,12 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1467
1535
|
await sleep(200);
|
|
1468
1536
|
}
|
|
1469
1537
|
}
|
|
1470
|
-
logwarn(
|
|
1538
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
1471
1539
|
return false;
|
|
1472
1540
|
}
|
|
1473
1541
|
#freeGettingLock() {
|
|
1474
1542
|
if (!this.#gettingPage) {
|
|
1475
|
-
logwarn(
|
|
1543
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
1476
1544
|
}
|
|
1477
1545
|
this.#gettingPage = false;
|
|
1478
1546
|
}
|
|
@@ -1481,7 +1549,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1481
1549
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
1482
1550
|
}
|
|
1483
1551
|
if (maxPageFreeSeconds <= 0) {
|
|
1484
|
-
logwarn(
|
|
1552
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
1485
1553
|
return false;
|
|
1486
1554
|
}
|
|
1487
1555
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -1578,7 +1646,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
|
|
|
1578
1646
|
}
|
|
1579
1647
|
}
|
|
1580
1648
|
id() {
|
|
1581
|
-
return `
|
|
1649
|
+
return `PlaywrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
1582
1650
|
}
|
|
1583
1651
|
isFree() {
|
|
1584
1652
|
return this.#status === "free";
|
|
@@ -1712,34 +1780,33 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
|
|
|
1712
1780
|
this.#executablePath = executablePath;
|
|
1713
1781
|
this.#nextBrowserContextIdx = 1;
|
|
1714
1782
|
this.#closeFreePagesIntervalId = null;
|
|
1715
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
1783
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
1716
1784
|
const browserContexts = browser.contexts();
|
|
1717
1785
|
if (browserContexts.length > 0) {
|
|
1718
|
-
logwarn(
|
|
1786
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
|
|
1719
1787
|
}
|
|
1720
1788
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
1721
1789
|
for (const browserContext of browserContexts) {
|
|
1722
1790
|
const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
1723
1791
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
1724
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
1725
1792
|
}
|
|
1726
|
-
browser.on("disconnected"
|
|
1793
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
1727
1794
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
1728
1795
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
1729
|
-
logerr(
|
|
1796
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
1730
1797
|
}
|
|
1731
1798
|
});
|
|
1732
|
-
this.on("browserContextClose"
|
|
1799
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
1733
1800
|
if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
|
|
1734
|
-
logerr(
|
|
1801
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
1735
1802
|
return;
|
|
1736
1803
|
}
|
|
1737
1804
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
1738
1805
|
if (idx < 0) {
|
|
1739
|
-
logerr(
|
|
1806
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
1740
1807
|
return;
|
|
1741
1808
|
}
|
|
1742
|
-
loginfo(`##
|
|
1809
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
1743
1810
|
`);
|
|
1744
1811
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
1745
1812
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -1760,7 +1827,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
|
|
|
1760
1827
|
}
|
|
1761
1828
|
async newBrowserContext(options) {
|
|
1762
1829
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
1763
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
1830
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
1764
1831
|
return null;
|
|
1765
1832
|
}
|
|
1766
1833
|
const browserContextOptions = {};
|
|
@@ -1779,7 +1846,6 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
|
|
|
1779
1846
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
1780
1847
|
const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
1781
1848
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
1782
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
1783
1849
|
return lsdBrowserContext;
|
|
1784
1850
|
}
|
|
1785
1851
|
async close() {
|
|
@@ -1790,6 +1856,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
|
|
|
1790
1856
|
await lsdBrowserContext.close();
|
|
1791
1857
|
}
|
|
1792
1858
|
await this.#browser.close();
|
|
1859
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
1793
1860
|
return true;
|
|
1794
1861
|
}
|
|
1795
1862
|
browserContexts() {
|
|
@@ -1815,7 +1882,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
|
|
|
1815
1882
|
return this.#executablePath;
|
|
1816
1883
|
}
|
|
1817
1884
|
id() {
|
|
1818
|
-
return `
|
|
1885
|
+
return `PlaywrightBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
1819
1886
|
}
|
|
1820
1887
|
isConnected() {
|
|
1821
1888
|
return this.#browser.isConnected();
|
|
@@ -2165,6 +2232,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2165
2232
|
#requestInterceptionNum;
|
|
2166
2233
|
#responseInterceptionNum;
|
|
2167
2234
|
#client;
|
|
2235
|
+
#isDebugTask;
|
|
2168
2236
|
#hasValidUrl(page) {
|
|
2169
2237
|
const url = page.url();
|
|
2170
2238
|
return url.toLowerCase().startsWith("http");
|
|
@@ -2350,15 +2418,15 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2350
2418
|
}
|
|
2351
2419
|
const page = this.#page;
|
|
2352
2420
|
const pageId = this.#pageId;
|
|
2353
|
-
page.on("close"
|
|
2354
|
-
loginfo(`##browser
|
|
2421
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
2422
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
2355
2423
|
if (!page.pageInfo) {
|
|
2356
|
-
logerr(
|
|
2424
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
2357
2425
|
}
|
|
2358
|
-
this.emit("pageClose");
|
|
2359
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
2426
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
2427
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
2360
2428
|
});
|
|
2361
|
-
page.on("popup"
|
|
2429
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
2362
2430
|
if (p) {
|
|
2363
2431
|
let evtData = null;
|
|
2364
2432
|
const pageInfo = p.pageInfo;
|
|
@@ -2372,12 +2440,12 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2372
2440
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
2373
2441
|
}
|
|
2374
2442
|
} else {
|
|
2375
|
-
logerr(`##browser
|
|
2443
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
2376
2444
|
}
|
|
2377
|
-
loginfo(`##browser
|
|
2378
|
-
this.emit("pagePopup"
|
|
2445
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
2446
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
2379
2447
|
} else {
|
|
2380
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
2448
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
2381
2449
|
}
|
|
2382
2450
|
});
|
|
2383
2451
|
}
|
|
@@ -2392,11 +2460,13 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2392
2460
|
const currentTime = getCurrentUnixTime4();
|
|
2393
2461
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
2394
2462
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
2395
|
-
this.#pageId = `
|
|
2463
|
+
this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
2396
2464
|
this.#closeWhenFree = false;
|
|
2397
2465
|
this.#requestInterceptionNum = 0;
|
|
2398
2466
|
this.#responseInterceptionNum = 0;
|
|
2399
2467
|
this.#client = null;
|
|
2468
|
+
this.#isDebugTask = false;
|
|
2469
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
2400
2470
|
this.#addPageOn();
|
|
2401
2471
|
}
|
|
2402
2472
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -2474,7 +2544,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2474
2544
|
}
|
|
2475
2545
|
async close() {
|
|
2476
2546
|
if (this.#status === "closed") {
|
|
2477
|
-
logwarn(
|
|
2547
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
2478
2548
|
return true;
|
|
2479
2549
|
} else if (this.#status === "busy") {
|
|
2480
2550
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -2485,6 +2555,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2485
2555
|
await this.#page.close();
|
|
2486
2556
|
this.#page = null;
|
|
2487
2557
|
this.#status = "closed";
|
|
2558
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
2488
2559
|
return true;
|
|
2489
2560
|
}
|
|
2490
2561
|
closeWhenFree() {
|
|
@@ -2515,7 +2586,10 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2515
2586
|
if (!this.#page) {
|
|
2516
2587
|
throw new Error("No valid page");
|
|
2517
2588
|
}
|
|
2518
|
-
|
|
2589
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
2590
|
+
if (typeof height === "undefined") {
|
|
2591
|
+
height = 0;
|
|
2592
|
+
}
|
|
2519
2593
|
return height;
|
|
2520
2594
|
}
|
|
2521
2595
|
async evaluate(func, args) {
|
|
@@ -2566,10 +2640,11 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2566
2640
|
return [];
|
|
2567
2641
|
}
|
|
2568
2642
|
async free() {
|
|
2569
|
-
if (this.#status === "free") {
|
|
2570
|
-
logwarn(
|
|
2643
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
2644
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
2571
2645
|
}
|
|
2572
2646
|
this.#status = "free";
|
|
2647
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
2573
2648
|
await this.clearRequestInterceptions();
|
|
2574
2649
|
await this.clearResponseInterceptions();
|
|
2575
2650
|
return true;
|
|
@@ -2670,9 +2745,18 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2670
2745
|
if (!this.#page) {
|
|
2671
2746
|
throw new Error("No valid page");
|
|
2672
2747
|
}
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2748
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
2749
|
+
if (typeof bodyHeight === "undefined") {
|
|
2750
|
+
bodyHeight = 0;
|
|
2751
|
+
}
|
|
2752
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
2753
|
+
if (typeof documentHeight === "undefined") {
|
|
2754
|
+
documentHeight = 0;
|
|
2755
|
+
}
|
|
2756
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
2757
|
+
if (typeof windowHeight === "undefined") {
|
|
2758
|
+
windowHeight = 0;
|
|
2759
|
+
}
|
|
2676
2760
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
2677
2761
|
return pageHeight;
|
|
2678
2762
|
}
|
|
@@ -2686,8 +2770,14 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2686
2770
|
if (!this.#page) {
|
|
2687
2771
|
throw new Error("No valid page");
|
|
2688
2772
|
}
|
|
2689
|
-
|
|
2690
|
-
|
|
2773
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
2774
|
+
if (typeof offsetWidth === "undefined") {
|
|
2775
|
+
offsetWidth = 0;
|
|
2776
|
+
}
|
|
2777
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
2778
|
+
if (typeof windowWidth === "undefined") {
|
|
2779
|
+
windowWidth = 0;
|
|
2780
|
+
}
|
|
2691
2781
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
2692
2782
|
return pageWidth;
|
|
2693
2783
|
}
|
|
@@ -2794,6 +2884,8 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2794
2884
|
}
|
|
2795
2885
|
if (typeof taskId === "number") {
|
|
2796
2886
|
actPageInfo.taskId = taskId;
|
|
2887
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
2888
|
+
this.#isDebugTask = !!debug;
|
|
2797
2889
|
}
|
|
2798
2890
|
if (typeof relatedId === "number") {
|
|
2799
2891
|
actPageInfo.relatedId = relatedId;
|
|
@@ -2836,7 +2928,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2836
2928
|
}
|
|
2837
2929
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
2838
2930
|
if (actOptions.length <= 0) {
|
|
2839
|
-
logwarn("
|
|
2931
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
2840
2932
|
return false;
|
|
2841
2933
|
}
|
|
2842
2934
|
if (this.#requestInterceptionNum <= 0) {
|
|
@@ -2845,11 +2937,18 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2845
2937
|
} else {
|
|
2846
2938
|
this.#requestInterceptionNum++;
|
|
2847
2939
|
}
|
|
2848
|
-
this.#page.on("request"
|
|
2940
|
+
this.#page.on("request" /* PAGE_REQUEST */, async (request) => {
|
|
2849
2941
|
try {
|
|
2850
2942
|
for (const option of actOptions) {
|
|
2851
2943
|
const { requestMatch, action, fulfill } = option;
|
|
2852
2944
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
2945
|
+
if (this.#isDebugTask) {
|
|
2946
|
+
if (matchedFlag) {
|
|
2947
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
2948
|
+
} else {
|
|
2949
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
2950
|
+
}
|
|
2951
|
+
}
|
|
2853
2952
|
if (matchedFlag) {
|
|
2854
2953
|
switch (action) {
|
|
2855
2954
|
case "abort":
|
|
@@ -2884,11 +2983,11 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2884
2983
|
}
|
|
2885
2984
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
2886
2985
|
if (actOptions.length <= 0) {
|
|
2887
|
-
logwarn("
|
|
2986
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
2888
2987
|
return false;
|
|
2889
2988
|
}
|
|
2890
2989
|
this.#responseInterceptionNum++;
|
|
2891
|
-
this.#page.on("response"
|
|
2990
|
+
this.#page.on("response" /* PAGE_RESPONSE */, async (response) => {
|
|
2892
2991
|
try {
|
|
2893
2992
|
if (!response.ok() || !this.#page) {
|
|
2894
2993
|
return false;
|
|
@@ -2909,6 +3008,13 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2909
3008
|
matchedFlag = false;
|
|
2910
3009
|
}
|
|
2911
3010
|
}
|
|
3011
|
+
if (this.#isDebugTask) {
|
|
3012
|
+
if (matchedFlag) {
|
|
3013
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
3014
|
+
} else {
|
|
3015
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
2912
3018
|
if (!matchedFlag) {
|
|
2913
3019
|
continue;
|
|
2914
3020
|
}
|
|
@@ -2925,6 +3031,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2925
3031
|
requestData,
|
|
2926
3032
|
responseData
|
|
2927
3033
|
});
|
|
3034
|
+
loginfo(`##browser cache matched response: ${requestUrl}`);
|
|
2928
3035
|
}
|
|
2929
3036
|
if (typeof handler === "function") {
|
|
2930
3037
|
const pageData = { pageUrl, cookies: "" };
|
|
@@ -2990,6 +3097,7 @@ var PuppeteerPage = class extends EventEmitter4 {
|
|
|
2990
3097
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
2991
3098
|
}
|
|
2992
3099
|
this.#status = "busy";
|
|
3100
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
2993
3101
|
return true;
|
|
2994
3102
|
}
|
|
2995
3103
|
async waitForElement(selector, options = {}) {
|
|
@@ -3100,14 +3208,13 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3100
3208
|
for (const page of pages) {
|
|
3101
3209
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
3102
3210
|
const lsdPage = new PuppeteerPage(this, page, pageInfo);
|
|
3211
|
+
this.#lsdPages.push(lsdPage);
|
|
3103
3212
|
if (this.#maxViewportOfNewPage) {
|
|
3104
3213
|
await lsdPage.maximizeViewport();
|
|
3105
3214
|
}
|
|
3106
3215
|
if (this.#userAgent) {
|
|
3107
3216
|
await lsdPage.setUserAgent(this.#userAgent);
|
|
3108
3217
|
}
|
|
3109
|
-
this.#lsdPages.push(lsdPage);
|
|
3110
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
3111
3218
|
}
|
|
3112
3219
|
}
|
|
3113
3220
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
|
|
@@ -3136,8 +3243,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3136
3243
|
this.#lsdPages = [];
|
|
3137
3244
|
this.#nextPageIdx = 1;
|
|
3138
3245
|
this.#gettingPage = false;
|
|
3246
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
3139
3247
|
this.#initPages();
|
|
3140
|
-
browserContext.on("targetcreated"
|
|
3248
|
+
browserContext.on("targetcreated" /* BROWSERCONTEXT_TARGETCREATED */, async (p) => {
|
|
3141
3249
|
if (p.type() === "page") {
|
|
3142
3250
|
const page = await p.page();
|
|
3143
3251
|
if (!page) {
|
|
@@ -3151,30 +3259,36 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3151
3259
|
const currentTime2 = getCurrentUnixTime5();
|
|
3152
3260
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
3153
3261
|
const lsdPage = new PuppeteerPage(this, page, pageInfo2);
|
|
3154
|
-
|
|
3155
|
-
await lsdPage.maximizeViewport();
|
|
3156
|
-
}
|
|
3262
|
+
this.#lsdPages.push(lsdPage);
|
|
3157
3263
|
if (this.#userAgent) {
|
|
3158
3264
|
await lsdPage.setUserAgent(this.#userAgent);
|
|
3159
3265
|
}
|
|
3160
|
-
this.#
|
|
3161
|
-
|
|
3266
|
+
if (this.#maxViewportOfNewPage) {
|
|
3267
|
+
await lsdPage.maximizeViewport();
|
|
3268
|
+
}
|
|
3162
3269
|
}
|
|
3163
3270
|
}
|
|
3164
3271
|
});
|
|
3165
|
-
|
|
3272
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
3273
|
+
logerr(`##browser LsdBrowserContext puppeteer BrowserContext receives close event`);
|
|
3274
|
+
if (browserContext !== bc) {
|
|
3275
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
3276
|
+
}
|
|
3277
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
3278
|
+
});
|
|
3279
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
3166
3280
|
if (!(lsdPage instanceof PuppeteerPage)) {
|
|
3167
|
-
logerr(
|
|
3281
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
3168
3282
|
return;
|
|
3169
3283
|
}
|
|
3170
3284
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
3171
3285
|
if (idx < 0) {
|
|
3172
|
-
logerr(
|
|
3286
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
3173
3287
|
return;
|
|
3174
3288
|
}
|
|
3175
3289
|
this.#lsdPages.splice(idx, 1);
|
|
3176
3290
|
if (this.#lsdPages.length === 0) {
|
|
3177
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
3291
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
3178
3292
|
}
|
|
3179
3293
|
return;
|
|
3180
3294
|
});
|
|
@@ -3189,7 +3303,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3189
3303
|
if (this.#browserContext) {
|
|
3190
3304
|
this.#status = "closed";
|
|
3191
3305
|
this.#lastStatusUpdateTime = getCurrentUnixTime5();
|
|
3192
|
-
loginfo(
|
|
3306
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
3193
3307
|
if (this.#browserContextCreationMethod !== "launch") {
|
|
3194
3308
|
await this.#browserContext.close();
|
|
3195
3309
|
}
|
|
@@ -3206,12 +3320,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3206
3320
|
await sleep2(200);
|
|
3207
3321
|
}
|
|
3208
3322
|
}
|
|
3209
|
-
logwarn(
|
|
3323
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
3210
3324
|
return false;
|
|
3211
3325
|
}
|
|
3212
3326
|
#freeGettingLock() {
|
|
3213
3327
|
if (!this.#gettingPage) {
|
|
3214
|
-
logwarn(
|
|
3328
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
3215
3329
|
}
|
|
3216
3330
|
this.#gettingPage = false;
|
|
3217
3331
|
}
|
|
@@ -3220,7 +3334,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3220
3334
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
3221
3335
|
}
|
|
3222
3336
|
if (maxPageFreeSeconds <= 0) {
|
|
3223
|
-
logwarn(
|
|
3337
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
3224
3338
|
return false;
|
|
3225
3339
|
}
|
|
3226
3340
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -3319,7 +3433,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3319
3433
|
}
|
|
3320
3434
|
}
|
|
3321
3435
|
id() {
|
|
3322
|
-
return `
|
|
3436
|
+
return `PuppeteerContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
3323
3437
|
}
|
|
3324
3438
|
isIncognito() {
|
|
3325
3439
|
return this.#incognito;
|
|
@@ -3353,7 +3467,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
|
|
|
3353
3467
|
}
|
|
3354
3468
|
if (localStorageOrigins.length > 0) {
|
|
3355
3469
|
await origPage.setRequestInterception(true);
|
|
3356
|
-
origPage.on("request"
|
|
3470
|
+
origPage.on("request" /* PAGE_REQUEST */, (request) => {
|
|
3357
3471
|
request.respond({
|
|
3358
3472
|
status: 200,
|
|
3359
3473
|
// contentType: "text/html; charset=utf-8", // "text/plain",
|
|
@@ -3456,28 +3570,27 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
|
|
|
3456
3570
|
this.#executablePath = executablePath;
|
|
3457
3571
|
this.#nextBrowserContextIdx = 1;
|
|
3458
3572
|
this.#closeFreePagesIntervalId = null;
|
|
3459
|
-
loginfo(`##browser
|
|
3573
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
3460
3574
|
const browserContexts = browser.browserContexts();
|
|
3461
3575
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
|
|
3462
3576
|
for (const browserContext of browserContexts) {
|
|
3463
3577
|
const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
|
|
3464
3578
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
3465
|
-
loginfo(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
3466
3579
|
}
|
|
3467
|
-
browser.on("disconnected"
|
|
3580
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
3468
3581
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
3469
3582
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
3470
|
-
logerr(
|
|
3583
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
3471
3584
|
}
|
|
3472
3585
|
});
|
|
3473
|
-
this.on("browserContextClose"
|
|
3586
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
3474
3587
|
if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
|
|
3475
|
-
logerr(
|
|
3588
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
3476
3589
|
return;
|
|
3477
3590
|
}
|
|
3478
3591
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
3479
3592
|
if (idx < 0) {
|
|
3480
|
-
logerr(
|
|
3593
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
3481
3594
|
return;
|
|
3482
3595
|
}
|
|
3483
3596
|
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
@@ -3501,7 +3614,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
|
|
|
3501
3614
|
}
|
|
3502
3615
|
async newBrowserContext(options) {
|
|
3503
3616
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
3504
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
3617
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
3505
3618
|
return null;
|
|
3506
3619
|
}
|
|
3507
3620
|
const browserContextOptions = {};
|
|
@@ -3514,7 +3627,6 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
|
|
|
3514
3627
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
3515
3628
|
const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
|
|
3516
3629
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
3517
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
3518
3630
|
return lsdBrowserContext;
|
|
3519
3631
|
}
|
|
3520
3632
|
async close() {
|
|
@@ -3525,6 +3637,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
|
|
|
3525
3637
|
await lsdBrowserContext.close();
|
|
3526
3638
|
}
|
|
3527
3639
|
await this.#browser.close();
|
|
3640
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
3528
3641
|
return true;
|
|
3529
3642
|
}
|
|
3530
3643
|
browserContexts() {
|
|
@@ -3550,7 +3663,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
|
|
|
3550
3663
|
return this.#executablePath;
|
|
3551
3664
|
}
|
|
3552
3665
|
id() {
|
|
3553
|
-
return `
|
|
3666
|
+
return `PuppeteerBrowser-${this.#browserIdx}`;
|
|
3554
3667
|
}
|
|
3555
3668
|
isConnected() {
|
|
3556
3669
|
return this.#browser.connected;
|
|
@@ -4279,6 +4392,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4279
4392
|
#responseInterceptionOptions;
|
|
4280
4393
|
#client;
|
|
4281
4394
|
#responseCb;
|
|
4395
|
+
#isDebugTask;
|
|
4282
4396
|
#hasValidUrl(page) {
|
|
4283
4397
|
const url = page.url();
|
|
4284
4398
|
return url.toLowerCase().startsWith("http");
|
|
@@ -4294,7 +4408,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4294
4408
|
const cookieItems = await this.#getCookies(page);
|
|
4295
4409
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
4296
4410
|
if (domainSet.size !== 1) {
|
|
4297
|
-
logwarn(
|
|
4411
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
4298
4412
|
}
|
|
4299
4413
|
for (const domain of domainSet.values()) {
|
|
4300
4414
|
await browserContext.clearCookies({ domain });
|
|
@@ -4500,15 +4614,15 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4500
4614
|
}
|
|
4501
4615
|
const page = this.#page;
|
|
4502
4616
|
const pageId = this.#pageId;
|
|
4503
|
-
page.on("close"
|
|
4504
|
-
loginfo(`##browser
|
|
4617
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
4618
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
4505
4619
|
if (!page.pageInfo) {
|
|
4506
|
-
logerr(
|
|
4620
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
4507
4621
|
}
|
|
4508
|
-
this.emit("pageClose");
|
|
4509
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
4622
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
4623
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
4510
4624
|
});
|
|
4511
|
-
page.on("popup"
|
|
4625
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
4512
4626
|
if (p) {
|
|
4513
4627
|
let evtData = null;
|
|
4514
4628
|
const pageInfo = p.pageInfo;
|
|
@@ -4522,12 +4636,12 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4522
4636
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
4523
4637
|
}
|
|
4524
4638
|
} else {
|
|
4525
|
-
logerr(`##browser
|
|
4639
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
4526
4640
|
}
|
|
4527
|
-
loginfo(`##browser
|
|
4528
|
-
this.emit("pagePopup"
|
|
4641
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
4642
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
4529
4643
|
} else {
|
|
4530
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
4644
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
4531
4645
|
}
|
|
4532
4646
|
});
|
|
4533
4647
|
}
|
|
@@ -4542,12 +4656,14 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4542
4656
|
const currentTime = getCurrentUnixTime7();
|
|
4543
4657
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
4544
4658
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
4545
|
-
this.#pageId = `
|
|
4659
|
+
this.#pageId = `PatchrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
4546
4660
|
this.#closeWhenFree = false;
|
|
4547
4661
|
this.#resquestInterceptionOptions = [];
|
|
4548
4662
|
this.#responseInterceptionOptions = [];
|
|
4549
4663
|
this.#client = null;
|
|
4550
4664
|
this.#responseCb = null;
|
|
4665
|
+
this.#isDebugTask = false;
|
|
4666
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
4551
4667
|
this.#addPageOn();
|
|
4552
4668
|
}
|
|
4553
4669
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -4628,7 +4744,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4628
4744
|
}
|
|
4629
4745
|
async close() {
|
|
4630
4746
|
if (this.#status === "closed") {
|
|
4631
|
-
logwarn(
|
|
4747
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
4632
4748
|
return true;
|
|
4633
4749
|
} else if (this.#status === "busy") {
|
|
4634
4750
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -4639,6 +4755,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4639
4755
|
await this.#page.close();
|
|
4640
4756
|
this.#page = null;
|
|
4641
4757
|
this.#status = "closed";
|
|
4758
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
4642
4759
|
return true;
|
|
4643
4760
|
}
|
|
4644
4761
|
closeWhenFree() {
|
|
@@ -4669,7 +4786,10 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4669
4786
|
if (!this.#page) {
|
|
4670
4787
|
throw new Error("No valid page");
|
|
4671
4788
|
}
|
|
4672
|
-
|
|
4789
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
4790
|
+
if (typeof height === "undefined") {
|
|
4791
|
+
height = 0;
|
|
4792
|
+
}
|
|
4673
4793
|
return height;
|
|
4674
4794
|
}
|
|
4675
4795
|
async evaluate(func, args, isolated = true) {
|
|
@@ -4719,10 +4839,11 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4719
4839
|
return [];
|
|
4720
4840
|
}
|
|
4721
4841
|
async free() {
|
|
4722
|
-
if (this.#status === "free") {
|
|
4723
|
-
logwarn(
|
|
4842
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
4843
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
4724
4844
|
}
|
|
4725
4845
|
this.#status = "free";
|
|
4846
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
4726
4847
|
await this.clearRequestInterceptions();
|
|
4727
4848
|
await this.clearResponseInterceptions();
|
|
4728
4849
|
return true;
|
|
@@ -4819,9 +4940,18 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4819
4940
|
if (!this.#page) {
|
|
4820
4941
|
throw new Error("No valid page");
|
|
4821
4942
|
}
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4943
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
4944
|
+
if (typeof bodyHeight === "undefined") {
|
|
4945
|
+
bodyHeight = 0;
|
|
4946
|
+
}
|
|
4947
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
4948
|
+
if (typeof documentHeight === "undefined") {
|
|
4949
|
+
documentHeight = 0;
|
|
4950
|
+
}
|
|
4951
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
4952
|
+
if (typeof windowHeight === "undefined") {
|
|
4953
|
+
windowHeight = 0;
|
|
4954
|
+
}
|
|
4825
4955
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
4826
4956
|
return pageHeight;
|
|
4827
4957
|
}
|
|
@@ -4835,8 +4965,14 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4835
4965
|
if (!this.#page) {
|
|
4836
4966
|
throw new Error("No valid page");
|
|
4837
4967
|
}
|
|
4838
|
-
|
|
4839
|
-
|
|
4968
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
4969
|
+
if (typeof offsetWidth === "undefined") {
|
|
4970
|
+
offsetWidth = 0;
|
|
4971
|
+
}
|
|
4972
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
4973
|
+
if (typeof windowWidth === "undefined") {
|
|
4974
|
+
windowWidth = 0;
|
|
4975
|
+
}
|
|
4840
4976
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
4841
4977
|
return pageWidth;
|
|
4842
4978
|
}
|
|
@@ -4944,6 +5080,8 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4944
5080
|
}
|
|
4945
5081
|
if (typeof taskId === "number") {
|
|
4946
5082
|
actPageInfo.taskId = taskId;
|
|
5083
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
5084
|
+
this.#isDebugTask = !!debug;
|
|
4947
5085
|
}
|
|
4948
5086
|
if (typeof relatedId === "number") {
|
|
4949
5087
|
actPageInfo.relatedId = relatedId;
|
|
@@ -4987,7 +5125,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
4987
5125
|
}
|
|
4988
5126
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
4989
5127
|
if (actOptions.length <= 0) {
|
|
4990
|
-
logwarn("
|
|
5128
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
4991
5129
|
return false;
|
|
4992
5130
|
}
|
|
4993
5131
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -5008,6 +5146,13 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
5008
5146
|
const { requestMatch, action, fulfill } = option;
|
|
5009
5147
|
const request = route.request();
|
|
5010
5148
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
5149
|
+
if (this.#isDebugTask) {
|
|
5150
|
+
if (matchedFlag) {
|
|
5151
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
5152
|
+
} else {
|
|
5153
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
5154
|
+
}
|
|
5155
|
+
}
|
|
5011
5156
|
if (matchedFlag) {
|
|
5012
5157
|
switch (action) {
|
|
5013
5158
|
case "abort":
|
|
@@ -5059,6 +5204,13 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
5059
5204
|
matchedFlag = false;
|
|
5060
5205
|
}
|
|
5061
5206
|
}
|
|
5207
|
+
if (this.#isDebugTask) {
|
|
5208
|
+
if (matchedFlag) {
|
|
5209
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
5210
|
+
} else {
|
|
5211
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
5212
|
+
}
|
|
5213
|
+
}
|
|
5062
5214
|
if (!matchedFlag) {
|
|
5063
5215
|
continue;
|
|
5064
5216
|
}
|
|
@@ -5094,7 +5246,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
5094
5246
|
}
|
|
5095
5247
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
5096
5248
|
if (actOptions.length <= 0) {
|
|
5097
|
-
logwarn("
|
|
5249
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
5098
5250
|
return false;
|
|
5099
5251
|
}
|
|
5100
5252
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -5107,7 +5259,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
5107
5259
|
}
|
|
5108
5260
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
5109
5261
|
this.#responseCb = this.#responseListener.bind(this);
|
|
5110
|
-
this.#page.on("response"
|
|
5262
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
5111
5263
|
}
|
|
5112
5264
|
return true;
|
|
5113
5265
|
}
|
|
@@ -5155,6 +5307,7 @@ var PatchrightPage = class extends EventEmitter8 {
|
|
|
5155
5307
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
5156
5308
|
}
|
|
5157
5309
|
this.#status = "busy";
|
|
5310
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
5158
5311
|
return true;
|
|
5159
5312
|
}
|
|
5160
5313
|
async waitForElement(selector, options = {}) {
|
|
@@ -5293,11 +5446,10 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5293
5446
|
for (const page of pages) {
|
|
5294
5447
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
5295
5448
|
const lsdPage = new PatchrightPage(this, page, pageInfo);
|
|
5449
|
+
this.#lsdPages.push(lsdPage);
|
|
5296
5450
|
if (this.#maxViewportOfNewPage) {
|
|
5297
5451
|
await lsdPage.maximizeViewport();
|
|
5298
5452
|
}
|
|
5299
|
-
this.#lsdPages.push(lsdPage);
|
|
5300
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
5301
5453
|
}
|
|
5302
5454
|
}
|
|
5303
5455
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -5327,8 +5479,9 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5327
5479
|
this.#lsdPages = [];
|
|
5328
5480
|
this.#nextPageIdx = 1;
|
|
5329
5481
|
this.#gettingPage = false;
|
|
5482
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
5330
5483
|
this.#initPages();
|
|
5331
|
-
browserContext.on("page"
|
|
5484
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
5332
5485
|
const pageInfo = page.pageInfo;
|
|
5333
5486
|
if (pageInfo) {
|
|
5334
5487
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -5337,27 +5490,26 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5337
5490
|
const currentTime2 = getCurrentUnixTime8();
|
|
5338
5491
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
5339
5492
|
const lsdPage = new PatchrightPage(this, page, pageInfo2);
|
|
5493
|
+
this.#lsdPages.push(lsdPage);
|
|
5340
5494
|
if (this.#maxViewportOfNewPage) {
|
|
5341
5495
|
await lsdPage.maximizeViewport();
|
|
5342
5496
|
}
|
|
5343
|
-
this.#lsdPages.push(lsdPage);
|
|
5344
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
5345
5497
|
}
|
|
5346
5498
|
});
|
|
5347
|
-
browserContext.on("close"
|
|
5499
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
5348
5500
|
if (browserContext !== bc) {
|
|
5349
|
-
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
5501
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
5350
5502
|
}
|
|
5351
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
5503
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
5352
5504
|
});
|
|
5353
|
-
this.on("pageClose"
|
|
5505
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
5354
5506
|
if (!(lsdPage instanceof PatchrightPage)) {
|
|
5355
|
-
logerr(
|
|
5507
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
5356
5508
|
return;
|
|
5357
5509
|
}
|
|
5358
5510
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
5359
5511
|
if (idx < 0) {
|
|
5360
|
-
logerr(
|
|
5512
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
5361
5513
|
return;
|
|
5362
5514
|
}
|
|
5363
5515
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -5374,7 +5526,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5374
5526
|
if (this.#browserContext) {
|
|
5375
5527
|
this.#status = "closed";
|
|
5376
5528
|
this.#lastStatusUpdateTime = getCurrentUnixTime8();
|
|
5377
|
-
loginfo(
|
|
5529
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
5378
5530
|
await this.#browserContext.close();
|
|
5379
5531
|
}
|
|
5380
5532
|
return true;
|
|
@@ -5389,12 +5541,12 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5389
5541
|
await sleep3(200);
|
|
5390
5542
|
}
|
|
5391
5543
|
}
|
|
5392
|
-
logwarn(
|
|
5544
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
5393
5545
|
return false;
|
|
5394
5546
|
}
|
|
5395
5547
|
#freeGettingLock() {
|
|
5396
5548
|
if (!this.#gettingPage) {
|
|
5397
|
-
logwarn(
|
|
5549
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
5398
5550
|
}
|
|
5399
5551
|
this.#gettingPage = false;
|
|
5400
5552
|
}
|
|
@@ -5403,7 +5555,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5403
5555
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
5404
5556
|
}
|
|
5405
5557
|
if (maxPageFreeSeconds <= 0) {
|
|
5406
|
-
logwarn(
|
|
5558
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
5407
5559
|
return false;
|
|
5408
5560
|
}
|
|
5409
5561
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -5500,7 +5652,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
|
|
|
5500
5652
|
}
|
|
5501
5653
|
}
|
|
5502
5654
|
id() {
|
|
5503
|
-
return `
|
|
5655
|
+
return `PatchrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
5504
5656
|
}
|
|
5505
5657
|
isFree() {
|
|
5506
5658
|
return this.#status === "free";
|
|
@@ -5634,34 +5786,33 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
|
|
|
5634
5786
|
this.#executablePath = executablePath;
|
|
5635
5787
|
this.#nextBrowserContextIdx = 1;
|
|
5636
5788
|
this.#closeFreePagesIntervalId = null;
|
|
5637
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
5789
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
5638
5790
|
const browserContexts = browser.contexts();
|
|
5639
5791
|
if (browserContexts.length > 0) {
|
|
5640
|
-
logwarn(
|
|
5792
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
|
|
5641
5793
|
}
|
|
5642
5794
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
5643
5795
|
for (const browserContext of browserContexts) {
|
|
5644
5796
|
const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
5645
5797
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
5646
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
5647
5798
|
}
|
|
5648
|
-
browser.on("disconnected"
|
|
5799
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
5649
5800
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
5650
5801
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
5651
|
-
logerr(
|
|
5802
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
5652
5803
|
}
|
|
5653
5804
|
});
|
|
5654
|
-
this.on("browserContextClose"
|
|
5805
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
5655
5806
|
if (!(lsdBrowserContext instanceof PatchrightBrowserContext)) {
|
|
5656
|
-
logerr(
|
|
5807
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
5657
5808
|
return;
|
|
5658
5809
|
}
|
|
5659
5810
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
5660
5811
|
if (idx < 0) {
|
|
5661
|
-
logerr(
|
|
5812
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
5662
5813
|
return;
|
|
5663
5814
|
}
|
|
5664
|
-
loginfo(`##
|
|
5815
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
5665
5816
|
`);
|
|
5666
5817
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
5667
5818
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -5682,7 +5833,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
|
|
|
5682
5833
|
}
|
|
5683
5834
|
async newBrowserContext(options) {
|
|
5684
5835
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
5685
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
5836
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
5686
5837
|
return null;
|
|
5687
5838
|
}
|
|
5688
5839
|
const browserContextOptions = {};
|
|
@@ -5701,7 +5852,6 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
|
|
|
5701
5852
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
5702
5853
|
const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
5703
5854
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
5704
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
5705
5855
|
return lsdBrowserContext;
|
|
5706
5856
|
}
|
|
5707
5857
|
async close() {
|
|
@@ -5712,6 +5862,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
|
|
|
5712
5862
|
await lsdBrowserContext.close();
|
|
5713
5863
|
}
|
|
5714
5864
|
await this.#browser.close();
|
|
5865
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
5715
5866
|
return true;
|
|
5716
5867
|
}
|
|
5717
5868
|
browserContexts() {
|
|
@@ -5737,7 +5888,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
|
|
|
5737
5888
|
return this.#executablePath;
|
|
5738
5889
|
}
|
|
5739
5890
|
id() {
|
|
5740
|
-
return `
|
|
5891
|
+
return `PatchrightBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
5741
5892
|
}
|
|
5742
5893
|
isConnected() {
|
|
5743
5894
|
return this.#browser.isConnected();
|
|
@@ -6093,6 +6244,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6093
6244
|
#responseInterceptionOptions;
|
|
6094
6245
|
#client;
|
|
6095
6246
|
#responseCb;
|
|
6247
|
+
#isDebugTask;
|
|
6096
6248
|
#hasValidUrl(page) {
|
|
6097
6249
|
const url = page.url();
|
|
6098
6250
|
return url.toLowerCase().startsWith("http");
|
|
@@ -6108,7 +6260,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6108
6260
|
const cookieItems = await this.#getCookies(page);
|
|
6109
6261
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
6110
6262
|
if (domainSet.size !== 1) {
|
|
6111
|
-
logwarn(
|
|
6263
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
6112
6264
|
}
|
|
6113
6265
|
for (const domain of domainSet.values()) {
|
|
6114
6266
|
await browserContext.clearCookies({ domain });
|
|
@@ -6314,15 +6466,15 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6314
6466
|
}
|
|
6315
6467
|
const page = this.#page;
|
|
6316
6468
|
const pageId = this.#pageId;
|
|
6317
|
-
page.on("close"
|
|
6318
|
-
loginfo(`##browser
|
|
6469
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
6470
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
6319
6471
|
if (!page.pageInfo) {
|
|
6320
|
-
logerr(
|
|
6472
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
6321
6473
|
}
|
|
6322
|
-
this.emit("pageClose");
|
|
6323
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
6474
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
6475
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
6324
6476
|
});
|
|
6325
|
-
page.on("popup"
|
|
6477
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
6326
6478
|
if (p) {
|
|
6327
6479
|
let evtData = null;
|
|
6328
6480
|
const pageInfo = p.pageInfo;
|
|
@@ -6336,12 +6488,12 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6336
6488
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
6337
6489
|
}
|
|
6338
6490
|
} else {
|
|
6339
|
-
logerr(`##browser
|
|
6491
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
6340
6492
|
}
|
|
6341
|
-
loginfo(`##browser
|
|
6342
|
-
this.emit("pagePopup"
|
|
6493
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
6494
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
6343
6495
|
} else {
|
|
6344
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
6496
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
6345
6497
|
}
|
|
6346
6498
|
});
|
|
6347
6499
|
}
|
|
@@ -6356,12 +6508,14 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6356
6508
|
const currentTime = getCurrentUnixTime10();
|
|
6357
6509
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
6358
6510
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
6359
|
-
this.#pageId = `
|
|
6511
|
+
this.#pageId = `CamoufoxPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
6360
6512
|
this.#closeWhenFree = false;
|
|
6361
6513
|
this.#resquestInterceptionOptions = [];
|
|
6362
6514
|
this.#responseInterceptionOptions = [];
|
|
6363
6515
|
this.#client = null;
|
|
6364
6516
|
this.#responseCb = null;
|
|
6517
|
+
this.#isDebugTask = false;
|
|
6518
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
6365
6519
|
this.#addPageOn();
|
|
6366
6520
|
}
|
|
6367
6521
|
async addPreloadScript() {
|
|
@@ -6429,7 +6583,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6429
6583
|
}
|
|
6430
6584
|
async close() {
|
|
6431
6585
|
if (this.#status === "closed") {
|
|
6432
|
-
logwarn(
|
|
6586
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
6433
6587
|
return true;
|
|
6434
6588
|
} else if (this.#status === "busy") {
|
|
6435
6589
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -6440,6 +6594,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6440
6594
|
await this.#page.close();
|
|
6441
6595
|
this.#page = null;
|
|
6442
6596
|
this.#status = "closed";
|
|
6597
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
6443
6598
|
return true;
|
|
6444
6599
|
}
|
|
6445
6600
|
closeWhenFree() {
|
|
@@ -6470,7 +6625,10 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6470
6625
|
if (!this.#page) {
|
|
6471
6626
|
throw new Error("No valid page");
|
|
6472
6627
|
}
|
|
6473
|
-
|
|
6628
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
6629
|
+
if (typeof height === "undefined") {
|
|
6630
|
+
height = 0;
|
|
6631
|
+
}
|
|
6474
6632
|
return height;
|
|
6475
6633
|
}
|
|
6476
6634
|
async evaluate(func, args, isolated = true) {
|
|
@@ -6521,10 +6679,11 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6521
6679
|
return [];
|
|
6522
6680
|
}
|
|
6523
6681
|
async free() {
|
|
6524
|
-
if (this.#status === "free") {
|
|
6525
|
-
logwarn(
|
|
6682
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
6683
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
6526
6684
|
}
|
|
6527
6685
|
this.#status = "free";
|
|
6686
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
6528
6687
|
await this.clearRequestInterceptions();
|
|
6529
6688
|
await this.clearResponseInterceptions();
|
|
6530
6689
|
return true;
|
|
@@ -6621,9 +6780,18 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6621
6780
|
if (!this.#page) {
|
|
6622
6781
|
throw new Error("No valid page");
|
|
6623
6782
|
}
|
|
6624
|
-
|
|
6625
|
-
|
|
6626
|
-
|
|
6783
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
6784
|
+
if (typeof bodyHeight === "undefined") {
|
|
6785
|
+
bodyHeight = 0;
|
|
6786
|
+
}
|
|
6787
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
6788
|
+
if (typeof documentHeight === "undefined") {
|
|
6789
|
+
documentHeight = 0;
|
|
6790
|
+
}
|
|
6791
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
6792
|
+
if (typeof windowHeight === "undefined") {
|
|
6793
|
+
windowHeight = 0;
|
|
6794
|
+
}
|
|
6627
6795
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
6628
6796
|
return pageHeight;
|
|
6629
6797
|
}
|
|
@@ -6637,8 +6805,14 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6637
6805
|
if (!this.#page) {
|
|
6638
6806
|
throw new Error("No valid page");
|
|
6639
6807
|
}
|
|
6640
|
-
|
|
6641
|
-
|
|
6808
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
6809
|
+
if (typeof offsetWidth === "undefined") {
|
|
6810
|
+
offsetWidth = 0;
|
|
6811
|
+
}
|
|
6812
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
6813
|
+
if (typeof windowWidth === "undefined") {
|
|
6814
|
+
windowWidth = 0;
|
|
6815
|
+
}
|
|
6642
6816
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
6643
6817
|
return pageWidth;
|
|
6644
6818
|
}
|
|
@@ -6746,6 +6920,8 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6746
6920
|
}
|
|
6747
6921
|
if (typeof taskId === "number") {
|
|
6748
6922
|
actPageInfo.taskId = taskId;
|
|
6923
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
6924
|
+
this.#isDebugTask = !!debug;
|
|
6749
6925
|
}
|
|
6750
6926
|
if (typeof relatedId === "number") {
|
|
6751
6927
|
actPageInfo.relatedId = relatedId;
|
|
@@ -6789,7 +6965,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6789
6965
|
}
|
|
6790
6966
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
6791
6967
|
if (actOptions.length <= 0) {
|
|
6792
|
-
logwarn("
|
|
6968
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
6793
6969
|
return false;
|
|
6794
6970
|
}
|
|
6795
6971
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -6810,6 +6986,13 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6810
6986
|
const { requestMatch, action, fulfill } = option;
|
|
6811
6987
|
const request = route.request();
|
|
6812
6988
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
6989
|
+
if (this.#isDebugTask) {
|
|
6990
|
+
if (matchedFlag) {
|
|
6991
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
6992
|
+
} else {
|
|
6993
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
6994
|
+
}
|
|
6995
|
+
}
|
|
6813
6996
|
if (matchedFlag) {
|
|
6814
6997
|
switch (action) {
|
|
6815
6998
|
case "abort":
|
|
@@ -6861,6 +7044,13 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6861
7044
|
matchedFlag = false;
|
|
6862
7045
|
}
|
|
6863
7046
|
}
|
|
7047
|
+
if (this.#isDebugTask) {
|
|
7048
|
+
if (matchedFlag) {
|
|
7049
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
7050
|
+
} else {
|
|
7051
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
7052
|
+
}
|
|
7053
|
+
}
|
|
6864
7054
|
if (!matchedFlag) {
|
|
6865
7055
|
continue;
|
|
6866
7056
|
}
|
|
@@ -6896,7 +7086,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6896
7086
|
}
|
|
6897
7087
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
6898
7088
|
if (actOptions.length <= 0) {
|
|
6899
|
-
logwarn("
|
|
7089
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
6900
7090
|
return false;
|
|
6901
7091
|
}
|
|
6902
7092
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -6909,7 +7099,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6909
7099
|
}
|
|
6910
7100
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
6911
7101
|
this.#responseCb = this.#responseListener.bind(this);
|
|
6912
|
-
this.#page.on("response"
|
|
7102
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
6913
7103
|
}
|
|
6914
7104
|
return true;
|
|
6915
7105
|
}
|
|
@@ -6957,6 +7147,7 @@ var CamoufoxPage = class extends EventEmitter11 {
|
|
|
6957
7147
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
6958
7148
|
}
|
|
6959
7149
|
this.#status = "busy";
|
|
7150
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
6960
7151
|
return true;
|
|
6961
7152
|
}
|
|
6962
7153
|
async waitForElement(selector, options = {}) {
|
|
@@ -7095,11 +7286,10 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7095
7286
|
for (const page of pages) {
|
|
7096
7287
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
7097
7288
|
const lsdPage = new CamoufoxPage(this, page, pageInfo);
|
|
7289
|
+
this.#lsdPages.push(lsdPage);
|
|
7098
7290
|
if (this.#maxViewportOfNewPage) {
|
|
7099
7291
|
await lsdPage.maximizeViewport();
|
|
7100
7292
|
}
|
|
7101
|
-
this.#lsdPages.push(lsdPage);
|
|
7102
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
7103
7293
|
}
|
|
7104
7294
|
}
|
|
7105
7295
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -7129,8 +7319,9 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7129
7319
|
this.#lsdPages = [];
|
|
7130
7320
|
this.#nextPageIdx = 1;
|
|
7131
7321
|
this.#gettingPage = false;
|
|
7322
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
7132
7323
|
this.#initPages();
|
|
7133
|
-
browserContext.on("page"
|
|
7324
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
7134
7325
|
const pageInfo = page.pageInfo;
|
|
7135
7326
|
if (pageInfo) {
|
|
7136
7327
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -7139,27 +7330,26 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7139
7330
|
const currentTime2 = getCurrentUnixTime11();
|
|
7140
7331
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
7141
7332
|
const lsdPage = new CamoufoxPage(this, page, pageInfo2);
|
|
7333
|
+
this.#lsdPages.push(lsdPage);
|
|
7142
7334
|
if (this.#maxViewportOfNewPage) {
|
|
7143
7335
|
await lsdPage.maximizeViewport();
|
|
7144
7336
|
}
|
|
7145
|
-
this.#lsdPages.push(lsdPage);
|
|
7146
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
7147
7337
|
}
|
|
7148
7338
|
});
|
|
7149
|
-
browserContext.on("close"
|
|
7339
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
7150
7340
|
if (browserContext !== bc) {
|
|
7151
|
-
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
7341
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
7152
7342
|
}
|
|
7153
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
7343
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
7154
7344
|
});
|
|
7155
|
-
this.on("pageClose"
|
|
7345
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
7156
7346
|
if (!(lsdPage instanceof CamoufoxPage)) {
|
|
7157
|
-
logerr(
|
|
7347
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
7158
7348
|
return;
|
|
7159
7349
|
}
|
|
7160
7350
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
7161
7351
|
if (idx < 0) {
|
|
7162
|
-
logerr(
|
|
7352
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
7163
7353
|
return;
|
|
7164
7354
|
}
|
|
7165
7355
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -7176,7 +7366,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7176
7366
|
if (this.#browserContext) {
|
|
7177
7367
|
this.#status = "closed";
|
|
7178
7368
|
this.#lastStatusUpdateTime = getCurrentUnixTime11();
|
|
7179
|
-
loginfo(
|
|
7369
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
7180
7370
|
await this.#browserContext.close();
|
|
7181
7371
|
}
|
|
7182
7372
|
return true;
|
|
@@ -7191,12 +7381,12 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7191
7381
|
await sleep4(200);
|
|
7192
7382
|
}
|
|
7193
7383
|
}
|
|
7194
|
-
logwarn(
|
|
7384
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
7195
7385
|
return false;
|
|
7196
7386
|
}
|
|
7197
7387
|
#freeGettingLock() {
|
|
7198
7388
|
if (!this.#gettingPage) {
|
|
7199
|
-
logwarn(
|
|
7389
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
7200
7390
|
}
|
|
7201
7391
|
this.#gettingPage = false;
|
|
7202
7392
|
}
|
|
@@ -7205,7 +7395,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7205
7395
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
7206
7396
|
}
|
|
7207
7397
|
if (maxPageFreeSeconds <= 0) {
|
|
7208
|
-
logwarn(
|
|
7398
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
7209
7399
|
return false;
|
|
7210
7400
|
}
|
|
7211
7401
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -7302,7 +7492,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
|
|
|
7302
7492
|
}
|
|
7303
7493
|
}
|
|
7304
7494
|
id() {
|
|
7305
|
-
return `
|
|
7495
|
+
return `CamoufoxContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
7306
7496
|
}
|
|
7307
7497
|
isFree() {
|
|
7308
7498
|
return this.#status === "free";
|
|
@@ -7436,34 +7626,33 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
|
|
|
7436
7626
|
this.#executablePath = executablePath;
|
|
7437
7627
|
this.#nextBrowserContextIdx = 1;
|
|
7438
7628
|
this.#closeFreePagesIntervalId = null;
|
|
7439
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
7629
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
7440
7630
|
const browserContexts = browser.contexts();
|
|
7441
7631
|
if (browserContexts.length > 0) {
|
|
7442
|
-
logwarn(
|
|
7632
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
|
|
7443
7633
|
}
|
|
7444
7634
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
7445
7635
|
for (const browserContext of browserContexts) {
|
|
7446
7636
|
const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
7447
7637
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
7448
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
7449
7638
|
}
|
|
7450
|
-
browser.on("disconnected"
|
|
7639
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
7451
7640
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
7452
7641
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
7453
|
-
logerr(
|
|
7642
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
7454
7643
|
}
|
|
7455
7644
|
});
|
|
7456
|
-
this.on("browserContextClose"
|
|
7645
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
7457
7646
|
if (!(lsdBrowserContext instanceof CamoufoxBrowserContext)) {
|
|
7458
|
-
logerr(
|
|
7647
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
7459
7648
|
return;
|
|
7460
7649
|
}
|
|
7461
7650
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
7462
7651
|
if (idx < 0) {
|
|
7463
|
-
logerr(
|
|
7652
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
7464
7653
|
return;
|
|
7465
7654
|
}
|
|
7466
|
-
loginfo(`##
|
|
7655
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
7467
7656
|
`);
|
|
7468
7657
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
7469
7658
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -7484,7 +7673,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
|
|
|
7484
7673
|
}
|
|
7485
7674
|
async newBrowserContext(options) {
|
|
7486
7675
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
7487
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
7676
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
7488
7677
|
return null;
|
|
7489
7678
|
}
|
|
7490
7679
|
const browserContextOptions = {};
|
|
@@ -7503,7 +7692,6 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
|
|
|
7503
7692
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
7504
7693
|
const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
7505
7694
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
7506
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
7507
7695
|
return lsdBrowserContext;
|
|
7508
7696
|
}
|
|
7509
7697
|
async close() {
|
|
@@ -7514,6 +7702,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
|
|
|
7514
7702
|
await lsdBrowserContext.close();
|
|
7515
7703
|
}
|
|
7516
7704
|
await this.#browser.close();
|
|
7705
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
7517
7706
|
return true;
|
|
7518
7707
|
}
|
|
7519
7708
|
browserContexts() {
|
|
@@ -7539,7 +7728,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
|
|
|
7539
7728
|
return this.#executablePath;
|
|
7540
7729
|
}
|
|
7541
7730
|
id() {
|
|
7542
|
-
return `
|
|
7731
|
+
return `CamoufoxBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
7543
7732
|
}
|
|
7544
7733
|
isConnected() {
|
|
7545
7734
|
return this.#browser.isConnected();
|
|
@@ -7701,22 +7890,22 @@ var LsdBrowserController = class _LsdBrowserController {
|
|
|
7701
7890
|
const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
|
|
7702
7891
|
let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
|
|
7703
7892
|
if (idx >= 0) {
|
|
7704
|
-
logwarn(
|
|
7893
|
+
logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
|
|
7705
7894
|
args.splice(idx, 1);
|
|
7706
7895
|
}
|
|
7707
7896
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
|
|
7708
7897
|
if (idx >= 0) {
|
|
7709
|
-
logwarn(
|
|
7898
|
+
logwarn(`##browser controller Please use options.proxy instead when launching new browser.`);
|
|
7710
7899
|
args.splice(idx, 1);
|
|
7711
7900
|
}
|
|
7712
7901
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
|
|
7713
7902
|
if (idx >= 0) {
|
|
7714
|
-
logwarn(
|
|
7903
|
+
logwarn(`##browser controller Please use options.userDataDir instead when launching new browser.`);
|
|
7715
7904
|
args.splice(idx, 1);
|
|
7716
7905
|
}
|
|
7717
7906
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--start-maximized"));
|
|
7718
7907
|
if (idx >= 0) {
|
|
7719
|
-
logwarn(
|
|
7908
|
+
logwarn(`##browser controller Please use options.maxWindowSize instead when launching new browser.`);
|
|
7720
7909
|
args.splice(idx, 1);
|
|
7721
7910
|
}
|
|
7722
7911
|
let lsdBrowser;
|
|
@@ -7914,7 +8103,7 @@ var LsdBrowserController = class _LsdBrowserController {
|
|
|
7914
8103
|
const pids = await getPidsListeningOnPort(port);
|
|
7915
8104
|
let browserPid = 0;
|
|
7916
8105
|
if (pids.length !== 1) {
|
|
7917
|
-
logerr(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
|
|
8106
|
+
logerr(`##browser controller pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
|
|
7918
8107
|
} else {
|
|
7919
8108
|
browserPid = pids[0];
|
|
7920
8109
|
}
|
|
@@ -7958,6 +8147,10 @@ var controller = new LsdBrowserController();
|
|
|
7958
8147
|
export {
|
|
7959
8148
|
CheerioElement,
|
|
7960
8149
|
CheerioPage,
|
|
8150
|
+
ControllerEvent,
|
|
8151
|
+
LsdBrowserContextEvent,
|
|
8152
|
+
LsdBrowserEvent,
|
|
8153
|
+
LsdPageEvent,
|
|
7961
8154
|
PlaywrightBrowser,
|
|
7962
8155
|
PlaywrightBrowserContext,
|
|
7963
8156
|
PlaywrightElement,
|