@pyrokine/mcp-chrome 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +333 -0
  2. package/dist/anti-detection/behavior.d.ts +58 -0
  3. package/dist/anti-detection/behavior.d.ts.map +1 -0
  4. package/dist/anti-detection/behavior.js +113 -0
  5. package/dist/anti-detection/behavior.js.map +1 -0
  6. package/dist/anti-detection/index.d.ts +6 -0
  7. package/dist/anti-detection/index.d.ts.map +1 -0
  8. package/dist/anti-detection/index.js +6 -0
  9. package/dist/anti-detection/index.js.map +1 -0
  10. package/dist/anti-detection/injection.d.ts +19 -0
  11. package/dist/anti-detection/injection.d.ts.map +1 -0
  12. package/dist/anti-detection/injection.js +270 -0
  13. package/dist/anti-detection/injection.js.map +1 -0
  14. package/dist/cdp/client.d.ts +73 -0
  15. package/dist/cdp/client.d.ts.map +1 -0
  16. package/dist/cdp/client.js +275 -0
  17. package/dist/cdp/client.js.map +1 -0
  18. package/dist/cdp/index.d.ts +6 -0
  19. package/dist/cdp/index.d.ts.map +1 -0
  20. package/dist/cdp/index.js +6 -0
  21. package/dist/cdp/index.js.map +1 -0
  22. package/dist/cdp/launcher.d.ts +42 -0
  23. package/dist/cdp/launcher.d.ts.map +1 -0
  24. package/dist/cdp/launcher.js +181 -0
  25. package/dist/cdp/launcher.js.map +1 -0
  26. package/dist/core/auto-wait.d.ts +71 -0
  27. package/dist/core/auto-wait.d.ts.map +1 -0
  28. package/dist/core/auto-wait.js +165 -0
  29. package/dist/core/auto-wait.js.map +1 -0
  30. package/dist/core/errors.d.ts +123 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/errors.js +226 -0
  33. package/dist/core/errors.js.map +1 -0
  34. package/dist/core/index.d.ts +10 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +10 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/locator.d.ts +130 -0
  39. package/dist/core/locator.d.ts.map +1 -0
  40. package/dist/core/locator.js +402 -0
  41. package/dist/core/locator.js.map +1 -0
  42. package/dist/core/retry.d.ts +27 -0
  43. package/dist/core/retry.d.ts.map +1 -0
  44. package/dist/core/retry.js +51 -0
  45. package/dist/core/retry.js.map +1 -0
  46. package/dist/core/session.d.ts +254 -0
  47. package/dist/core/session.d.ts.map +1 -0
  48. package/dist/core/session.js +893 -0
  49. package/dist/core/session.js.map +1 -0
  50. package/dist/core/types.d.ts +263 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +90 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/index.d.ts +14 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +121 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/tools/browse.d.ts +92 -0
  59. package/dist/tools/browse.d.ts.map +1 -0
  60. package/dist/tools/browse.js +368 -0
  61. package/dist/tools/browse.js.map +1 -0
  62. package/dist/tools/cookies.d.ts +75 -0
  63. package/dist/tools/cookies.d.ts.map +1 -0
  64. package/dist/tools/cookies.js +230 -0
  65. package/dist/tools/cookies.js.map +1 -0
  66. package/dist/tools/evaluate.d.ts +45 -0
  67. package/dist/tools/evaluate.d.ts.map +1 -0
  68. package/dist/tools/evaluate.js +85 -0
  69. package/dist/tools/evaluate.js.map +1 -0
  70. package/dist/tools/extract.d.ts +213 -0
  71. package/dist/tools/extract.d.ts.map +1 -0
  72. package/dist/tools/extract.js +304 -0
  73. package/dist/tools/extract.js.map +1 -0
  74. package/dist/tools/index.d.ts +13 -0
  75. package/dist/tools/index.d.ts.map +1 -0
  76. package/dist/tools/index.js +13 -0
  77. package/dist/tools/index.js.map +1 -0
  78. package/dist/tools/input.d.ts +241 -0
  79. package/dist/tools/input.d.ts.map +1 -0
  80. package/dist/tools/input.js +325 -0
  81. package/dist/tools/input.js.map +1 -0
  82. package/dist/tools/logs.d.ts +57 -0
  83. package/dist/tools/logs.d.ts.map +1 -0
  84. package/dist/tools/logs.js +165 -0
  85. package/dist/tools/logs.js.map +1 -0
  86. package/dist/tools/manage.d.ts +65 -0
  87. package/dist/tools/manage.d.ts.map +1 -0
  88. package/dist/tools/manage.js +270 -0
  89. package/dist/tools/manage.js.map +1 -0
  90. package/dist/tools/schema.d.ts +261 -0
  91. package/dist/tools/schema.d.ts.map +1 -0
  92. package/dist/tools/schema.js +151 -0
  93. package/dist/tools/schema.js.map +1 -0
  94. package/dist/tools/wait.d.ts +203 -0
  95. package/dist/tools/wait.d.ts.map +1 -0
  96. package/dist/tools/wait.js +254 -0
  97. package/dist/tools/wait.js.map +1 -0
  98. package/package.json +43 -0
  99. package/scripts/start-chrome-headless.sh +37 -0
  100. package/scripts/start-chrome.sh +41 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 浏览器启动器
