@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.cjs
CHANGED
|
@@ -32,6 +32,10 @@ var src_exports = {};
|
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
CheerioElement: () => CheerioElement,
|
|
34
34
|
CheerioPage: () => CheerioPage,
|
|
35
|
+
ControllerEvent: () => ControllerEvent,
|
|
36
|
+
LsdBrowserContextEvent: () => LsdBrowserContextEvent,
|
|
37
|
+
LsdBrowserEvent: () => LsdBrowserEvent,
|
|
38
|
+
LsdPageEvent: () => LsdPageEvent,
|
|
35
39
|
PlaywrightBrowser: () => PlaywrightBrowser,
|
|
36
40
|
PlaywrightBrowserContext: () => PlaywrightBrowserContext,
|
|
37
41
|
PlaywrightElement: () => PlaywrightElement,
|
|
@@ -45,6 +49,32 @@ __export(src_exports, {
|
|
|
45
49
|
});
|
|
46
50
|
module.exports = __toCommonJS(src_exports);
|
|
47
51
|
|
|
52
|
+
// src/types/types.ts
|
|
53
|
+
var ControllerEvent = /* @__PURE__ */ ((ControllerEvent2) => {
|
|
54
|
+
ControllerEvent2["BROWSERCONTEXT_CLOSE"] = "close";
|
|
55
|
+
ControllerEvent2["BROWSERCONTEXT_PAGE"] = "page";
|
|
56
|
+
ControllerEvent2["BROWSERCONTEXT_TARGETCREATED"] = "targetcreated";
|
|
57
|
+
ControllerEvent2["BROWSER_DISCONNECTED"] = "disconnected";
|
|
58
|
+
ControllerEvent2["PAGE_CLOSE"] = "close";
|
|
59
|
+
ControllerEvent2["PAGE_POUP"] = "popup";
|
|
60
|
+
ControllerEvent2["PAGE_REQUEST"] = "request";
|
|
61
|
+
ControllerEvent2["PAGE_RESPONSE"] = "response";
|
|
62
|
+
return ControllerEvent2;
|
|
63
|
+
})(ControllerEvent || {});
|
|
64
|
+
var LsdPageEvent = /* @__PURE__ */ ((LsdPageEvent2) => {
|
|
65
|
+
LsdPageEvent2["PAGE_CLOSE"] = "pageClose";
|
|
66
|
+
LsdPageEvent2["PAGE_POPUP"] = "pagePopup";
|
|
67
|
+
return LsdPageEvent2;
|
|
68
|
+
})(LsdPageEvent || {});
|
|
69
|
+
var LsdBrowserContextEvent = /* @__PURE__ */ ((LsdBrowserContextEvent2) => {
|
|
70
|
+
LsdBrowserContextEvent2["PAGE_CLOSE"] = "pageClose";
|
|
71
|
+
return LsdBrowserContextEvent2;
|
|
72
|
+
})(LsdBrowserContextEvent || {});
|
|
73
|
+
var LsdBrowserEvent = /* @__PURE__ */ ((LsdBrowserEvent2) => {
|
|
74
|
+
LsdBrowserEvent2["BROWSER_CONTEXT_CLOSE"] = "browserContextClose";
|
|
75
|
+
return LsdBrowserEvent2;
|
|
76
|
+
})(LsdBrowserEvent || {});
|
|
77
|
+
|
|
48
78
|
// src/utils/log.ts
|
|
49
79
|
var import_utils = require("@letsscrapedata/utils");
|
|
50
80
|
var pkgLog = import_utils.log;
|
|
@@ -56,6 +86,9 @@ function setControllerLogFun(logFun) {
|
|
|
56
86
|
return false;
|
|
57
87
|
}
|
|
58
88
|
}
|
|
89
|
+
async function logdbg(...args) {
|
|
90
|
+
await pkgLog(import_utils.LogLevel.DBG, ...args);
|
|
91
|
+
}
|
|
59
92
|
async function loginfo(...args) {
|
|
60
93
|
await pkgLog(import_utils.LogLevel.INF, ...args);
|
|
61
94
|
}
|
|
@@ -403,6 +436,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
403
436
|
#responseInterceptionOptions;
|
|
404
437
|
#client;
|
|
405
438
|
#responseCb;
|
|
439
|
+
#isDebugTask;
|
|
406
440
|
#hasValidUrl(page) {
|
|
407
441
|
const url = page.url();
|
|
408
442
|
return url.toLowerCase().startsWith("http");
|
|
@@ -418,7 +452,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
418
452
|
const cookieItems = await this.#getCookies(page);
|
|
419
453
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
420
454
|
if (domainSet.size !== 1) {
|
|
421
|
-
logwarn(
|
|
455
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
422
456
|
}
|
|
423
457
|
for (const domain of domainSet.values()) {
|
|
424
458
|
await browserContext.clearCookies({ domain });
|
|
@@ -624,15 +658,15 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
624
658
|
}
|
|
625
659
|
const page = this.#page;
|
|
626
660
|
const pageId = this.#pageId;
|
|
627
|
-
page.on("close"
|
|
628
|
-
loginfo(`##browser
|
|
661
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
662
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
629
663
|
if (!page.pageInfo) {
|
|
630
|
-
logerr(
|
|
664
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
631
665
|
}
|
|
632
|
-
this.emit("pageClose");
|
|
633
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
666
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
667
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
634
668
|
});
|
|
635
|
-
page.on("popup"
|
|
669
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
636
670
|
if (p) {
|
|
637
671
|
let evtData = null;
|
|
638
672
|
const pageInfo = p.pageInfo;
|
|
@@ -646,12 +680,12 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
646
680
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
647
681
|
}
|
|
648
682
|
} else {
|
|
649
|
-
logerr(`##browser
|
|
683
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
650
684
|
}
|
|
651
|
-
loginfo(`##browser
|
|
652
|
-
this.emit("pagePopup"
|
|
685
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
686
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
653
687
|
} else {
|
|
654
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
688
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
655
689
|
}
|
|
656
690
|
});
|
|
657
691
|
}
|
|
@@ -666,12 +700,14 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
666
700
|
const currentTime = (0, import_utils3.getCurrentUnixTime)();
|
|
667
701
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
668
702
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
669
|
-
this.#pageId = `
|
|
703
|
+
this.#pageId = `PlaywrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
670
704
|
this.#closeWhenFree = false;
|
|
671
705
|
this.#resquestInterceptionOptions = [];
|
|
672
706
|
this.#responseInterceptionOptions = [];
|
|
673
707
|
this.#client = null;
|
|
674
708
|
this.#responseCb = null;
|
|
709
|
+
this.#isDebugTask = false;
|
|
710
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
675
711
|
this.#addPageOn();
|
|
676
712
|
}
|
|
677
713
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -752,7 +788,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
752
788
|
}
|
|
753
789
|
async close() {
|
|
754
790
|
if (this.#status === "closed") {
|
|
755
|
-
logwarn(
|
|
791
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
756
792
|
return true;
|
|
757
793
|
} else if (this.#status === "busy") {
|
|
758
794
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -763,6 +799,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
763
799
|
await this.#page.close();
|
|
764
800
|
this.#page = null;
|
|
765
801
|
this.#status = "closed";
|
|
802
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
766
803
|
return true;
|
|
767
804
|
}
|
|
768
805
|
closeWhenFree() {
|
|
@@ -793,7 +830,10 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
793
830
|
if (!this.#page) {
|
|
794
831
|
throw new Error("No valid page");
|
|
795
832
|
}
|
|
796
|
-
|
|
833
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
834
|
+
if (typeof height === "undefined") {
|
|
835
|
+
height = 0;
|
|
836
|
+
}
|
|
797
837
|
return height;
|
|
798
838
|
}
|
|
799
839
|
async evaluate(func, args) {
|
|
@@ -844,10 +884,11 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
844
884
|
return [];
|
|
845
885
|
}
|
|
846
886
|
async free() {
|
|
847
|
-
if (this.#status === "free") {
|
|
848
|
-
logwarn(
|
|
887
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
888
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
849
889
|
}
|
|
850
890
|
this.#status = "free";
|
|
891
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
851
892
|
await this.clearRequestInterceptions();
|
|
852
893
|
await this.clearResponseInterceptions();
|
|
853
894
|
return true;
|
|
@@ -944,9 +985,18 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
944
985
|
if (!this.#page) {
|
|
945
986
|
throw new Error("No valid page");
|
|
946
987
|
}
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
988
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
989
|
+
if (typeof bodyHeight === "undefined") {
|
|
990
|
+
bodyHeight = 0;
|
|
991
|
+
}
|
|
992
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
993
|
+
if (typeof documentHeight === "undefined") {
|
|
994
|
+
documentHeight = 0;
|
|
995
|
+
}
|
|
996
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
997
|
+
if (typeof windowHeight === "undefined") {
|
|
998
|
+
windowHeight = 0;
|
|
999
|
+
}
|
|
950
1000
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
951
1001
|
return pageHeight;
|
|
952
1002
|
}
|
|
@@ -960,8 +1010,14 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
960
1010
|
if (!this.#page) {
|
|
961
1011
|
throw new Error("No valid page");
|
|
962
1012
|
}
|
|
963
|
-
|
|
964
|
-
|
|
1013
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
1014
|
+
if (typeof offsetWidth === "undefined") {
|
|
1015
|
+
offsetWidth = 0;
|
|
1016
|
+
}
|
|
1017
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
1018
|
+
if (typeof windowWidth === "undefined") {
|
|
1019
|
+
windowWidth = 0;
|
|
1020
|
+
}
|
|
965
1021
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
966
1022
|
return pageWidth;
|
|
967
1023
|
}
|
|
@@ -1069,6 +1125,8 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1069
1125
|
}
|
|
1070
1126
|
if (typeof taskId === "number") {
|
|
1071
1127
|
actPageInfo.taskId = taskId;
|
|
1128
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
1129
|
+
this.#isDebugTask = !!debug;
|
|
1072
1130
|
}
|
|
1073
1131
|
if (typeof relatedId === "number") {
|
|
1074
1132
|
actPageInfo.relatedId = relatedId;
|
|
@@ -1112,7 +1170,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1112
1170
|
}
|
|
1113
1171
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
1114
1172
|
if (actOptions.length <= 0) {
|
|
1115
|
-
logwarn("
|
|
1173
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
1116
1174
|
return false;
|
|
1117
1175
|
}
|
|
1118
1176
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -1133,6 +1191,13 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1133
1191
|
const { requestMatch, action, fulfill } = option;
|
|
1134
1192
|
const request = route.request();
|
|
1135
1193
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
1194
|
+
if (this.#isDebugTask) {
|
|
1195
|
+
if (matchedFlag) {
|
|
1196
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
1197
|
+
} else {
|
|
1198
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1136
1201
|
if (matchedFlag) {
|
|
1137
1202
|
switch (action) {
|
|
1138
1203
|
case "abort":
|
|
@@ -1184,6 +1249,13 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1184
1249
|
matchedFlag = false;
|
|
1185
1250
|
}
|
|
1186
1251
|
}
|
|
1252
|
+
if (this.#isDebugTask) {
|
|
1253
|
+
if (matchedFlag) {
|
|
1254
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
1255
|
+
} else {
|
|
1256
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1187
1259
|
if (!matchedFlag) {
|
|
1188
1260
|
continue;
|
|
1189
1261
|
}
|
|
@@ -1219,7 +1291,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1219
1291
|
}
|
|
1220
1292
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
1221
1293
|
if (actOptions.length <= 0) {
|
|
1222
|
-
logwarn("
|
|
1294
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
1223
1295
|
return false;
|
|
1224
1296
|
}
|
|
1225
1297
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -1232,7 +1304,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1232
1304
|
}
|
|
1233
1305
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
1234
1306
|
this.#responseCb = this.#responseListener.bind(this);
|
|
1235
|
-
this.#page.on("response"
|
|
1307
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
1236
1308
|
}
|
|
1237
1309
|
return true;
|
|
1238
1310
|
}
|
|
@@ -1280,6 +1352,7 @@ var PlaywrightPage = class extends import_node_events.default {
|
|
|
1280
1352
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
1281
1353
|
}
|
|
1282
1354
|
this.#status = "busy";
|
|
1355
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
1283
1356
|
return true;
|
|
1284
1357
|
}
|
|
1285
1358
|
async waitForElement(selector, options = {}) {
|
|
@@ -1418,11 +1491,10 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1418
1491
|
for (const page of pages) {
|
|
1419
1492
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
1420
1493
|
const lsdPage = new PlaywrightPage(this, page, pageInfo);
|
|
1494
|
+
this.#lsdPages.push(lsdPage);
|
|
1421
1495
|
if (this.#maxViewportOfNewPage) {
|
|
1422
1496
|
await lsdPage.maximizeViewport();
|
|
1423
1497
|
}
|
|
1424
|
-
this.#lsdPages.push(lsdPage);
|
|
1425
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
1426
1498
|
}
|
|
1427
1499
|
}
|
|
1428
1500
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -1452,8 +1524,9 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1452
1524
|
this.#lsdPages = [];
|
|
1453
1525
|
this.#nextPageIdx = 1;
|
|
1454
1526
|
this.#gettingPage = false;
|
|
1527
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
1455
1528
|
this.#initPages();
|
|
1456
|
-
browserContext.on("page"
|
|
1529
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
1457
1530
|
const pageInfo = page.pageInfo;
|
|
1458
1531
|
if (pageInfo) {
|
|
1459
1532
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -1462,27 +1535,26 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1462
1535
|
const currentTime2 = (0, import_utils4.getCurrentUnixTime)();
|
|
1463
1536
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
1464
1537
|
const lsdPage = new PlaywrightPage(this, page, pageInfo2);
|
|
1538
|
+
this.#lsdPages.push(lsdPage);
|
|
1465
1539
|
if (this.#maxViewportOfNewPage) {
|
|
1466
1540
|
await lsdPage.maximizeViewport();
|
|
1467
1541
|
}
|
|
1468
|
-
this.#lsdPages.push(lsdPage);
|
|
1469
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
1470
1542
|
}
|
|
1471
1543
|
});
|
|
1472
|
-
browserContext.on("close"
|
|
1544
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
1473
1545
|
if (browserContext !== bc) {
|
|
1474
1546
|
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
1475
1547
|
}
|
|
1476
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
1548
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
1477
1549
|
});
|
|
1478
|
-
this.on("pageClose"
|
|
1550
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
1479
1551
|
if (!(lsdPage instanceof PlaywrightPage)) {
|
|
1480
|
-
logerr(
|
|
1552
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
1481
1553
|
return;
|
|
1482
1554
|
}
|
|
1483
1555
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
1484
1556
|
if (idx < 0) {
|
|
1485
|
-
logerr(
|
|
1557
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
1486
1558
|
return;
|
|
1487
1559
|
}
|
|
1488
1560
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -1499,7 +1571,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1499
1571
|
if (this.#browserContext) {
|
|
1500
1572
|
this.#status = "closed";
|
|
1501
1573
|
this.#lastStatusUpdateTime = (0, import_utils4.getCurrentUnixTime)();
|
|
1502
|
-
loginfo(
|
|
1574
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
1503
1575
|
await this.#browserContext.close();
|
|
1504
1576
|
}
|
|
1505
1577
|
return true;
|
|
@@ -1514,12 +1586,12 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1514
1586
|
await (0, import_utils4.sleep)(200);
|
|
1515
1587
|
}
|
|
1516
1588
|
}
|
|
1517
|
-
logwarn(
|
|
1589
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
1518
1590
|
return false;
|
|
1519
1591
|
}
|
|
1520
1592
|
#freeGettingLock() {
|
|
1521
1593
|
if (!this.#gettingPage) {
|
|
1522
|
-
logwarn(
|
|
1594
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
1523
1595
|
}
|
|
1524
1596
|
this.#gettingPage = false;
|
|
1525
1597
|
}
|
|
@@ -1528,7 +1600,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1528
1600
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
1529
1601
|
}
|
|
1530
1602
|
if (maxPageFreeSeconds <= 0) {
|
|
1531
|
-
logwarn(
|
|
1603
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
1532
1604
|
return false;
|
|
1533
1605
|
}
|
|
1534
1606
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -1625,7 +1697,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
|
|
|
1625
1697
|
}
|
|
1626
1698
|
}
|
|
1627
1699
|
id() {
|
|
1628
|
-
return `
|
|
1700
|
+
return `PlaywrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
1629
1701
|
}
|
|
1630
1702
|
isFree() {
|
|
1631
1703
|
return this.#status === "free";
|
|
@@ -1759,34 +1831,33 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
|
|
|
1759
1831
|
this.#executablePath = executablePath;
|
|
1760
1832
|
this.#nextBrowserContextIdx = 1;
|
|
1761
1833
|
this.#closeFreePagesIntervalId = null;
|
|
1762
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
1834
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
1763
1835
|
const browserContexts = browser.contexts();
|
|
1764
1836
|
if (browserContexts.length > 0) {
|
|
1765
|
-
logwarn(
|
|
1837
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
|
|
1766
1838
|
}
|
|
1767
1839
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
1768
1840
|
for (const browserContext of browserContexts) {
|
|
1769
1841
|
const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
1770
1842
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
1771
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
1772
1843
|
}
|
|
1773
|
-
browser.on("disconnected"
|
|
1844
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
1774
1845
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
1775
1846
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
1776
|
-
logerr(
|
|
1847
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
1777
1848
|
}
|
|
1778
1849
|
});
|
|
1779
|
-
this.on("browserContextClose"
|
|
1850
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
1780
1851
|
if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
|
|
1781
|
-
logerr(
|
|
1852
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
1782
1853
|
return;
|
|
1783
1854
|
}
|
|
1784
1855
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
1785
1856
|
if (idx < 0) {
|
|
1786
|
-
logerr(
|
|
1857
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
1787
1858
|
return;
|
|
1788
1859
|
}
|
|
1789
|
-
loginfo(`##
|
|
1860
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
1790
1861
|
`);
|
|
1791
1862
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
1792
1863
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -1807,7 +1878,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
|
|
|
1807
1878
|
}
|
|
1808
1879
|
async newBrowserContext(options) {
|
|
1809
1880
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
1810
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
1881
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
1811
1882
|
return null;
|
|
1812
1883
|
}
|
|
1813
1884
|
const browserContextOptions = {};
|
|
@@ -1826,7 +1897,6 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
|
|
|
1826
1897
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
1827
1898
|
const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
1828
1899
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
1829
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
1830
1900
|
return lsdBrowserContext;
|
|
1831
1901
|
}
|
|
1832
1902
|
async close() {
|
|
@@ -1837,6 +1907,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
|
|
|
1837
1907
|
await lsdBrowserContext.close();
|
|
1838
1908
|
}
|
|
1839
1909
|
await this.#browser.close();
|
|
1910
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
1840
1911
|
return true;
|
|
1841
1912
|
}
|
|
1842
1913
|
browserContexts() {
|
|
@@ -1862,7 +1933,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
|
|
|
1862
1933
|
return this.#executablePath;
|
|
1863
1934
|
}
|
|
1864
1935
|
id() {
|
|
1865
|
-
return `
|
|
1936
|
+
return `PlaywrightBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
1866
1937
|
}
|
|
1867
1938
|
isConnected() {
|
|
1868
1939
|
return this.#browser.isConnected();
|
|
@@ -2212,6 +2283,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2212
2283
|
#requestInterceptionNum;
|
|
2213
2284
|
#responseInterceptionNum;
|
|
2214
2285
|
#client;
|
|
2286
|
+
#isDebugTask;
|
|
2215
2287
|
#hasValidUrl(page) {
|
|
2216
2288
|
const url = page.url();
|
|
2217
2289
|
return url.toLowerCase().startsWith("http");
|
|
@@ -2397,15 +2469,15 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2397
2469
|
}
|
|
2398
2470
|
const page = this.#page;
|
|
2399
2471
|
const pageId = this.#pageId;
|
|
2400
|
-
page.on("close"
|
|
2401
|
-
loginfo(`##browser
|
|
2472
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
2473
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
2402
2474
|
if (!page.pageInfo) {
|
|
2403
|
-
logerr(
|
|
2475
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
2404
2476
|
}
|
|
2405
|
-
this.emit("pageClose");
|
|
2406
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
2477
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
2478
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
2407
2479
|
});
|
|
2408
|
-
page.on("popup"
|
|
2480
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
2409
2481
|
if (p) {
|
|
2410
2482
|
let evtData = null;
|
|
2411
2483
|
const pageInfo = p.pageInfo;
|
|
@@ -2419,12 +2491,12 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2419
2491
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
2420
2492
|
}
|
|
2421
2493
|
} else {
|
|
2422
|
-
logerr(`##browser
|
|
2494
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
2423
2495
|
}
|
|
2424
|
-
loginfo(`##browser
|
|
2425
|
-
this.emit("pagePopup"
|
|
2496
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
2497
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
2426
2498
|
} else {
|
|
2427
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
2499
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
2428
2500
|
}
|
|
2429
2501
|
});
|
|
2430
2502
|
}
|
|
@@ -2439,11 +2511,13 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2439
2511
|
const currentTime = (0, import_utils7.getCurrentUnixTime)();
|
|
2440
2512
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
2441
2513
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
2442
|
-
this.#pageId = `
|
|
2514
|
+
this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
2443
2515
|
this.#closeWhenFree = false;
|
|
2444
2516
|
this.#requestInterceptionNum = 0;
|
|
2445
2517
|
this.#responseInterceptionNum = 0;
|
|
2446
2518
|
this.#client = null;
|
|
2519
|
+
this.#isDebugTask = false;
|
|
2520
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
2447
2521
|
this.#addPageOn();
|
|
2448
2522
|
}
|
|
2449
2523
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -2521,7 +2595,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2521
2595
|
}
|
|
2522
2596
|
async close() {
|
|
2523
2597
|
if (this.#status === "closed") {
|
|
2524
|
-
logwarn(
|
|
2598
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
2525
2599
|
return true;
|
|
2526
2600
|
} else if (this.#status === "busy") {
|
|
2527
2601
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -2532,6 +2606,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2532
2606
|
await this.#page.close();
|
|
2533
2607
|
this.#page = null;
|
|
2534
2608
|
this.#status = "closed";
|
|
2609
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
2535
2610
|
return true;
|
|
2536
2611
|
}
|
|
2537
2612
|
closeWhenFree() {
|
|
@@ -2562,7 +2637,10 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2562
2637
|
if (!this.#page) {
|
|
2563
2638
|
throw new Error("No valid page");
|
|
2564
2639
|
}
|
|
2565
|
-
|
|
2640
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
2641
|
+
if (typeof height === "undefined") {
|
|
2642
|
+
height = 0;
|
|
2643
|
+
}
|
|
2566
2644
|
return height;
|
|
2567
2645
|
}
|
|
2568
2646
|
async evaluate(func, args) {
|
|
@@ -2613,10 +2691,11 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2613
2691
|
return [];
|
|
2614
2692
|
}
|
|
2615
2693
|
async free() {
|
|
2616
|
-
if (this.#status === "free") {
|
|
2617
|
-
logwarn(
|
|
2694
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
2695
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
2618
2696
|
}
|
|
2619
2697
|
this.#status = "free";
|
|
2698
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
2620
2699
|
await this.clearRequestInterceptions();
|
|
2621
2700
|
await this.clearResponseInterceptions();
|
|
2622
2701
|
return true;
|
|
@@ -2717,9 +2796,18 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2717
2796
|
if (!this.#page) {
|
|
2718
2797
|
throw new Error("No valid page");
|
|
2719
2798
|
}
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2799
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
2800
|
+
if (typeof bodyHeight === "undefined") {
|
|
2801
|
+
bodyHeight = 0;
|
|
2802
|
+
}
|
|
2803
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
2804
|
+
if (typeof documentHeight === "undefined") {
|
|
2805
|
+
documentHeight = 0;
|
|
2806
|
+
}
|
|
2807
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
2808
|
+
if (typeof windowHeight === "undefined") {
|
|
2809
|
+
windowHeight = 0;
|
|
2810
|
+
}
|
|
2723
2811
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
2724
2812
|
return pageHeight;
|
|
2725
2813
|
}
|
|
@@ -2733,8 +2821,14 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2733
2821
|
if (!this.#page) {
|
|
2734
2822
|
throw new Error("No valid page");
|
|
2735
2823
|
}
|
|
2736
|
-
|
|
2737
|
-
|
|
2824
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
2825
|
+
if (typeof offsetWidth === "undefined") {
|
|
2826
|
+
offsetWidth = 0;
|
|
2827
|
+
}
|
|
2828
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
2829
|
+
if (typeof windowWidth === "undefined") {
|
|
2830
|
+
windowWidth = 0;
|
|
2831
|
+
}
|
|
2738
2832
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
2739
2833
|
return pageWidth;
|
|
2740
2834
|
}
|
|
@@ -2841,6 +2935,8 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2841
2935
|
}
|
|
2842
2936
|
if (typeof taskId === "number") {
|
|
2843
2937
|
actPageInfo.taskId = taskId;
|
|
2938
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
2939
|
+
this.#isDebugTask = !!debug;
|
|
2844
2940
|
}
|
|
2845
2941
|
if (typeof relatedId === "number") {
|
|
2846
2942
|
actPageInfo.relatedId = relatedId;
|
|
@@ -2883,7 +2979,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2883
2979
|
}
|
|
2884
2980
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
2885
2981
|
if (actOptions.length <= 0) {
|
|
2886
|
-
logwarn("
|
|
2982
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
2887
2983
|
return false;
|
|
2888
2984
|
}
|
|
2889
2985
|
if (this.#requestInterceptionNum <= 0) {
|
|
@@ -2892,11 +2988,18 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2892
2988
|
} else {
|
|
2893
2989
|
this.#requestInterceptionNum++;
|
|
2894
2990
|
}
|
|
2895
|
-
this.#page.on("request"
|
|
2991
|
+
this.#page.on("request" /* PAGE_REQUEST */, async (request) => {
|
|
2896
2992
|
try {
|
|
2897
2993
|
for (const option of actOptions) {
|
|
2898
2994
|
const { requestMatch, action, fulfill } = option;
|
|
2899
2995
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
2996
|
+
if (this.#isDebugTask) {
|
|
2997
|
+
if (matchedFlag) {
|
|
2998
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
2999
|
+
} else {
|
|
3000
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
3001
|
+
}
|
|
3002
|
+
}
|
|
2900
3003
|
if (matchedFlag) {
|
|
2901
3004
|
switch (action) {
|
|
2902
3005
|
case "abort":
|
|
@@ -2931,11 +3034,11 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2931
3034
|
}
|
|
2932
3035
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
2933
3036
|
if (actOptions.length <= 0) {
|
|
2934
|
-
logwarn("
|
|
3037
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
2935
3038
|
return false;
|
|
2936
3039
|
}
|
|
2937
3040
|
this.#responseInterceptionNum++;
|
|
2938
|
-
this.#page.on("response"
|
|
3041
|
+
this.#page.on("response" /* PAGE_RESPONSE */, async (response) => {
|
|
2939
3042
|
try {
|
|
2940
3043
|
if (!response.ok() || !this.#page) {
|
|
2941
3044
|
return false;
|
|
@@ -2956,6 +3059,13 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2956
3059
|
matchedFlag = false;
|
|
2957
3060
|
}
|
|
2958
3061
|
}
|
|
3062
|
+
if (this.#isDebugTask) {
|
|
3063
|
+
if (matchedFlag) {
|
|
3064
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
3065
|
+
} else {
|
|
3066
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
3067
|
+
}
|
|
3068
|
+
}
|
|
2959
3069
|
if (!matchedFlag) {
|
|
2960
3070
|
continue;
|
|
2961
3071
|
}
|
|
@@ -2972,6 +3082,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
2972
3082
|
requestData,
|
|
2973
3083
|
responseData
|
|
2974
3084
|
});
|
|
3085
|
+
loginfo(`##browser cache matched response: ${requestUrl}`);
|
|
2975
3086
|
}
|
|
2976
3087
|
if (typeof handler === "function") {
|
|
2977
3088
|
const pageData = { pageUrl, cookies: "" };
|
|
@@ -3037,6 +3148,7 @@ var PuppeteerPage = class extends import_node_events4.default {
|
|
|
3037
3148
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
3038
3149
|
}
|
|
3039
3150
|
this.#status = "busy";
|
|
3151
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
3040
3152
|
return true;
|
|
3041
3153
|
}
|
|
3042
3154
|
async waitForElement(selector, options = {}) {
|
|
@@ -3147,14 +3259,13 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3147
3259
|
for (const page of pages) {
|
|
3148
3260
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
3149
3261
|
const lsdPage = new PuppeteerPage(this, page, pageInfo);
|
|
3262
|
+
this.#lsdPages.push(lsdPage);
|
|
3150
3263
|
if (this.#maxViewportOfNewPage) {
|
|
3151
3264
|
await lsdPage.maximizeViewport();
|
|
3152
3265
|
}
|
|
3153
3266
|
if (this.#userAgent) {
|
|
3154
3267
|
await lsdPage.setUserAgent(this.#userAgent);
|
|
3155
3268
|
}
|
|
3156
|
-
this.#lsdPages.push(lsdPage);
|
|
3157
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
3158
3269
|
}
|
|
3159
3270
|
}
|
|
3160
3271
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
|
|
@@ -3183,8 +3294,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3183
3294
|
this.#lsdPages = [];
|
|
3184
3295
|
this.#nextPageIdx = 1;
|
|
3185
3296
|
this.#gettingPage = false;
|
|
3297
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
3186
3298
|
this.#initPages();
|
|
3187
|
-
browserContext.on("targetcreated"
|
|
3299
|
+
browserContext.on("targetcreated" /* BROWSERCONTEXT_TARGETCREATED */, async (p) => {
|
|
3188
3300
|
if (p.type() === "page") {
|
|
3189
3301
|
const page = await p.page();
|
|
3190
3302
|
if (!page) {
|
|
@@ -3198,30 +3310,36 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3198
3310
|
const currentTime2 = (0, import_utils8.getCurrentUnixTime)();
|
|
3199
3311
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
3200
3312
|
const lsdPage = new PuppeteerPage(this, page, pageInfo2);
|
|
3201
|
-
|
|
3202
|
-
await lsdPage.maximizeViewport();
|
|
3203
|
-
}
|
|
3313
|
+
this.#lsdPages.push(lsdPage);
|
|
3204
3314
|
if (this.#userAgent) {
|
|
3205
3315
|
await lsdPage.setUserAgent(this.#userAgent);
|
|
3206
3316
|
}
|
|
3207
|
-
this.#
|
|
3208
|
-
|
|
3317
|
+
if (this.#maxViewportOfNewPage) {
|
|
3318
|
+
await lsdPage.maximizeViewport();
|
|
3319
|
+
}
|
|
3209
3320
|
}
|
|
3210
3321
|
}
|
|
3211
3322
|
});
|
|
3212
|
-
|
|
3323
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
3324
|
+
logerr(`##browser LsdBrowserContext puppeteer BrowserContext receives close event`);
|
|
3325
|
+
if (browserContext !== bc) {
|
|
3326
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
3327
|
+
}
|
|
3328
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
3329
|
+
});
|
|
3330
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
3213
3331
|
if (!(lsdPage instanceof PuppeteerPage)) {
|
|
3214
|
-
logerr(
|
|
3332
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
3215
3333
|
return;
|
|
3216
3334
|
}
|
|
3217
3335
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
3218
3336
|
if (idx < 0) {
|
|
3219
|
-
logerr(
|
|
3337
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
3220
3338
|
return;
|
|
3221
3339
|
}
|
|
3222
3340
|
this.#lsdPages.splice(idx, 1);
|
|
3223
3341
|
if (this.#lsdPages.length === 0) {
|
|
3224
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
3342
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
3225
3343
|
}
|
|
3226
3344
|
return;
|
|
3227
3345
|
});
|
|
@@ -3236,7 +3354,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3236
3354
|
if (this.#browserContext) {
|
|
3237
3355
|
this.#status = "closed";
|
|
3238
3356
|
this.#lastStatusUpdateTime = (0, import_utils8.getCurrentUnixTime)();
|
|
3239
|
-
loginfo(
|
|
3357
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
3240
3358
|
if (this.#browserContextCreationMethod !== "launch") {
|
|
3241
3359
|
await this.#browserContext.close();
|
|
3242
3360
|
}
|
|
@@ -3253,12 +3371,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3253
3371
|
await (0, import_utils8.sleep)(200);
|
|
3254
3372
|
}
|
|
3255
3373
|
}
|
|
3256
|
-
logwarn(
|
|
3374
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
3257
3375
|
return false;
|
|
3258
3376
|
}
|
|
3259
3377
|
#freeGettingLock() {
|
|
3260
3378
|
if (!this.#gettingPage) {
|
|
3261
|
-
logwarn(
|
|
3379
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
3262
3380
|
}
|
|
3263
3381
|
this.#gettingPage = false;
|
|
3264
3382
|
}
|
|
@@ -3267,7 +3385,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3267
3385
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
3268
3386
|
}
|
|
3269
3387
|
if (maxPageFreeSeconds <= 0) {
|
|
3270
|
-
logwarn(
|
|
3388
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
3271
3389
|
return false;
|
|
3272
3390
|
}
|
|
3273
3391
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -3366,7 +3484,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3366
3484
|
}
|
|
3367
3485
|
}
|
|
3368
3486
|
id() {
|
|
3369
|
-
return `
|
|
3487
|
+
return `PuppeteerContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
3370
3488
|
}
|
|
3371
3489
|
isIncognito() {
|
|
3372
3490
|
return this.#incognito;
|
|
@@ -3400,7 +3518,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
|
|
|
3400
3518
|
}
|
|
3401
3519
|
if (localStorageOrigins.length > 0) {
|
|
3402
3520
|
await origPage.setRequestInterception(true);
|
|
3403
|
-
origPage.on("request"
|
|
3521
|
+
origPage.on("request" /* PAGE_REQUEST */, (request) => {
|
|
3404
3522
|
request.respond({
|
|
3405
3523
|
status: 200,
|
|
3406
3524
|
// contentType: "text/html; charset=utf-8", // "text/plain",
|
|
@@ -3503,28 +3621,27 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
|
|
|
3503
3621
|
this.#executablePath = executablePath;
|
|
3504
3622
|
this.#nextBrowserContextIdx = 1;
|
|
3505
3623
|
this.#closeFreePagesIntervalId = null;
|
|
3506
|
-
loginfo(`##browser
|
|
3624
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
3507
3625
|
const browserContexts = browser.browserContexts();
|
|
3508
3626
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
|
|
3509
3627
|
for (const browserContext of browserContexts) {
|
|
3510
3628
|
const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
|
|
3511
3629
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
3512
|
-
loginfo(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
3513
3630
|
}
|
|
3514
|
-
browser.on("disconnected"
|
|
3631
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
3515
3632
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
3516
3633
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
3517
|
-
logerr(
|
|
3634
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
3518
3635
|
}
|
|
3519
3636
|
});
|
|
3520
|
-
this.on("browserContextClose"
|
|
3637
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
3521
3638
|
if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
|
|
3522
|
-
logerr(
|
|
3639
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
3523
3640
|
return;
|
|
3524
3641
|
}
|
|
3525
3642
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
3526
3643
|
if (idx < 0) {
|
|
3527
|
-
logerr(
|
|
3644
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
3528
3645
|
return;
|
|
3529
3646
|
}
|
|
3530
3647
|
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
@@ -3548,7 +3665,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
|
|
|
3548
3665
|
}
|
|
3549
3666
|
async newBrowserContext(options) {
|
|
3550
3667
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
3551
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
3668
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
3552
3669
|
return null;
|
|
3553
3670
|
}
|
|
3554
3671
|
const browserContextOptions = {};
|
|
@@ -3561,7 +3678,6 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
|
|
|
3561
3678
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
3562
3679
|
const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
|
|
3563
3680
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
3564
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
3565
3681
|
return lsdBrowserContext;
|
|
3566
3682
|
}
|
|
3567
3683
|
async close() {
|
|
@@ -3572,6 +3688,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
|
|
|
3572
3688
|
await lsdBrowserContext.close();
|
|
3573
3689
|
}
|
|
3574
3690
|
await this.#browser.close();
|
|
3691
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
3575
3692
|
return true;
|
|
3576
3693
|
}
|
|
3577
3694
|
browserContexts() {
|
|
@@ -3597,7 +3714,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
|
|
|
3597
3714
|
return this.#executablePath;
|
|
3598
3715
|
}
|
|
3599
3716
|
id() {
|
|
3600
|
-
return `
|
|
3717
|
+
return `PuppeteerBrowser-${this.#browserIdx}`;
|
|
3601
3718
|
}
|
|
3602
3719
|
isConnected() {
|
|
3603
3720
|
return this.#browser.connected;
|
|
@@ -4326,6 +4443,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4326
4443
|
#responseInterceptionOptions;
|
|
4327
4444
|
#client;
|
|
4328
4445
|
#responseCb;
|
|
4446
|
+
#isDebugTask;
|
|
4329
4447
|
#hasValidUrl(page) {
|
|
4330
4448
|
const url = page.url();
|
|
4331
4449
|
return url.toLowerCase().startsWith("http");
|
|
@@ -4341,7 +4459,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4341
4459
|
const cookieItems = await this.#getCookies(page);
|
|
4342
4460
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
4343
4461
|
if (domainSet.size !== 1) {
|
|
4344
|
-
logwarn(
|
|
4462
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
4345
4463
|
}
|
|
4346
4464
|
for (const domain of domainSet.values()) {
|
|
4347
4465
|
await browserContext.clearCookies({ domain });
|
|
@@ -4547,15 +4665,15 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4547
4665
|
}
|
|
4548
4666
|
const page = this.#page;
|
|
4549
4667
|
const pageId = this.#pageId;
|
|
4550
|
-
page.on("close"
|
|
4551
|
-
loginfo(`##browser
|
|
4668
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
4669
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
4552
4670
|
if (!page.pageInfo) {
|
|
4553
|
-
logerr(
|
|
4671
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
4554
4672
|
}
|
|
4555
|
-
this.emit("pageClose");
|
|
4556
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
4673
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
4674
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
4557
4675
|
});
|
|
4558
|
-
page.on("popup"
|
|
4676
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
4559
4677
|
if (p) {
|
|
4560
4678
|
let evtData = null;
|
|
4561
4679
|
const pageInfo = p.pageInfo;
|
|
@@ -4569,12 +4687,12 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4569
4687
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
4570
4688
|
}
|
|
4571
4689
|
} else {
|
|
4572
|
-
logerr(`##browser
|
|
4690
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
4573
4691
|
}
|
|
4574
|
-
loginfo(`##browser
|
|
4575
|
-
this.emit("pagePopup"
|
|
4692
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
4693
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
4576
4694
|
} else {
|
|
4577
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
4695
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
4578
4696
|
}
|
|
4579
4697
|
});
|
|
4580
4698
|
}
|
|
@@ -4589,12 +4707,14 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4589
4707
|
const currentTime = (0, import_utils11.getCurrentUnixTime)();
|
|
4590
4708
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
4591
4709
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
4592
|
-
this.#pageId = `
|
|
4710
|
+
this.#pageId = `PatchrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
4593
4711
|
this.#closeWhenFree = false;
|
|
4594
4712
|
this.#resquestInterceptionOptions = [];
|
|
4595
4713
|
this.#responseInterceptionOptions = [];
|
|
4596
4714
|
this.#client = null;
|
|
4597
4715
|
this.#responseCb = null;
|
|
4716
|
+
this.#isDebugTask = false;
|
|
4717
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
4598
4718
|
this.#addPageOn();
|
|
4599
4719
|
}
|
|
4600
4720
|
async addPreloadScript(scriptOrFunc, arg) {
|
|
@@ -4675,7 +4795,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4675
4795
|
}
|
|
4676
4796
|
async close() {
|
|
4677
4797
|
if (this.#status === "closed") {
|
|
4678
|
-
logwarn(
|
|
4798
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
4679
4799
|
return true;
|
|
4680
4800
|
} else if (this.#status === "busy") {
|
|
4681
4801
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -4686,6 +4806,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4686
4806
|
await this.#page.close();
|
|
4687
4807
|
this.#page = null;
|
|
4688
4808
|
this.#status = "closed";
|
|
4809
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
4689
4810
|
return true;
|
|
4690
4811
|
}
|
|
4691
4812
|
closeWhenFree() {
|
|
@@ -4716,7 +4837,10 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4716
4837
|
if (!this.#page) {
|
|
4717
4838
|
throw new Error("No valid page");
|
|
4718
4839
|
}
|
|
4719
|
-
|
|
4840
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
4841
|
+
if (typeof height === "undefined") {
|
|
4842
|
+
height = 0;
|
|
4843
|
+
}
|
|
4720
4844
|
return height;
|
|
4721
4845
|
}
|
|
4722
4846
|
async evaluate(func, args, isolated = true) {
|
|
@@ -4766,10 +4890,11 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4766
4890
|
return [];
|
|
4767
4891
|
}
|
|
4768
4892
|
async free() {
|
|
4769
|
-
if (this.#status === "free") {
|
|
4770
|
-
logwarn(
|
|
4893
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
4894
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
4771
4895
|
}
|
|
4772
4896
|
this.#status = "free";
|
|
4897
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
4773
4898
|
await this.clearRequestInterceptions();
|
|
4774
4899
|
await this.clearResponseInterceptions();
|
|
4775
4900
|
return true;
|
|
@@ -4866,9 +4991,18 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4866
4991
|
if (!this.#page) {
|
|
4867
4992
|
throw new Error("No valid page");
|
|
4868
4993
|
}
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4994
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
4995
|
+
if (typeof bodyHeight === "undefined") {
|
|
4996
|
+
bodyHeight = 0;
|
|
4997
|
+
}
|
|
4998
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
4999
|
+
if (typeof documentHeight === "undefined") {
|
|
5000
|
+
documentHeight = 0;
|
|
5001
|
+
}
|
|
5002
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
5003
|
+
if (typeof windowHeight === "undefined") {
|
|
5004
|
+
windowHeight = 0;
|
|
5005
|
+
}
|
|
4872
5006
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
4873
5007
|
return pageHeight;
|
|
4874
5008
|
}
|
|
@@ -4882,8 +5016,14 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4882
5016
|
if (!this.#page) {
|
|
4883
5017
|
throw new Error("No valid page");
|
|
4884
5018
|
}
|
|
4885
|
-
|
|
4886
|
-
|
|
5019
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
5020
|
+
if (typeof offsetWidth === "undefined") {
|
|
5021
|
+
offsetWidth = 0;
|
|
5022
|
+
}
|
|
5023
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
5024
|
+
if (typeof windowWidth === "undefined") {
|
|
5025
|
+
windowWidth = 0;
|
|
5026
|
+
}
|
|
4887
5027
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
4888
5028
|
return pageWidth;
|
|
4889
5029
|
}
|
|
@@ -4991,6 +5131,8 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
4991
5131
|
}
|
|
4992
5132
|
if (typeof taskId === "number") {
|
|
4993
5133
|
actPageInfo.taskId = taskId;
|
|
5134
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
5135
|
+
this.#isDebugTask = !!debug;
|
|
4994
5136
|
}
|
|
4995
5137
|
if (typeof relatedId === "number") {
|
|
4996
5138
|
actPageInfo.relatedId = relatedId;
|
|
@@ -5034,7 +5176,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5034
5176
|
}
|
|
5035
5177
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
5036
5178
|
if (actOptions.length <= 0) {
|
|
5037
|
-
logwarn("
|
|
5179
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
5038
5180
|
return false;
|
|
5039
5181
|
}
|
|
5040
5182
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -5055,6 +5197,13 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5055
5197
|
const { requestMatch, action, fulfill } = option;
|
|
5056
5198
|
const request = route.request();
|
|
5057
5199
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
5200
|
+
if (this.#isDebugTask) {
|
|
5201
|
+
if (matchedFlag) {
|
|
5202
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
5203
|
+
} else {
|
|
5204
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
5205
|
+
}
|
|
5206
|
+
}
|
|
5058
5207
|
if (matchedFlag) {
|
|
5059
5208
|
switch (action) {
|
|
5060
5209
|
case "abort":
|
|
@@ -5106,6 +5255,13 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5106
5255
|
matchedFlag = false;
|
|
5107
5256
|
}
|
|
5108
5257
|
}
|
|
5258
|
+
if (this.#isDebugTask) {
|
|
5259
|
+
if (matchedFlag) {
|
|
5260
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
5261
|
+
} else {
|
|
5262
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
5263
|
+
}
|
|
5264
|
+
}
|
|
5109
5265
|
if (!matchedFlag) {
|
|
5110
5266
|
continue;
|
|
5111
5267
|
}
|
|
@@ -5141,7 +5297,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5141
5297
|
}
|
|
5142
5298
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
5143
5299
|
if (actOptions.length <= 0) {
|
|
5144
|
-
logwarn("
|
|
5300
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
5145
5301
|
return false;
|
|
5146
5302
|
}
|
|
5147
5303
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -5154,7 +5310,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5154
5310
|
}
|
|
5155
5311
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
5156
5312
|
this.#responseCb = this.#responseListener.bind(this);
|
|
5157
|
-
this.#page.on("response"
|
|
5313
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
5158
5314
|
}
|
|
5159
5315
|
return true;
|
|
5160
5316
|
}
|
|
@@ -5202,6 +5358,7 @@ var PatchrightPage = class extends import_node_events8.default {
|
|
|
5202
5358
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
5203
5359
|
}
|
|
5204
5360
|
this.#status = "busy";
|
|
5361
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
5205
5362
|
return true;
|
|
5206
5363
|
}
|
|
5207
5364
|
async waitForElement(selector, options = {}) {
|
|
@@ -5340,11 +5497,10 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5340
5497
|
for (const page of pages) {
|
|
5341
5498
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
5342
5499
|
const lsdPage = new PatchrightPage(this, page, pageInfo);
|
|
5500
|
+
this.#lsdPages.push(lsdPage);
|
|
5343
5501
|
if (this.#maxViewportOfNewPage) {
|
|
5344
5502
|
await lsdPage.maximizeViewport();
|
|
5345
5503
|
}
|
|
5346
|
-
this.#lsdPages.push(lsdPage);
|
|
5347
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
5348
5504
|
}
|
|
5349
5505
|
}
|
|
5350
5506
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -5374,8 +5530,9 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5374
5530
|
this.#lsdPages = [];
|
|
5375
5531
|
this.#nextPageIdx = 1;
|
|
5376
5532
|
this.#gettingPage = false;
|
|
5533
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
5377
5534
|
this.#initPages();
|
|
5378
|
-
browserContext.on("page"
|
|
5535
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
5379
5536
|
const pageInfo = page.pageInfo;
|
|
5380
5537
|
if (pageInfo) {
|
|
5381
5538
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -5384,27 +5541,26 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5384
5541
|
const currentTime2 = (0, import_utils12.getCurrentUnixTime)();
|
|
5385
5542
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
5386
5543
|
const lsdPage = new PatchrightPage(this, page, pageInfo2);
|
|
5544
|
+
this.#lsdPages.push(lsdPage);
|
|
5387
5545
|
if (this.#maxViewportOfNewPage) {
|
|
5388
5546
|
await lsdPage.maximizeViewport();
|
|
5389
5547
|
}
|
|
5390
|
-
this.#lsdPages.push(lsdPage);
|
|
5391
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
5392
5548
|
}
|
|
5393
5549
|
});
|
|
5394
|
-
browserContext.on("close"
|
|
5550
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
5395
5551
|
if (browserContext !== bc) {
|
|
5396
|
-
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
5552
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
5397
5553
|
}
|
|
5398
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
5554
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
5399
5555
|
});
|
|
5400
|
-
this.on("pageClose"
|
|
5556
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
5401
5557
|
if (!(lsdPage instanceof PatchrightPage)) {
|
|
5402
|
-
logerr(
|
|
5558
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
5403
5559
|
return;
|
|
5404
5560
|
}
|
|
5405
5561
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
5406
5562
|
if (idx < 0) {
|
|
5407
|
-
logerr(
|
|
5563
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
5408
5564
|
return;
|
|
5409
5565
|
}
|
|
5410
5566
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -5421,7 +5577,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5421
5577
|
if (this.#browserContext) {
|
|
5422
5578
|
this.#status = "closed";
|
|
5423
5579
|
this.#lastStatusUpdateTime = (0, import_utils12.getCurrentUnixTime)();
|
|
5424
|
-
loginfo(
|
|
5580
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
5425
5581
|
await this.#browserContext.close();
|
|
5426
5582
|
}
|
|
5427
5583
|
return true;
|
|
@@ -5436,12 +5592,12 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5436
5592
|
await (0, import_utils12.sleep)(200);
|
|
5437
5593
|
}
|
|
5438
5594
|
}
|
|
5439
|
-
logwarn(
|
|
5595
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
5440
5596
|
return false;
|
|
5441
5597
|
}
|
|
5442
5598
|
#freeGettingLock() {
|
|
5443
5599
|
if (!this.#gettingPage) {
|
|
5444
|
-
logwarn(
|
|
5600
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
5445
5601
|
}
|
|
5446
5602
|
this.#gettingPage = false;
|
|
5447
5603
|
}
|
|
@@ -5450,7 +5606,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5450
5606
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
5451
5607
|
}
|
|
5452
5608
|
if (maxPageFreeSeconds <= 0) {
|
|
5453
|
-
logwarn(
|
|
5609
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
5454
5610
|
return false;
|
|
5455
5611
|
}
|
|
5456
5612
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -5547,7 +5703,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
|
|
|
5547
5703
|
}
|
|
5548
5704
|
}
|
|
5549
5705
|
id() {
|
|
5550
|
-
return `
|
|
5706
|
+
return `PatchrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
5551
5707
|
}
|
|
5552
5708
|
isFree() {
|
|
5553
5709
|
return this.#status === "free";
|
|
@@ -5681,34 +5837,33 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
|
|
|
5681
5837
|
this.#executablePath = executablePath;
|
|
5682
5838
|
this.#nextBrowserContextIdx = 1;
|
|
5683
5839
|
this.#closeFreePagesIntervalId = null;
|
|
5684
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
5840
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
5685
5841
|
const browserContexts = browser.contexts();
|
|
5686
5842
|
if (browserContexts.length > 0) {
|
|
5687
|
-
logwarn(
|
|
5843
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
|
|
5688
5844
|
}
|
|
5689
5845
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
5690
5846
|
for (const browserContext of browserContexts) {
|
|
5691
5847
|
const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
5692
5848
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
5693
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
5694
5849
|
}
|
|
5695
|
-
browser.on("disconnected"
|
|
5850
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
5696
5851
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
5697
5852
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
5698
|
-
logerr(
|
|
5853
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
5699
5854
|
}
|
|
5700
5855
|
});
|
|
5701
|
-
this.on("browserContextClose"
|
|
5856
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
5702
5857
|
if (!(lsdBrowserContext instanceof PatchrightBrowserContext)) {
|
|
5703
|
-
logerr(
|
|
5858
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
5704
5859
|
return;
|
|
5705
5860
|
}
|
|
5706
5861
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
5707
5862
|
if (idx < 0) {
|
|
5708
|
-
logerr(
|
|
5863
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
5709
5864
|
return;
|
|
5710
5865
|
}
|
|
5711
|
-
loginfo(`##
|
|
5866
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
5712
5867
|
`);
|
|
5713
5868
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
5714
5869
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -5729,7 +5884,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
|
|
|
5729
5884
|
}
|
|
5730
5885
|
async newBrowserContext(options) {
|
|
5731
5886
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
5732
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
5887
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
5733
5888
|
return null;
|
|
5734
5889
|
}
|
|
5735
5890
|
const browserContextOptions = {};
|
|
@@ -5748,7 +5903,6 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
|
|
|
5748
5903
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
5749
5904
|
const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
5750
5905
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
5751
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
5752
5906
|
return lsdBrowserContext;
|
|
5753
5907
|
}
|
|
5754
5908
|
async close() {
|
|
@@ -5759,6 +5913,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
|
|
|
5759
5913
|
await lsdBrowserContext.close();
|
|
5760
5914
|
}
|
|
5761
5915
|
await this.#browser.close();
|
|
5916
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
5762
5917
|
return true;
|
|
5763
5918
|
}
|
|
5764
5919
|
browserContexts() {
|
|
@@ -5784,7 +5939,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
|
|
|
5784
5939
|
return this.#executablePath;
|
|
5785
5940
|
}
|
|
5786
5941
|
id() {
|
|
5787
|
-
return `
|
|
5942
|
+
return `PatchrightBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
5788
5943
|
}
|
|
5789
5944
|
isConnected() {
|
|
5790
5945
|
return this.#browser.isConnected();
|
|
@@ -6140,6 +6295,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6140
6295
|
#responseInterceptionOptions;
|
|
6141
6296
|
#client;
|
|
6142
6297
|
#responseCb;
|
|
6298
|
+
#isDebugTask;
|
|
6143
6299
|
#hasValidUrl(page) {
|
|
6144
6300
|
const url = page.url();
|
|
6145
6301
|
return url.toLowerCase().startsWith("http");
|
|
@@ -6155,7 +6311,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6155
6311
|
const cookieItems = await this.#getCookies(page);
|
|
6156
6312
|
const domainSet = new Set(cookieItems.map((c) => c.domain));
|
|
6157
6313
|
if (domainSet.size !== 1) {
|
|
6158
|
-
logwarn(
|
|
6314
|
+
logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
|
|
6159
6315
|
}
|
|
6160
6316
|
for (const domain of domainSet.values()) {
|
|
6161
6317
|
await browserContext.clearCookies({ domain });
|
|
@@ -6361,15 +6517,15 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6361
6517
|
}
|
|
6362
6518
|
const page = this.#page;
|
|
6363
6519
|
const pageId = this.#pageId;
|
|
6364
|
-
page.on("close"
|
|
6365
|
-
loginfo(`##browser
|
|
6520
|
+
page.on("close" /* PAGE_CLOSE */, async () => {
|
|
6521
|
+
loginfo(`##browser page ${pageId} closed @LsdPage`);
|
|
6366
6522
|
if (!page.pageInfo) {
|
|
6367
|
-
logerr(
|
|
6523
|
+
logerr(`##browser LsdPage logic error in page.on("close")`);
|
|
6368
6524
|
}
|
|
6369
|
-
this.emit("pageClose");
|
|
6370
|
-
this.#lsdBrowserContext.emit("pageClose"
|
|
6525
|
+
this.emit("pageClose" /* PAGE_CLOSE */);
|
|
6526
|
+
this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
|
|
6371
6527
|
});
|
|
6372
|
-
page.on("popup"
|
|
6528
|
+
page.on("popup" /* PAGE_POUP */, (p) => {
|
|
6373
6529
|
if (p) {
|
|
6374
6530
|
let evtData = null;
|
|
6375
6531
|
const pageInfo = p.pageInfo;
|
|
@@ -6383,12 +6539,12 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6383
6539
|
pageInfo.relatedId = page.pageInfo.taskId;
|
|
6384
6540
|
}
|
|
6385
6541
|
} else {
|
|
6386
|
-
logerr(`##browser
|
|
6542
|
+
logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
|
|
6387
6543
|
}
|
|
6388
|
-
loginfo(`##browser
|
|
6389
|
-
this.emit("pagePopup"
|
|
6544
|
+
loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
|
|
6545
|
+
this.emit("pagePopup" /* PAGE_POPUP */, evtData);
|
|
6390
6546
|
} else {
|
|
6391
|
-
logerr(`##browser ${pageId} has popup page with null page`);
|
|
6547
|
+
logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
|
|
6392
6548
|
}
|
|
6393
6549
|
});
|
|
6394
6550
|
}
|
|
@@ -6403,12 +6559,14 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6403
6559
|
const currentTime = (0, import_utils15.getCurrentUnixTime)();
|
|
6404
6560
|
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
|
|
6405
6561
|
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
|
|
6406
|
-
this.#pageId = `
|
|
6562
|
+
this.#pageId = `CamoufoxPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
|
|
6407
6563
|
this.#closeWhenFree = false;
|
|
6408
6564
|
this.#resquestInterceptionOptions = [];
|
|
6409
6565
|
this.#responseInterceptionOptions = [];
|
|
6410
6566
|
this.#client = null;
|
|
6411
6567
|
this.#responseCb = null;
|
|
6568
|
+
this.#isDebugTask = false;
|
|
6569
|
+
loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
|
|
6412
6570
|
this.#addPageOn();
|
|
6413
6571
|
}
|
|
6414
6572
|
async addPreloadScript() {
|
|
@@ -6476,7 +6634,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6476
6634
|
}
|
|
6477
6635
|
async close() {
|
|
6478
6636
|
if (this.#status === "closed") {
|
|
6479
|
-
logwarn(
|
|
6637
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
|
|
6480
6638
|
return true;
|
|
6481
6639
|
} else if (this.#status === "busy") {
|
|
6482
6640
|
throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
|
|
@@ -6487,6 +6645,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6487
6645
|
await this.#page.close();
|
|
6488
6646
|
this.#page = null;
|
|
6489
6647
|
this.#status = "closed";
|
|
6648
|
+
loginfo(`##browser LsdPage ${this.#pageId} is closed`);
|
|
6490
6649
|
return true;
|
|
6491
6650
|
}
|
|
6492
6651
|
closeWhenFree() {
|
|
@@ -6517,7 +6676,10 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6517
6676
|
if (!this.#page) {
|
|
6518
6677
|
throw new Error("No valid page");
|
|
6519
6678
|
}
|
|
6520
|
-
|
|
6679
|
+
let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
6680
|
+
if (typeof height === "undefined") {
|
|
6681
|
+
height = 0;
|
|
6682
|
+
}
|
|
6521
6683
|
return height;
|
|
6522
6684
|
}
|
|
6523
6685
|
async evaluate(func, args, isolated = true) {
|
|
@@ -6568,10 +6730,11 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6568
6730
|
return [];
|
|
6569
6731
|
}
|
|
6570
6732
|
async free() {
|
|
6571
|
-
if (this.#status === "free") {
|
|
6572
|
-
logwarn(
|
|
6733
|
+
if (this.#status === "free" && this.pageInfo().openType !== "popup") {
|
|
6734
|
+
logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
|
|
6573
6735
|
}
|
|
6574
6736
|
this.#status = "free";
|
|
6737
|
+
logdbg(`##browser LsdPage ${this.#pageId} is freed`);
|
|
6575
6738
|
await this.clearRequestInterceptions();
|
|
6576
6739
|
await this.clearResponseInterceptions();
|
|
6577
6740
|
return true;
|
|
@@ -6668,9 +6831,18 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6668
6831
|
if (!this.#page) {
|
|
6669
6832
|
throw new Error("No valid page");
|
|
6670
6833
|
}
|
|
6671
|
-
|
|
6672
|
-
|
|
6673
|
-
|
|
6834
|
+
let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
|
|
6835
|
+
if (typeof bodyHeight === "undefined") {
|
|
6836
|
+
bodyHeight = 0;
|
|
6837
|
+
}
|
|
6838
|
+
let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
|
|
6839
|
+
if (typeof documentHeight === "undefined") {
|
|
6840
|
+
documentHeight = 0;
|
|
6841
|
+
}
|
|
6842
|
+
let windowHeight = await this.#page.evaluate(() => window.outerHeight);
|
|
6843
|
+
if (typeof windowHeight === "undefined") {
|
|
6844
|
+
windowHeight = 0;
|
|
6845
|
+
}
|
|
6674
6846
|
const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
|
|
6675
6847
|
return pageHeight;
|
|
6676
6848
|
}
|
|
@@ -6684,8 +6856,14 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6684
6856
|
if (!this.#page) {
|
|
6685
6857
|
throw new Error("No valid page");
|
|
6686
6858
|
}
|
|
6687
|
-
|
|
6688
|
-
|
|
6859
|
+
let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
|
|
6860
|
+
if (typeof offsetWidth === "undefined") {
|
|
6861
|
+
offsetWidth = 0;
|
|
6862
|
+
}
|
|
6863
|
+
let windowWidth = await this.#page.evaluate(() => window.outerWidth);
|
|
6864
|
+
if (typeof windowWidth === "undefined") {
|
|
6865
|
+
windowWidth = 0;
|
|
6866
|
+
}
|
|
6689
6867
|
const pageWidth = Math.max(offsetWidth, windowWidth);
|
|
6690
6868
|
return pageWidth;
|
|
6691
6869
|
}
|
|
@@ -6793,6 +6971,8 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6793
6971
|
}
|
|
6794
6972
|
if (typeof taskId === "number") {
|
|
6795
6973
|
actPageInfo.taskId = taskId;
|
|
6974
|
+
const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
|
|
6975
|
+
this.#isDebugTask = !!debug;
|
|
6796
6976
|
}
|
|
6797
6977
|
if (typeof relatedId === "number") {
|
|
6798
6978
|
actPageInfo.relatedId = relatedId;
|
|
@@ -6836,7 +7016,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6836
7016
|
}
|
|
6837
7017
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
6838
7018
|
if (actOptions.length <= 0) {
|
|
6839
|
-
logwarn("
|
|
7019
|
+
logwarn("##browser LsdPage invalid paras in setRequestInterception");
|
|
6840
7020
|
return false;
|
|
6841
7021
|
}
|
|
6842
7022
|
const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
|
|
@@ -6857,6 +7037,13 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6857
7037
|
const { requestMatch, action, fulfill } = option;
|
|
6858
7038
|
const request = route.request();
|
|
6859
7039
|
const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
|
|
7040
|
+
if (this.#isDebugTask) {
|
|
7041
|
+
if (matchedFlag) {
|
|
7042
|
+
loginfo(`##browser matched request ${request.method()} ${request.url()}`);
|
|
7043
|
+
} else {
|
|
7044
|
+
logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
|
|
7045
|
+
}
|
|
7046
|
+
}
|
|
6860
7047
|
if (matchedFlag) {
|
|
6861
7048
|
switch (action) {
|
|
6862
7049
|
case "abort":
|
|
@@ -6908,6 +7095,13 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6908
7095
|
matchedFlag = false;
|
|
6909
7096
|
}
|
|
6910
7097
|
}
|
|
7098
|
+
if (this.#isDebugTask) {
|
|
7099
|
+
if (matchedFlag) {
|
|
7100
|
+
loginfo(`##browser matched response ${request.method()} ${request.url()}`);
|
|
7101
|
+
} else {
|
|
7102
|
+
logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
|
|
7103
|
+
}
|
|
7104
|
+
}
|
|
6911
7105
|
if (!matchedFlag) {
|
|
6912
7106
|
continue;
|
|
6913
7107
|
}
|
|
@@ -6943,7 +7137,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6943
7137
|
}
|
|
6944
7138
|
const actOptions = Array.isArray(options) ? options : [options];
|
|
6945
7139
|
if (actOptions.length <= 0) {
|
|
6946
|
-
logwarn("
|
|
7140
|
+
logwarn("##browser LsdPage invalid paras in setResponseInterception");
|
|
6947
7141
|
return false;
|
|
6948
7142
|
}
|
|
6949
7143
|
const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
|
|
@@ -6956,7 +7150,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
6956
7150
|
}
|
|
6957
7151
|
if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
|
|
6958
7152
|
this.#responseCb = this.#responseListener.bind(this);
|
|
6959
|
-
this.#page.on("response"
|
|
7153
|
+
this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
|
|
6960
7154
|
}
|
|
6961
7155
|
return true;
|
|
6962
7156
|
}
|
|
@@ -7004,6 +7198,7 @@ var CamoufoxPage = class extends import_node_events11.default {
|
|
|
7004
7198
|
throw new Error(`Page ${this.#pageId} is already busy!!!`);
|
|
7005
7199
|
}
|
|
7006
7200
|
this.#status = "busy";
|
|
7201
|
+
logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
|
|
7007
7202
|
return true;
|
|
7008
7203
|
}
|
|
7009
7204
|
async waitForElement(selector, options = {}) {
|
|
@@ -7142,11 +7337,10 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7142
7337
|
for (const page of pages) {
|
|
7143
7338
|
const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
|
|
7144
7339
|
const lsdPage = new CamoufoxPage(this, page, pageInfo);
|
|
7340
|
+
this.#lsdPages.push(lsdPage);
|
|
7145
7341
|
if (this.#maxViewportOfNewPage) {
|
|
7146
7342
|
await lsdPage.maximizeViewport();
|
|
7147
7343
|
}
|
|
7148
|
-
this.#lsdPages.push(lsdPage);
|
|
7149
|
-
loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
|
|
7150
7344
|
}
|
|
7151
7345
|
}
|
|
7152
7346
|
constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
|
|
@@ -7176,8 +7370,9 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7176
7370
|
this.#lsdPages = [];
|
|
7177
7371
|
this.#nextPageIdx = 1;
|
|
7178
7372
|
this.#gettingPage = false;
|
|
7373
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
|
|
7179
7374
|
this.#initPages();
|
|
7180
|
-
browserContext.on("page"
|
|
7375
|
+
browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
|
|
7181
7376
|
const pageInfo = page.pageInfo;
|
|
7182
7377
|
if (pageInfo) {
|
|
7183
7378
|
const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
|
|
@@ -7186,27 +7381,26 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7186
7381
|
const currentTime2 = (0, import_utils16.getCurrentUnixTime)();
|
|
7187
7382
|
const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
|
|
7188
7383
|
const lsdPage = new CamoufoxPage(this, page, pageInfo2);
|
|
7384
|
+
this.#lsdPages.push(lsdPage);
|
|
7189
7385
|
if (this.#maxViewportOfNewPage) {
|
|
7190
7386
|
await lsdPage.maximizeViewport();
|
|
7191
7387
|
}
|
|
7192
|
-
this.#lsdPages.push(lsdPage);
|
|
7193
|
-
loginfo(`##page ${lsdPage.id()} created`);
|
|
7194
7388
|
}
|
|
7195
7389
|
});
|
|
7196
|
-
browserContext.on("close"
|
|
7390
|
+
browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
|
|
7197
7391
|
if (browserContext !== bc) {
|
|
7198
|
-
logerr(`##browser different browserContext in browserContext.on("close")`);
|
|
7392
|
+
logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
|
|
7199
7393
|
}
|
|
7200
|
-
this.#lsdBrowser.emit("browserContextClose"
|
|
7394
|
+
this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
|
|
7201
7395
|
});
|
|
7202
|
-
this.on("pageClose"
|
|
7396
|
+
this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
|
|
7203
7397
|
if (!(lsdPage instanceof CamoufoxPage)) {
|
|
7204
|
-
logerr(
|
|
7398
|
+
logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
|
|
7205
7399
|
return;
|
|
7206
7400
|
}
|
|
7207
7401
|
const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
|
|
7208
7402
|
if (idx < 0) {
|
|
7209
|
-
logerr(
|
|
7403
|
+
logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
|
|
7210
7404
|
return;
|
|
7211
7405
|
}
|
|
7212
7406
|
this.#lsdPages.splice(idx, 1);
|
|
@@ -7223,7 +7417,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7223
7417
|
if (this.#browserContext) {
|
|
7224
7418
|
this.#status = "closed";
|
|
7225
7419
|
this.#lastStatusUpdateTime = (0, import_utils16.getCurrentUnixTime)();
|
|
7226
|
-
loginfo(
|
|
7420
|
+
loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
|
|
7227
7421
|
await this.#browserContext.close();
|
|
7228
7422
|
}
|
|
7229
7423
|
return true;
|
|
@@ -7238,12 +7432,12 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7238
7432
|
await (0, import_utils16.sleep)(200);
|
|
7239
7433
|
}
|
|
7240
7434
|
}
|
|
7241
|
-
logwarn(
|
|
7435
|
+
logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
|
|
7242
7436
|
return false;
|
|
7243
7437
|
}
|
|
7244
7438
|
#freeGettingLock() {
|
|
7245
7439
|
if (!this.#gettingPage) {
|
|
7246
|
-
logwarn(
|
|
7440
|
+
logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
|
|
7247
7441
|
}
|
|
7248
7442
|
this.#gettingPage = false;
|
|
7249
7443
|
}
|
|
@@ -7252,7 +7446,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7252
7446
|
maxPageFreeSeconds = this.#maxPageFreeSeconds;
|
|
7253
7447
|
}
|
|
7254
7448
|
if (maxPageFreeSeconds <= 0) {
|
|
7255
|
-
logwarn(
|
|
7449
|
+
logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
|
|
7256
7450
|
return false;
|
|
7257
7451
|
}
|
|
7258
7452
|
const gotLock = await this.#tryToGetGettingLock();
|
|
@@ -7349,7 +7543,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
|
|
|
7349
7543
|
}
|
|
7350
7544
|
}
|
|
7351
7545
|
id() {
|
|
7352
|
-
return `
|
|
7546
|
+
return `CamoufoxContext-${this.#browserIdx}-${this.#browserContextIdx}`;
|
|
7353
7547
|
}
|
|
7354
7548
|
isFree() {
|
|
7355
7549
|
return this.#status === "free";
|
|
@@ -7483,34 +7677,33 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
|
|
|
7483
7677
|
this.#executablePath = executablePath;
|
|
7484
7678
|
this.#nextBrowserContextIdx = 1;
|
|
7485
7679
|
this.#closeFreePagesIntervalId = null;
|
|
7486
|
-
loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed
|
|
7680
|
+
loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
|
|
7487
7681
|
const browserContexts = browser.contexts();
|
|
7488
7682
|
if (browserContexts.length > 0) {
|
|
7489
|
-
logwarn(
|
|
7683
|
+
logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
|
|
7490
7684
|
}
|
|
7491
7685
|
const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
|
|
7492
7686
|
for (const browserContext of browserContexts) {
|
|
7493
7687
|
const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
7494
7688
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
7495
|
-
loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
|
|
7496
7689
|
}
|
|
7497
|
-
browser.on("disconnected"
|
|
7690
|
+
browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
|
|
7498
7691
|
loginfo(`##browser ${this.id()} disconnected`);
|
|
7499
7692
|
if (this.#lsdBrowserContexts.length > 0) {
|
|
7500
|
-
logerr(
|
|
7693
|
+
logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
|
|
7501
7694
|
}
|
|
7502
7695
|
});
|
|
7503
|
-
this.on("browserContextClose"
|
|
7696
|
+
this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
|
|
7504
7697
|
if (!(lsdBrowserContext instanceof CamoufoxBrowserContext)) {
|
|
7505
|
-
logerr(
|
|
7698
|
+
logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
|
|
7506
7699
|
return;
|
|
7507
7700
|
}
|
|
7508
7701
|
const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
|
|
7509
7702
|
if (idx < 0) {
|
|
7510
|
-
logerr(
|
|
7703
|
+
logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
|
|
7511
7704
|
return;
|
|
7512
7705
|
}
|
|
7513
|
-
loginfo(`##
|
|
7706
|
+
loginfo(`##browser ${lsdBrowserContext.id()} closed
|
|
7514
7707
|
`);
|
|
7515
7708
|
this.#lsdBrowserContexts.splice(idx, 1);
|
|
7516
7709
|
if (this.#lsdBrowserContexts.length === 0) {
|
|
@@ -7531,7 +7724,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
|
|
|
7531
7724
|
}
|
|
7532
7725
|
async newBrowserContext(options) {
|
|
7533
7726
|
if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
|
|
7534
|
-
logwarn(`##browser ${this.id()} can not create more new browserContext`);
|
|
7727
|
+
logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
|
|
7535
7728
|
return null;
|
|
7536
7729
|
}
|
|
7537
7730
|
const browserContextOptions = {};
|
|
@@ -7550,7 +7743,6 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
|
|
|
7550
7743
|
const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
|
|
7551
7744
|
const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
|
|
7552
7745
|
this.#lsdBrowserContexts.push(lsdBrowserContext);
|
|
7553
|
-
loginfo(`##browser ${lsdBrowserContext.id()} created`);
|
|
7554
7746
|
return lsdBrowserContext;
|
|
7555
7747
|
}
|
|
7556
7748
|
async close() {
|
|
@@ -7561,6 +7753,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
|
|
|
7561
7753
|
await lsdBrowserContext.close();
|
|
7562
7754
|
}
|
|
7563
7755
|
await this.#browser.close();
|
|
7756
|
+
loginfo(`##browser LsdBrowser ${this.id()} is closed`);
|
|
7564
7757
|
return true;
|
|
7565
7758
|
}
|
|
7566
7759
|
browserContexts() {
|
|
@@ -7586,7 +7779,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
|
|
|
7586
7779
|
return this.#executablePath;
|
|
7587
7780
|
}
|
|
7588
7781
|
id() {
|
|
7589
|
-
return `
|
|
7782
|
+
return `CamoufoxBrowser-${this.#browserType}-${this.#browserIdx}`;
|
|
7590
7783
|
}
|
|
7591
7784
|
isConnected() {
|
|
7592
7785
|
return this.#browser.isConnected();
|
|
@@ -7748,22 +7941,22 @@ var LsdBrowserController = class _LsdBrowserController {
|
|
|
7748
7941
|
const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
|
|
7749
7942
|
let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
|
|
7750
7943
|
if (idx >= 0) {
|
|
7751
|
-
logwarn(
|
|
7944
|
+
logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
|
|
7752
7945
|
args.splice(idx, 1);
|
|
7753
7946
|
}
|
|
7754
7947
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
|
|
7755
7948
|
if (idx >= 0) {
|
|
7756
|
-
logwarn(
|
|
7949
|
+
logwarn(`##browser controller Please use options.proxy instead when launching new browser.`);
|
|
7757
7950
|
args.splice(idx, 1);
|
|
7758
7951
|
}
|
|
7759
7952
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
|
|
7760
7953
|
if (idx >= 0) {
|
|
7761
|
-
logwarn(
|
|
7954
|
+
logwarn(`##browser controller Please use options.userDataDir instead when launching new browser.`);
|
|
7762
7955
|
args.splice(idx, 1);
|
|
7763
7956
|
}
|
|
7764
7957
|
idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--start-maximized"));
|
|
7765
7958
|
if (idx >= 0) {
|
|
7766
|
-
logwarn(
|
|
7959
|
+
logwarn(`##browser controller Please use options.maxWindowSize instead when launching new browser.`);
|
|
7767
7960
|
args.splice(idx, 1);
|
|
7768
7961
|
}
|
|
7769
7962
|
let lsdBrowser;
|
|
@@ -7961,7 +8154,7 @@ var LsdBrowserController = class _LsdBrowserController {
|
|
|
7961
8154
|
const pids = await (0, import_utils18.getPidsListeningOnPort)(port);
|
|
7962
8155
|
let browserPid = 0;
|
|
7963
8156
|
if (pids.length !== 1) {
|
|
7964
|
-
logerr(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
|
|
8157
|
+
logerr(`##browser controller pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
|
|
7965
8158
|
} else {
|
|
7966
8159
|
browserPid = pids[0];
|
|
7967
8160
|
}
|
|
@@ -8006,6 +8199,10 @@ var controller = new LsdBrowserController();
|
|
|
8006
8199
|
0 && (module.exports = {
|
|
8007
8200
|
CheerioElement,
|
|
8008
8201
|
CheerioPage,
|
|
8202
|
+
ControllerEvent,
|
|
8203
|
+
LsdBrowserContextEvent,
|
|
8204
|
+
LsdBrowserEvent,
|
|
8205
|
+
LsdPageEvent,
|
|
8009
8206
|
PlaywrightBrowser,
|
|
8010
8207
|
PlaywrightBrowserContext,
|
|
8011
8208
|
PlaywrightElement,
|