@skrillex1224/playwright-toolkit 2.1.49 → 2.1.51
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/browser.d.ts +3 -0
- package/dist/browser.js +327 -37
- package/dist/browser.js.map +4 -4
- package/dist/index.cjs +2106 -2137
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +2106 -2133
- package/dist/index.js.map +4 -4
- package/index.d.ts +33 -4
- package/package.json +6 -2
package/browser.d.ts
ADDED
package/dist/browser.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/internals/logger.js
|
|
2
8
|
var formatLine = (prefix, icon, message) => {
|
|
3
9
|
const parts = [];
|
|
4
10
|
if (prefix) parts.push(`[${prefix}]`);
|
|
@@ -12,22 +18,22 @@ var fallbackLog = {
|
|
|
12
18
|
error: (...args) => console.error(...args),
|
|
13
19
|
debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
|
|
14
20
|
};
|
|
15
|
-
var resolveLogMethod = (
|
|
16
|
-
if (
|
|
17
|
-
return
|
|
21
|
+
var resolveLogMethod = (logger2, name) => {
|
|
22
|
+
if (logger2 && typeof logger2[name] === "function") {
|
|
23
|
+
return logger2[name].bind(logger2);
|
|
18
24
|
}
|
|
19
|
-
if (name === "warning" &&
|
|
20
|
-
return
|
|
25
|
+
if (name === "warning" && logger2 && typeof logger2.warn === "function") {
|
|
26
|
+
return logger2.warn.bind(logger2);
|
|
21
27
|
}
|
|
22
28
|
return fallbackLog[name];
|
|
23
29
|
};
|
|
24
30
|
var defaultLogger = null;
|
|
25
|
-
var setDefaultLogger = (
|
|
26
|
-
defaultLogger =
|
|
31
|
+
var setDefaultLogger = (logger2) => {
|
|
32
|
+
defaultLogger = logger2;
|
|
27
33
|
};
|
|
28
|
-
var resolveLogger = (
|
|
29
|
-
if (
|
|
30
|
-
return
|
|
34
|
+
var resolveLogger = (explicitLogger) => {
|
|
35
|
+
if (explicitLogger && typeof explicitLogger.info === "function") {
|
|
36
|
+
return explicitLogger;
|
|
31
37
|
}
|
|
32
38
|
if (defaultLogger && typeof defaultLogger.info === "function") {
|
|
33
39
|
return defaultLogger;
|
|
@@ -43,31 +49,62 @@ var ANSI = {
|
|
|
43
49
|
blue: "\x1B[34m",
|
|
44
50
|
cyan: "\x1B[36m"
|
|
45
51
|
};
|
|
46
|
-
var stripAnsi = (input) => {
|
|
47
|
-
if (!input) return "";
|
|
48
|
-
return String(input).replace(/\x1b\[[0-9;]*m/g, "");
|
|
49
|
-
};
|
|
50
52
|
var colorize = (text, color) => {
|
|
51
53
|
if (!text || !color) return text;
|
|
52
54
|
return `${color}${text}${ANSI.reset}`;
|
|
53
55
|
};
|
|
54
|
-
var createBaseLogger = (prefix = "",
|
|
56
|
+
var createBaseLogger = (prefix = "", explicitLogger) => {
|
|
55
57
|
const name = prefix ? String(prefix) : "";
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
const dispatch = (methodName, icon, message, color) => {
|
|
59
|
+
const logger2 = resolveLogger(explicitLogger);
|
|
60
|
+
const logFn = resolveLogMethod(logger2, methodName);
|
|
61
|
+
logFn(colorize(formatLine(name, icon, message), color));
|
|
62
|
+
};
|
|
61
63
|
return {
|
|
62
|
-
info: (message) => info
|
|
63
|
-
success: (message) => info
|
|
64
|
-
warning: (message) => warning
|
|
65
|
-
warn: (message) => warning
|
|
66
|
-
error: (message) => error
|
|
67
|
-
debug: (message) => debug
|
|
68
|
-
start: (message) => info
|
|
64
|
+
info: (message) => dispatch("info", "\u{1F4D6}", message, ANSI.cyan),
|
|
65
|
+
success: (message) => dispatch("info", "\u2705", message, ANSI.green),
|
|
66
|
+
warning: (message) => dispatch("warning", "\u26A0\uFE0F", message, ANSI.yellow),
|
|
67
|
+
warn: (message) => dispatch("warning", "\u26A0\uFE0F", message, ANSI.yellow),
|
|
68
|
+
error: (message) => dispatch("error", "\u274C", message, ANSI.red),
|
|
69
|
+
debug: (message) => dispatch("debug", "\u{1F539}", message, ANSI.gray),
|
|
70
|
+
start: (message) => dispatch("info", "\u{1F537}", message, ANSI.blue)
|
|
69
71
|
};
|
|
70
72
|
};
|
|
73
|
+
function createInternalLogger(moduleName, explicitLogger) {
|
|
74
|
+
const baseLogger = createBaseLogger(moduleName, explicitLogger);
|
|
75
|
+
return {
|
|
76
|
+
start(methodName, params = "") {
|
|
77
|
+
const paramStr = params ? ` (${params})` : "";
|
|
78
|
+
baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);
|
|
79
|
+
},
|
|
80
|
+
success(methodName, result = "") {
|
|
81
|
+
const resultStr = result ? ` (${result})` : "";
|
|
82
|
+
baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);
|
|
83
|
+
},
|
|
84
|
+
fail(methodName, error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : error;
|
|
86
|
+
baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);
|
|
87
|
+
},
|
|
88
|
+
debug(message) {
|
|
89
|
+
baseLogger.debug(message);
|
|
90
|
+
},
|
|
91
|
+
warn(message) {
|
|
92
|
+
baseLogger.warning(message);
|
|
93
|
+
},
|
|
94
|
+
warning(message) {
|
|
95
|
+
baseLogger.warning(message);
|
|
96
|
+
},
|
|
97
|
+
info(message) {
|
|
98
|
+
baseLogger.info(message);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/logger.js
|
|
104
|
+
var stripAnsi = (input) => {
|
|
105
|
+
if (!input) return "";
|
|
106
|
+
return String(input).replace(/\x1b\[[0-9;]*m/g, "");
|
|
107
|
+
};
|
|
71
108
|
var STEP_PREFIX = "\u6B65\u9AA4:";
|
|
72
109
|
var STEP_SEPARATOR = " | ";
|
|
73
110
|
var STEP_EMOJIS = [
|
|
@@ -762,9 +799,9 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
|
|
|
762
799
|
...definitionMethods
|
|
763
800
|
};
|
|
764
801
|
};
|
|
765
|
-
var getDefaultBaseLogger = () => createBaseLogger(""
|
|
802
|
+
var getDefaultBaseLogger = () => createBaseLogger("");
|
|
766
803
|
var Logger = {
|
|
767
|
-
setLogger: (
|
|
804
|
+
setLogger: (logger2) => setDefaultLogger(logger2),
|
|
768
805
|
info: (message) => getDefaultBaseLogger().info(message),
|
|
769
806
|
success: (message) => getDefaultBaseLogger().success(message),
|
|
770
807
|
warning: (message) => getDefaultBaseLogger().warning(message),
|
|
@@ -772,19 +809,272 @@ var Logger = {
|
|
|
772
809
|
error: (message) => getDefaultBaseLogger().error(message),
|
|
773
810
|
debug: (message) => getDefaultBaseLogger().debug(message),
|
|
774
811
|
start: (message) => getDefaultBaseLogger().start(message),
|
|
775
|
-
useTemplate: (
|
|
812
|
+
useTemplate: (logger2) => {
|
|
813
|
+
if (logger2) return createTemplateLogger(createBaseLogger("", logger2));
|
|
814
|
+
return createTemplateLogger();
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
// src/browser-onlys/index.js
|
|
819
|
+
var browser_onlys_exports = {};
|
|
820
|
+
__export(browser_onlys_exports, {
|
|
821
|
+
PLATFORM_CONFIG: () => PLATFORM_CONFIG,
|
|
822
|
+
TokenForm: () => TokenForm
|
|
823
|
+
});
|
|
824
|
+
|
|
825
|
+
// src/utils.js
|
|
826
|
+
import delay from "delay";
|
|
827
|
+
var logger = createInternalLogger("Utils");
|
|
828
|
+
var Utils = {
|
|
829
|
+
/**
|
|
830
|
+
* 解析 Cookie 字符串为 Playwright 格式的 Cookie 数组
|
|
831
|
+
* @param {string} cookieString - Cookie 字符串
|
|
832
|
+
* @param {string} [domain] - Cookie 域名 (可选)
|
|
833
|
+
* @returns {Array} Cookie 数组
|
|
834
|
+
*/
|
|
835
|
+
parseCookies(cookieString, domain) {
|
|
836
|
+
const cookies = [];
|
|
837
|
+
const pairs = cookieString.split(";").map((c) => c.trim());
|
|
838
|
+
for (const pair of pairs) {
|
|
839
|
+
const [name, ...valueParts] = pair.split("=");
|
|
840
|
+
if (name && valueParts.length > 0) {
|
|
841
|
+
const cookie = {
|
|
842
|
+
name: name.trim(),
|
|
843
|
+
value: valueParts.join("=").trim(),
|
|
844
|
+
path: "/"
|
|
845
|
+
};
|
|
846
|
+
if (domain) {
|
|
847
|
+
cookie.domain = domain;
|
|
848
|
+
}
|
|
849
|
+
cookies.push(cookie);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
logger.success("parseCookies", `parsed ${cookies.length} cookies`);
|
|
853
|
+
return cookies;
|
|
854
|
+
},
|
|
855
|
+
/**
|
|
856
|
+
* 全页面滚动截图
|
|
857
|
+
* 自动检测页面所有可滚动元素,取最大高度,强制展开后截图
|
|
858
|
+
*
|
|
859
|
+
* @param {import('playwright').Page} page - Playwright page 对象
|
|
860
|
+
* @param {Object} [options] - 配置选项
|
|
861
|
+
* @param {number} [options.buffer] - 额外缓冲高度 (默认: 视口高度的一半)
|
|
862
|
+
* @param {boolean} [options.restore] - 截图后是否恢复页面高度和样式 (默认: false)
|
|
863
|
+
* @param {number} [options.maxHeight] - 最大截图高度 (默认: 8000px)
|
|
864
|
+
* @returns {Promise<string>} - base64 编码的 PNG 图片
|
|
865
|
+
*/
|
|
866
|
+
async fullPageScreenshot(page, options = {}) {
|
|
867
|
+
var _a, _b, _c;
|
|
868
|
+
logger.start("fullPageScreenshot", "detecting scrollable elements");
|
|
869
|
+
const originalViewport = page.viewportSize();
|
|
870
|
+
const defaultBuffer = Math.round(((originalViewport == null ? void 0 : originalViewport.height) || 1080) / 2);
|
|
871
|
+
const buffer = (_a = options.buffer) != null ? _a : defaultBuffer;
|
|
872
|
+
const restore = (_b = options.restore) != null ? _b : false;
|
|
873
|
+
const maxHeight = (_c = options.maxHeight) != null ? _c : 8e3;
|
|
874
|
+
try {
|
|
875
|
+
const maxScrollHeight = await page.evaluate(() => {
|
|
876
|
+
let maxHeight2 = document.body.scrollHeight;
|
|
877
|
+
document.querySelectorAll("*").forEach((el) => {
|
|
878
|
+
const style = window.getComputedStyle(el);
|
|
879
|
+
const overflowY = style.overflowY;
|
|
880
|
+
if ((overflowY === "auto" || overflowY === "scroll") && el.scrollHeight > el.clientHeight) {
|
|
881
|
+
if (el.scrollHeight > maxHeight2) {
|
|
882
|
+
maxHeight2 = el.scrollHeight;
|
|
883
|
+
}
|
|
884
|
+
el.dataset.pkOrigOverflow = el.style.overflow;
|
|
885
|
+
el.dataset.pkOrigHeight = el.style.height;
|
|
886
|
+
el.dataset.pkOrigMaxHeight = el.style.maxHeight;
|
|
887
|
+
el.classList.add("__pk_expanded__");
|
|
888
|
+
el.style.overflow = "visible";
|
|
889
|
+
el.style.height = "auto";
|
|
890
|
+
el.style.maxHeight = "none";
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
return maxHeight2;
|
|
894
|
+
});
|
|
895
|
+
const targetHeight = Math.min(maxScrollHeight + buffer, maxHeight);
|
|
896
|
+
await page.setViewportSize({
|
|
897
|
+
width: (originalViewport == null ? void 0 : originalViewport.width) || 1280,
|
|
898
|
+
height: targetHeight
|
|
899
|
+
});
|
|
900
|
+
await delay(1e3);
|
|
901
|
+
const buffer_ = await page.screenshot({
|
|
902
|
+
fullPage: true,
|
|
903
|
+
type: "png"
|
|
904
|
+
});
|
|
905
|
+
logger.success("fullPageScreenshot", `captured ${Math.round(buffer_.length / 1024)} KB`);
|
|
906
|
+
return buffer_.toString("base64");
|
|
907
|
+
} finally {
|
|
908
|
+
if (restore) {
|
|
909
|
+
await page.evaluate(() => {
|
|
910
|
+
document.querySelectorAll(".__pk_expanded__").forEach((el) => {
|
|
911
|
+
el.style.overflow = el.dataset.pkOrigOverflow || "";
|
|
912
|
+
el.style.height = el.dataset.pkOrigHeight || "";
|
|
913
|
+
el.style.maxHeight = el.dataset.pkOrigMaxHeight || "";
|
|
914
|
+
delete el.dataset.pkOrigOverflow;
|
|
915
|
+
delete el.dataset.pkOrigHeight;
|
|
916
|
+
delete el.dataset.pkOrigMaxHeight;
|
|
917
|
+
el.classList.remove("__pk_expanded__");
|
|
918
|
+
});
|
|
919
|
+
});
|
|
920
|
+
if (originalViewport) {
|
|
921
|
+
await page.setViewportSize(originalViewport);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
// src/browser-onlys/token-form.js
|
|
929
|
+
var PLATFORM_CONFIG = {
|
|
930
|
+
kimi: {
|
|
931
|
+
name: "Kimi (Moonshot)",
|
|
932
|
+
tokenName: "kimi_auth",
|
|
933
|
+
serviceUrl: "https://kimi.moonshot.cn/",
|
|
934
|
+
tokenFields: ["kimi_auth"],
|
|
935
|
+
parse: (token) => {
|
|
936
|
+
const val = token ? token.trim() : "";
|
|
937
|
+
return val ? { kimi_auth: val } : {};
|
|
938
|
+
},
|
|
939
|
+
format: (values) => {
|
|
940
|
+
const val = values.kimi_auth;
|
|
941
|
+
return val === void 0 || val === null ? "" : String(val).trim();
|
|
942
|
+
}
|
|
943
|
+
},
|
|
944
|
+
doubao: {
|
|
945
|
+
name: "\u8C46\u5305 (Doubao)",
|
|
946
|
+
tokenName: "sessionid",
|
|
947
|
+
serviceUrl: "https://www.doubao.com/",
|
|
948
|
+
tokenFields: ["sessionid"],
|
|
949
|
+
parse: (token) => {
|
|
950
|
+
const val = token ? token.trim() : "";
|
|
951
|
+
return val ? { sessionid: val } : {};
|
|
952
|
+
},
|
|
953
|
+
format: (values) => {
|
|
954
|
+
const val = values.sessionid;
|
|
955
|
+
return val === void 0 || val === null ? "" : String(val).trim();
|
|
956
|
+
}
|
|
957
|
+
},
|
|
958
|
+
deepseek: {
|
|
959
|
+
name: "DeepSeek",
|
|
960
|
+
tokenName: "userToken",
|
|
961
|
+
serviceUrl: "https://chat.deepseek.com/",
|
|
962
|
+
guide: '\u8BF7\u8F93\u5165\u5B8C\u6574 JSON\uFF0C\u4F8B\u5982 {"value":"xxxxx"}\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u63D0\u53D6 value\u3002',
|
|
963
|
+
tokenFields: ["userToken"],
|
|
964
|
+
parse: (token) => {
|
|
965
|
+
const val = token ? token.trim() : "";
|
|
966
|
+
return val ? { userToken: val } : {};
|
|
967
|
+
},
|
|
968
|
+
format: (values) => {
|
|
969
|
+
const raw = values.userToken ? String(values.userToken).trim() : "";
|
|
970
|
+
if (!raw) return "";
|
|
971
|
+
if (raw.startsWith("{")) {
|
|
972
|
+
try {
|
|
973
|
+
const parsed = JSON.parse(raw);
|
|
974
|
+
if (parsed && typeof parsed.value === "string") return parsed.value.trim();
|
|
975
|
+
} catch (e) {
|
|
976
|
+
return "";
|
|
977
|
+
}
|
|
978
|
+
return "";
|
|
979
|
+
}
|
|
980
|
+
return raw;
|
|
981
|
+
}
|
|
982
|
+
},
|
|
983
|
+
yuanbao: {
|
|
984
|
+
name: "\u5143\u5B9D (Tencent)",
|
|
985
|
+
tokenName: "hy_user, hy_token",
|
|
986
|
+
serviceUrl: "https://yuanbao.tencent.com/",
|
|
987
|
+
guide: "\u5206\u522B\u586B\u5165\u4ECE\u6D4F\u89C8\u5668\u83B7\u53D6\u7684 hy_user \u548C hy_token\uFF0C\u7CFB\u7EDF\u5C06\u81EA\u52A8\u62FC\u63A5\u3002",
|
|
988
|
+
tokenFields: ["hy_user", "hy_token"],
|
|
989
|
+
parse: (token) => {
|
|
990
|
+
const cookieList = Utils.parseCookies(token || "");
|
|
991
|
+
const pairs = {};
|
|
992
|
+
cookieList.forEach((c) => {
|
|
993
|
+
pairs[c.name] = c.value;
|
|
994
|
+
});
|
|
995
|
+
return {
|
|
996
|
+
hy_user: pairs["hy_user"] || "",
|
|
997
|
+
hy_token: pairs["hy_token"] || ""
|
|
998
|
+
};
|
|
999
|
+
},
|
|
1000
|
+
format: (values) => {
|
|
1001
|
+
const u = values.hy_user ? String(values.hy_user).trim() : "";
|
|
1002
|
+
const t = values.hy_token ? String(values.hy_token).trim() : "";
|
|
1003
|
+
if (!u || !t) return "";
|
|
1004
|
+
return `hy_user=${u}; hy_token=${t}`;
|
|
1005
|
+
}
|
|
1006
|
+
},
|
|
1007
|
+
qwen: {
|
|
1008
|
+
name: "\u901A\u4E49\u5343\u95EE (Qwen)",
|
|
1009
|
+
tokenName: "tongyi_sso_ticket",
|
|
1010
|
+
serviceUrl: "https://tongyi.aliyun.com/",
|
|
1011
|
+
tokenFields: ["tongyi_sso_ticket"],
|
|
1012
|
+
parse: (token) => {
|
|
1013
|
+
const val = token ? token.trim() : "";
|
|
1014
|
+
return val ? { tongyi_sso_ticket: val } : {};
|
|
1015
|
+
},
|
|
1016
|
+
format: (values) => {
|
|
1017
|
+
const val = values.tongyi_sso_ticket;
|
|
1018
|
+
return val === void 0 || val === null ? "" : String(val).trim();
|
|
1019
|
+
}
|
|
1020
|
+
},
|
|
1021
|
+
erine: {
|
|
1022
|
+
name: "\u6587\u5FC3\u4E00\u8A00 (Erine)",
|
|
1023
|
+
tokenName: "BDUSS",
|
|
1024
|
+
serviceUrl: "https://yiyan.baidu.com/",
|
|
1025
|
+
tokenFields: ["BDUSS"],
|
|
1026
|
+
parse: (token) => {
|
|
1027
|
+
const val = token ? token.trim() : "";
|
|
1028
|
+
return val ? { BDUSS: val } : {};
|
|
1029
|
+
},
|
|
1030
|
+
format: (values) => {
|
|
1031
|
+
const val = values.BDUSS;
|
|
1032
|
+
return val === void 0 || val === null ? "" : String(val).trim();
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
};
|
|
1036
|
+
function createTokenForm() {
|
|
1037
|
+
return {
|
|
1038
|
+
getPlatformConfig(actor) {
|
|
1039
|
+
if (!actor) throw new Error("Actor parameter is required to get platform config");
|
|
1040
|
+
if (PLATFORM_CONFIG[actor]) return PLATFORM_CONFIG[actor];
|
|
1041
|
+
const key = Object.keys(PLATFORM_CONFIG).find((k) => actor.includes(k));
|
|
1042
|
+
if (key) return PLATFORM_CONFIG[key];
|
|
1043
|
+
throw new Error(`\u672A\u627E\u5230\u5E73\u53F0\u914D\u7F6E: ${actor}. \u8BF7\u786E\u4FDD playwright-toolkit/browser-onlys/token-form.js \u4E2D\u5DF2\u5B9A\u4E49\u8BE5\u5E73\u53F0\u3002`);
|
|
1044
|
+
},
|
|
1045
|
+
parseToken(token, config) {
|
|
1046
|
+
if (!config) return {};
|
|
1047
|
+
return config.parse(token);
|
|
1048
|
+
},
|
|
1049
|
+
formatToken(values, config) {
|
|
1050
|
+
if (!config) return "";
|
|
1051
|
+
return config.format(values);
|
|
1052
|
+
}
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
var instance = null;
|
|
1056
|
+
async function useTokenForm() {
|
|
1057
|
+
if (!instance) {
|
|
1058
|
+
instance = createTokenForm();
|
|
1059
|
+
}
|
|
1060
|
+
return instance;
|
|
1061
|
+
}
|
|
1062
|
+
var TokenForm = {
|
|
1063
|
+
useTokenForm
|
|
776
1064
|
};
|
|
777
1065
|
|
|
778
1066
|
// entrys/browser.js
|
|
779
1067
|
var usePlaywrightToolKit = () => {
|
|
780
|
-
|
|
1068
|
+
return {
|
|
1069
|
+
Logger,
|
|
1070
|
+
...browser_onlys_exports,
|
|
1071
|
+
$Internals: {
|
|
1072
|
+
LOG_TEMPLATES,
|
|
1073
|
+
stripAnsi
|
|
1074
|
+
}
|
|
1075
|
+
};
|
|
781
1076
|
};
|
|
782
|
-
var browser = { Logger, LOG_TEMPLATES, stripAnsi };
|
|
783
1077
|
export {
|
|
784
|
-
LOG_TEMPLATES,
|
|
785
|
-
Logger,
|
|
786
|
-
browser,
|
|
787
|
-
stripAnsi,
|
|
788
1078
|
usePlaywrightToolKit
|
|
789
1079
|
};
|
|
790
1080
|
//# sourceMappingURL=browser.js.map
|