3
+ *
4
+ * 负责启动 Chrome 浏览器进程并获取 CDP 端点
5
+ */
6
+ import type { LaunchOptions } from '../core/types.js';
7
+ /**
8
+ * 查找 Chrome 可执行文件
9
+ */
10
+ export declare function findChrome(): string | null;
11
+ /**
12
+ * 浏览器启动器
13
+ */
14
+ export declare class BrowserLauncher {
15
+ private process;
16
+ private _port;
17
+ get port(): number;
18
+ private _endpoint;
19
+ get endpoint(): string;
20
+ get isRunning(): boolean;
21
+ /**
22
+ * 启动浏览器
23
+ */
24
+ launch(options?: LaunchOptions): Promise<string>;
25
+ /**
26
+ * 关闭浏览器
27
+ */
28
+ close(): void;
29
+ /**
30
+ * 强制关闭浏览器
31
+ */
32
+ forceClose(): void;
33
+ /**
34
+ * 构建启动参数
35
+ */
36
+ private buildArgs;
37
+ /**
38
+ * 等待 CDP 端点就绪
39
+ */
40
+ private waitForEndpoint;
41
+ }
42
+ //# sourceMappingURL=launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/cdp/launcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAwBnD;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAU1C;AAED;;GAEG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,KAAK,CAA2B;IAExC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,SAAS,CAAa;IAE9B,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1D;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmDjB;;OAEG;IACH,OAAO,CAAC,eAAe;CA0C1B"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * 浏览器启动器
3
+ *
4
+ * 负责启动 Chrome 浏览器进程并获取 CDP 端点
5
+ */
6
+ import { spawn } from 'child_process';
7
+ import { existsSync } from 'fs';
8
+ import { platform } from 'os';
9
+ import { BrowserNotFoundError, TimeoutError } from '../core/errors.js';
10
+ /**
11
+ * Chrome 可执行文件的常见路径
12
+ */
13
+ const CHROME_PATHS = {
14
+ linux: [
15
+ '/usr/bin/google-chrome',
16
+ '/usr/bin/google-chrome-stable',
17
+ '/usr/bin/chromium',
18
+ '/usr/bin/chromium-browser',
19
+ '/snap/bin/chromium',
20
+ ],
21
+ darwin: [
22
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
23
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
24
+ ],
25
+ win32: [
26
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
27
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
28
+ `${process.env.LOCALAPPDATA}\\Google\\Chrome\\Application\\chrome.exe`,
29
+ ],
30
+ };
31
+ /**
32
+ * 查找 Chrome 可执行文件
33
+ */
34
+ export function findChrome() {
35
+ const paths = CHROME_PATHS[platform()] ?? [];
36
+ for (const p of paths) {
37
+ if (existsSync(p)) {
38
+ return p;
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * 浏览器启动器
45
+ */
46
+ export class BrowserLauncher {
47
+ process = null;
48
+ _port = 0;
49
+ get port() {
50
+ return this._port;
51
+ }
52
+ _endpoint = '';
53
+ get endpoint() {
54
+ return this._endpoint;
55
+ }
56
+ get isRunning() {
57
+ return this.process !== null && !this.process.killed;
58
+ }
59
+ /**
60
+ * 启动浏览器
61
+ */
62
+ async launch(options = {}) {
63
+ const { executablePath, port = 0, incognito = false, headless = false, userDataDir, timeout = 30000, } = options;
64
+ // 查找 Chrome
65
+ const chromePath = executablePath ?? findChrome();
66
+ if (!chromePath) {
67
+ throw new BrowserNotFoundError();
68
+ }
69
+ // 构建启动参数
70
+ const args = this.buildArgs({ port, incognito, headless, userDataDir });
71
+ // 启动进程
72
+ this.process = spawn(chromePath, args, {
73
+ detached: false,
74
+ stdio: ['ignore', 'pipe', 'pipe'],
75
+ });
76
+ // 等待 CDP 端点就绪
77
+ this._endpoint = await this.waitForEndpoint(timeout);
78
+ return this._endpoint;
79
+ }
80
+ /**
81
+ * 关闭浏览器
82
+ */
83
+ close() {
84
+ if (this.process && !this.process.killed) {
85
+ this.process.kill('SIGTERM');
86
+ this.process = null;
87
+ }
88
+ }
89
+ /**
90
+ * 强制关闭浏览器
91
+ */
92
+ forceClose() {
93
+ if (this.process && !this.process.killed) {
94
+ this.process.kill('SIGKILL');
95
+ this.process = null;
96
+ }
97
+ }
98
+ /**
99
+ * 构建启动参数
100
+ */
101
+ buildArgs(options) {
102
+ const args = [
103
+ `--remote-debugging-port=${options.port}`,
104
+ '--no-first-run',
105
+ '--no-default-browser-check',
106
+ '--disable-background-networking',
107
+ '--disable-background-timer-throttling',
108
+ '--disable-backgrounding-occluded-windows',
109
+ '--disable-breakpad',
110
+ '--disable-component-extensions-with-background-pages',
111
+ '--disable-component-update',
112
+ '--disable-default-apps',
113
+ '--disable-dev-shm-usage',
114
+ '--disable-extensions',
115
+ '--disable-features=TranslateUI',
116
+ '--disable-hang-monitor',
117
+ '--disable-ipc-flooding-protection',
118
+ '--disable-popup-blocking',
119
+ '--disable-prompt-on-repost',
120
+ '--disable-renderer-backgrounding',
121
+ '--disable-sync',
122
+ '--enable-features=NetworkService,NetworkServiceInProcess',
123
+ '--force-color-profile=srgb',
124
+ '--metrics-recording-only',
125
+ '--password-store=basic',
126
+ '--use-mock-keychain',
127
+ ];
128
+ if (options.incognito) {
129
+ args.push('--incognito');
130
+ }
131
+ if (options.headless) {
132
+ args.push('--headless=new');
133
+ }
134
+ if (options.userDataDir) {
135
+ args.push(`--user-data-dir=${options.userDataDir}`);
136
+ }
137
+ // 打开一个空白页
138
+ args.push('about:blank');
139
+ return args;
140
+ }
141
+ /**
142
+ * 等待 CDP 端点就绪
143
+ */
144
+ waitForEndpoint(timeout) {
145
+ return new Promise((resolve, reject) => {
146
+ if (!this.process) {
147
+ reject(new Error('浏览器进程未启动'));
148
+ return;
149
+ }
150
+ const timer = setTimeout(() => {
151
+ reject(new TimeoutError(`等待浏览器启动超时 (${timeout}ms)`));
152
+ }, timeout);
153
+ let stderr = '';
154
+ this.process.stderr?.on('data', (data) => {
155
+ stderr += data.toString();
156
+ // 解析 DevTools listening on ws://...
157
+ const match = stderr.match(/DevTools listening on (ws:\/\/[^\s]+)/);
158
+ if (match) {
159
+ clearTimeout(timer);
160
+ // 解析端口
161
+ const portMatch = match[1].match(/:(\d+)\//);
162
+ if (portMatch) {
163
+ this._port = parseInt(portMatch[1], 10);
164
+ }
165
+ resolve(match[1]);
166
+ }
167
+ });
168
+ this.process.on('error', (error) => {
169
+ clearTimeout(timer);
170
+ reject(error);
171
+ });
172
+ this.process.on('exit', (code) => {
173
+ clearTimeout(timer);
174
+ if (code !== 0 && code !== null) {
175
+ reject(new Error(`浏览器进程退出,代码: ${code}\n${stderr}`));
176
+ }
177
+ });
178
+ });
179
+ }
180
+ }
181
+ //# sourceMappingURL=launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/cdp/launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 自动等待机制
3
+ *
4
+ * 参考 Puppeteer Locator 的自动等待:
5
+ * - waitForEnabled: 等待元素可用
6
+ * - waitForStableBoundingBox: 等待位置稳定
7
+ * - ensureInViewport: 确保元素在视口内
8
+ *
9
+ * 核心思想:操作前自动检查元素状态,失败则重试,而非立即报错。
10
+ */
11
+ import type { CDPClient } from '../cdp/client.js';
12
+ /**
13
+ * AutoWait 选项
14
+ */
15
+ export interface AutoWaitOptions {
16
+ /** 超时时间(毫秒),默认 30000 */
17
+ timeout?: number;
18
+ }
19
+ /**
20
+ * 自动等待类
21
+ */
22
+ export declare class AutoWait {
23
+ private cdp;
24
+ private sessionId;
25
+ private timeout;
26
+ constructor(cdp: CDPClient, sessionId: string, options?: AutoWaitOptions);
27
+ /**
28
+ * 等待元素可用(非禁用状态)
29
+ *
30
+ * 参考:Puppeteer #waitForEnabledIfNeeded
31
+ * 对于表单控件(BUTTON, INPUT, SELECT, TEXTAREA),检查是否有 disabled 属性
32
+ */
33
+ waitForEnabled(nodeId: number): Promise<void>;
34
+ /**
35
+ * 等待元素位置稳定(两帧对比)
36
+ *
37
+ * 参考:Puppeteer #waitForStableBoundingBoxIfNeeded
38
+ * 在两个连续的动画帧中,元素的边界框必须相同
39
+ */
40
+ waitForStableBoundingBox(nodeId: number): Promise<void>;
41
+ /**
42
+ * 确保元素在视口内
43
+ *
44
+ * 参考:Puppeteer #ensureElementIsInTheViewportIfNeeded
45
+ * 如果元素不在视口内,自动滚动到视口中
46
+ */
47
+ ensureInViewport(nodeId: number): Promise<void>;
48
+ /**
49
+ * 等待元素可见
50
+ *
51
+ * 检查元素的 visibility 不为 hidden,且有非空边界框
52
+ */
53
+ waitForVisible(nodeId: number): Promise<void>;
54
+ /**
55
+ * 执行点击前的所有等待检查
56
+ *
57
+ * 包括:enabled + stableBoundingBox + inViewport
58
+ */
59
+ waitForClickable(nodeId: number): Promise<void>;
60
+ /**
61
+ * 执行输入前的所有等待检查
62
+ *
63
+ * 包括:enabled + stableBoundingBox
64
+ */
65
+ waitForInputReady(nodeId: number): Promise<void>;
66
+ /**
67
+ * 发送 CDP 命令
68
+ */
69
+ private send;
70
+ }
71
+ //# sourceMappingURL=auto-wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-wait.d.ts","sourceRoot":"","sources":["../../src/core/auto-wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;GAEG;AACH,qBAAa,QAAQ;IAIb,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;IAJrB,OAAO,CAAC,OAAO,CAAQ;gBAGX,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACzB,OAAO,GAAE,eAAoB;IAKjC;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD;;;;;OAKG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7D;;;;;OAKG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BrD;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnD;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD;;;;OAIG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD;;OAEG;IACH,OAAO,CAAC,IAAI;CAGf"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * 自动等待机制
3
+ *
4
+ * 参考 Puppeteer Locator 的自动等待:
5
+ * - waitForEnabled: 等待元素可用
6
+ * - waitForStableBoundingBox: 等待位置稳定
7
+ * - ensureInViewport: 确保元素在视口内
8
+ *
9
+ * 核心思想:操作前自动检查元素状态,失败则重试,而非立即报错。
10
+ */
11
+ import { withRetry } from './retry.js';
12
+ const DEFAULT_TIMEOUT = 30000;
13
+ /**
14
+ * 自动等待类
15
+ */
16
+ export class AutoWait {
17
+ cdp;
18
+ sessionId;
19
+ timeout;
20
+ constructor(cdp, sessionId, options = {}) {
21
+ this.cdp = cdp;
22
+ this.sessionId = sessionId;
23
+ this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
24
+ }
25
+ /**
26
+ * 等待元素可用(非禁用状态)
27
+ *
28
+ * 参考:Puppeteer #waitForEnabledIfNeeded
29
+ * 对于表单控件(BUTTON, INPUT, SELECT, TEXTAREA),检查是否有 disabled 属性
30
+ */
31
+ async waitForEnabled(nodeId) {
32
+ await withRetry(async () => {
33
+ const { object } = (await this.send('DOM.resolveNode', { nodeId }));
34
+ const { result } = (await this.send('Runtime.callFunctionOn', {
35
+ objectId: object.objectId,
36
+ functionDeclaration: `function() {
37
+ if (!(this instanceof HTMLElement)) return true;
38
+ const formControls = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
39
+ if (!formControls.includes(this.nodeName)) return true;
40
+ return !this.hasAttribute('disabled');
41
+ }`,
42
+ returnByValue: true,
43
+ }));
44
+ if (!result.value) {
45
+ throw new Error('元素处于禁用状态');
46
+ }
47
+ }, { timeout: this.timeout });
48
+ }
49
+ /**
50
+ * 等待元素位置稳定(两帧对比)
51
+ *
52
+ * 参考:Puppeteer #waitForStableBoundingBoxIfNeeded
53
+ * 在两个连续的动画帧中,元素的边界框必须相同
54
+ */
55
+ async waitForStableBoundingBox(nodeId) {
56
+ await withRetry(async () => {
57
+ const { object } = (await this.send('DOM.resolveNode', { nodeId }));
58
+ const { result } = (await this.send('Runtime.callFunctionOn', {
59
+ objectId: object.objectId,
60
+ functionDeclaration: `function() {
61
+ return new Promise((resolve) => {
62
+ let rect1;
63
+ requestAnimationFrame(() => {
64
+ rect1 = this.getBoundingClientRect();
65
+ requestAnimationFrame(() => {
66
+ const rect2 = this.getBoundingClientRect();
67
+ const stable = rect1.x === rect2.x && rect1.y === rect2.y &&
68
+ rect1.width === rect2.width && rect1.height === rect2.height;
69
+ resolve(stable);
70
+ });
71
+ });
72
+ });
73
+ }`,
74
+ returnByValue: true,
75
+ awaitPromise: true,
76
+ }));
77
+ if (!result.value) {
78
+ throw new Error('元素位置不稳定');
79
+ }
80
+ }, { timeout: this.timeout });
81
+ }
82
+ /**
83
+ * 确保元素在视口内
84
+ *
85
+ * 参考:Puppeteer #ensureElementIsInTheViewportIfNeeded
86
+ * 如果元素不在视口内,自动滚动到视口中
87
+ */
88
+ async ensureInViewport(nodeId) {
89
+ const { object } = (await this.send('DOM.resolveNode', { nodeId }));
90
+ // 检查是否在视口内
91
+ const { result: isInViewport } = (await this.send('Runtime.callFunctionOn', {
92
+ objectId: object.objectId,
93
+ functionDeclaration: `function() {
94
+ const rect = this.getBoundingClientRect();
95
+ return rect.top >= 0 && rect.left >= 0 &&
96
+ rect.bottom <= window.innerHeight &&
97
+ rect.right <= window.innerWidth;
98
+ }`,
99
+ returnByValue: true,
100
+ }));
101
+ // 如果不在视口内,滚动到视口中
102
+ if (!isInViewport.value) {
103
+ await this.send('Runtime.callFunctionOn', {
104
+ objectId: object.objectId,
105
+ functionDeclaration: `function() {
106
+ this.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' });
107
+ }`,
108
+ });
109
+ // 等待滚动完成
110
+ await new Promise((resolve) => setTimeout(resolve, 100));
111
+ }
112
+ }
113
+ /**
114
+ * 等待元素可见
115
+ *
116
+ * 检查元素的 visibility 不为 hidden,且有非空边界框
117
+ */
118
+ async waitForVisible(nodeId) {
119
+ await withRetry(async () => {
120
+ const { object } = (await this.send('DOM.resolveNode', { nodeId }));
121
+ const { result } = (await this.send('Runtime.callFunctionOn', {
122
+ objectId: object.objectId,
123
+ functionDeclaration: `function() {
124
+ const style = window.getComputedStyle(this);
125
+ if (style.visibility === 'hidden') return false;
126
+ if (style.display === 'none') return false;
127
+ const rect = this.getBoundingClientRect();
128
+ return rect.width > 0 && rect.height > 0;
129
+ }`,
130
+ returnByValue: true,
131
+ }));
132
+ if (!result.value) {
133
+ throw new Error('元素不可见');
134
+ }
135
+ }, { timeout: this.timeout });
136
+ }
137
+ /**
138
+ * 执行点击前的所有等待检查
139
+ *
140
+ * 包括:enabled + stableBoundingBox + inViewport
141
+ */
142
+ async waitForClickable(nodeId) {
143
+ await this.waitForVisible(nodeId);
144
+ await this.waitForEnabled(nodeId);
145
+ await this.waitForStableBoundingBox(nodeId);
146
+ await this.ensureInViewport(nodeId);
147
+ }
148
+ /**
149
+ * 执行输入前的所有等待检查
150
+ *
151
+ * 包括:enabled + stableBoundingBox
152
+ */
153
+ async waitForInputReady(nodeId) {
154
+ await this.waitForVisible(nodeId);
155
+ await this.waitForEnabled(nodeId);
156
+ await this.waitForStableBoundingBox(nodeId);
157
+ }
158
+ /**
159
+ * 发送 CDP 命令
160
+ */
161
+ send(method, params) {
162
+ return this.cdp.send(method, params, this.sessionId);
163
+ }
164
+ }
165
+ //# sourceMappingURL=auto-wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-wait.js","sourceRoot":"","sources":["../../src/core/auto-wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * mcp-chrome 错误类型定义
3
+ *
4
+ * 设计原则:
5
+ * - 每个错误都有明确的 code(便于程序处理)
6
+ * - 每个错误都有 suggestion(便于用户理解如何修复)
7
+ * - 每个错误都有 context(便于调试)
8
+ * - 参考《代码整洁之道》§7.4:给出异常发生的环境说明
9
+ */
10
+ import type { Target } from './types.js';
11
+ /**
12
+ * 错误上下文
13
+ */
14
+ export interface ErrorContext {
15
+ [key: string]: unknown;
16
+ }
17
+ /**
18
+ * 浏览器错误基类
19
+ */
20
+ export declare abstract class BrowserError extends Error {
21
+ abstract readonly code: string;
22
+ abstract readonly suggestion: string;
23
+ readonly context: ErrorContext;
24
+ constructor(message: string);
25
+ /**
26
+ * 转换为 JSON 格式,用于 MCP 响应
27
+ */
28
+ toJSON(): object;
29
+ }
30
+ /**
31
+ * 连接被拒绝错误
32
+ */
33
+ export declare class ConnectionRefusedError extends BrowserError {
34
+ readonly code = "CONNECTION_REFUSED";
35
+ readonly suggestion: string;
36
+ readonly context: ErrorContext;
37
+ constructor(host: string, port: number);
38
+ }
39
+ /**
40
+ * 浏览器未找到错误
41
+ */
42
+ export declare class BrowserNotFoundError extends BrowserError {
43
+ readonly code = "BROWSER_NOT_FOUND";
44
+ readonly suggestion = "\u672A\u627E\u5230 Chrome \u6D4F\u89C8\u5668\u3002\u8BF7\u6307\u5B9A executablePath \u53C2\u6570\uFF1A\n browse(action=\"launch\", executablePath=\"/path/to/chrome\")";
45
+ constructor();
46
+ }
47
+ /**
48
+ * 会话不存在错误
49
+ */
50
+ export declare class SessionNotFoundError extends BrowserError {
51
+ readonly code = "SESSION_NOT_FOUND";
52
+ readonly suggestion = "\u8BF7\u5148\u4F7F\u7528 browse(action=\"launch\") \u6216 browse(action=\"connect\") \u8FDE\u63A5\u6D4F\u89C8\u5668";
53
+ constructor();
54
+ }
55
+ /**
56
+ * 页面/Target 不存在错误
57
+ */
58
+ export declare class TargetNotFoundError extends BrowserError {
59
+ readonly code = "TARGET_NOT_FOUND";
60
+ readonly suggestion = "\u8BF7\u4F7F\u7528 browse(action=\"list\") \u67E5\u770B\u53EF\u7528\u9875\u9762";
61
+ readonly context: ErrorContext;
62
+ constructor(targetId: string);
63
+ }
64
+ /**
65
+ * 元素未找到错误
66
+ */
67
+ export declare class ElementNotFoundError extends BrowserError {
68
+ readonly code = "ELEMENT_NOT_FOUND";
69
+ readonly suggestion: string;
70
+ readonly logs: string[];
71
+ readonly context: ErrorContext;
72
+ constructor(target: Target, timeout: number, logs?: string[], url?: string);
73
+ toJSON(): object;
74
+ }
75
+ /**
76
+ * 导航超时错误
77
+ */
78
+ export declare class NavigationTimeoutError extends BrowserError {
79
+ readonly code = "NAVIGATION_TIMEOUT";
80
+ readonly suggestion = "\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\uFF0C\u6216\u589E\u52A0\u8D85\u65F6\u65F6\u95F4";
81
+ readonly context: ErrorContext;
82
+ constructor(url: string, timeout: number);
83
+ }
84
+ /**
85
+ * 操作超时错误
86
+ */
87
+ export declare class TimeoutError extends BrowserError {
88
+ readonly code = "TIMEOUT";
89
+ readonly suggestion = "\u8BF7\u589E\u52A0\u8D85\u65F6\u65F6\u95F4\uFF0C\u6216\u68C0\u67E5\u64CD\u4F5C\u6761\u4EF6\u662F\u5426\u80FD\u6EE1\u8DB3";
90
+ constructor(message: string);
91
+ }
92
+ /**
93
+ * 无效参数错误
94
+ */
95
+ export declare class InvalidArgumentError extends BrowserError {
96
+ readonly code = "INVALID_ARGUMENT";
97
+ readonly suggestion: string;
98
+ constructor(message: string, suggestion?: string);
99
+ }
100
+ /**
101
+ * CDP 协议错误
102
+ */
103
+ export declare class CDPError extends BrowserError {
104
+ readonly code = "CDP_ERROR";
105
+ readonly suggestion = "\u8FD9\u662F\u4E00\u4E2A CDP \u534F\u8BAE\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u64CD\u4F5C\u662F\u5426\u6B63\u786E";
106
+ constructor(message: string);
107
+ }
108
+ /**
109
+ * 格式化日志记录(参考 Playwright Waiter)
110
+ */
111
+ export declare function formatLogRecording(logs: string[]): string;
112
+ /**
113
+ * 格式化错误为 MCP 工具响应
114
+ * 特别处理 ZodError,转换为结构化的 INVALID_ARGUMENT 错误
115
+ */
116
+ export declare function formatErrorResponse(error: unknown): {
117
+ content: Array<{
118
+ type: 'text';
119
+ text: string;
120
+ }>;
121
+ isError: boolean;
122
+ };
123
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,YAAY,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,8BAAsB,YAAa,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAK;gBAEvB,OAAO,EAAE,MAAM;IAK3B;;OAEG;IACH,MAAM,IAAI,MAAM;CAsBnB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACpD,QAAQ,CAAC,IAAI,wBAAuB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,SAAkB,OAAO,EAAE,YAAY,CAAA;gBAE3B,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAQzC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,uBAA4B;IACzC,QAAQ,CAAC,UAAU,6KACqC;;CAK3D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,uBAA4B;IACzC,QAAQ,CAAC,UAAU,yHACyD;;CAK/E;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,sBAA2B;IACxC,QAAQ,CAAC,UAAU,qFAAqC;IACxD,SAAkB,OAAO,EAAE,YAAY,CAAA;gBAE3B,QAAQ,EAAE,MAAM;CAI/B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,uBAAsB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;IACvB,SAAkB,OAAO,EAAE,YAAY,CAAA;gBAE3B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,GAAG,CAAC,EAAE,MAAM;IAUrE,MAAM,IAAI,MAAM;CAW5B;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACpD,QAAQ,CAAC,IAAI,wBAA6B;IAC1C,QAAQ,CAAC,UAAU,gGAAoB;IACvC,SAAkB,OAAO,EAAE,YAAY,CAAA;gBAE3B,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI3C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC1C,QAAQ,CAAC,IAAI,aAAkB;IAC/B,QAAQ,CAAC,UAAU,8HAAyB;gBAEhC,OAAO,EAAE,MAAM;CAG9B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,sBAAqB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAEf,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAInD;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,YAAY;IACtC,QAAQ,CAAC,IAAI,eAAoB;IACjC,QAAQ,CAAC,UAAU,uHAA4B;gBAEnC,OAAO,EAAE,MAAM;CAG9B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CASzD;AAyBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG;IACjD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;CACpB,CAiDA"}