@coofly/agent-browser-mcp 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.
- package/.dockerignore +7 -0
- package/CLAUDE.md +82 -0
- package/Dockerfile +41 -0
- package/LICENSE +674 -0
- package/README.md +191 -0
- package/README_ZH.md +191 -0
- package/config.example.yaml +44 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +334 -0
- package/dist/server.js.map +1 -0
- package/dist/test-cli.d.ts +2 -0
- package/dist/test-cli.d.ts.map +1 -0
- package/dist/test-cli.js +22 -0
- package/dist/test-cli.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +17 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/advanced.d.ts +19 -0
- package/dist/tools/advanced.d.ts.map +1 -0
- package/dist/tools/advanced.js +40 -0
- package/dist/tools/advanced.js.map +1 -0
- package/dist/tools/information.d.ts +23 -0
- package/dist/tools/information.d.ts.map +1 -0
- package/dist/tools/information.js +41 -0
- package/dist/tools/information.js.map +1 -0
- package/dist/tools/interaction.d.ts +27 -0
- package/dist/tools/interaction.d.ts.map +1 -0
- package/dist/tools/interaction.js +49 -0
- package/dist/tools/interaction.js.map +1 -0
- package/dist/tools/navigation.d.ts +21 -0
- package/dist/tools/navigation.d.ts.map +1 -0
- package/dist/tools/navigation.js +37 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/storage.d.ts +16 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +28 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/utils/configLoader.d.ts +19 -0
- package/dist/utils/configLoader.d.ts.map +1 -0
- package/dist/utils/configLoader.js +163 -0
- package/dist/utils/configLoader.js.map +1 -0
- package/dist/utils/executor.d.ts +26 -0
- package/dist/utils/executor.d.ts.map +1 -0
- package/dist/utils/executor.js +71 -0
- package/dist/utils/executor.js.map +1 -0
- package/package.json +35 -0
- package/src/config.ts +60 -0
- package/src/index.ts +16 -0
- package/src/server.ts +388 -0
- package/src/test-cli.ts +27 -0
- package/src/test.ts +20 -0
- package/src/tools/advanced.ts +55 -0
- package/src/tools/information.ts +54 -0
- package/src/tools/interaction.ts +74 -0
- package/src/tools/navigation.ts +51 -0
- package/src/tools/storage.ts +36 -0
- package/src/utils/configLoader.ts +195 -0
- package/src/utils/executor.ts +100 -0
- package/tsconfig.json +18 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { createServer as createHttpServer } from 'http';
|
|
6
|
+
import { getConfig } from './utils/configLoader.js';
|
|
7
|
+
import * as navigation from './tools/navigation.js';
|
|
8
|
+
import * as interaction from './tools/interaction.js';
|
|
9
|
+
import * as information from './tools/information.js';
|
|
10
|
+
import * as advanced from './tools/advanced.js';
|
|
11
|
+
let globalOptions = {};
|
|
12
|
+
let appConfig = null;
|
|
13
|
+
const tools = [
|
|
14
|
+
// 导航工具
|
|
15
|
+
{
|
|
16
|
+
name: 'browser_open',
|
|
17
|
+
description: '打开指定 URL',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: { url: { type: 'string', description: '要打开的 URL' } },
|
|
21
|
+
required: ['url'],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'browser_back',
|
|
26
|
+
description: '浏览器后退',
|
|
27
|
+
inputSchema: { type: 'object', properties: {} },
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'browser_forward',
|
|
31
|
+
description: '浏览器前进',
|
|
32
|
+
inputSchema: { type: 'object', properties: {} },
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'browser_reload',
|
|
36
|
+
description: '刷新当前页面',
|
|
37
|
+
inputSchema: { type: 'object', properties: {} },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'browser_get_url',
|
|
41
|
+
description: '获取当前页面 URL',
|
|
42
|
+
inputSchema: { type: 'object', properties: {} },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'browser_get_title',
|
|
46
|
+
description: '获取当前页面标题',
|
|
47
|
+
inputSchema: { type: 'object', properties: {} },
|
|
48
|
+
},
|
|
49
|
+
// 交互工具
|
|
50
|
+
{
|
|
51
|
+
name: 'browser_click',
|
|
52
|
+
description: '点击元素',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
selector: { type: 'string', description: '元素选择器或 ref' },
|
|
57
|
+
button: { type: 'string', enum: ['left', 'right', 'middle'] },
|
|
58
|
+
},
|
|
59
|
+
required: ['selector'],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'browser_type',
|
|
64
|
+
description: '在元素中输入文本(逐字符)',
|
|
65
|
+
inputSchema: {
|
|
66
|
+
type: 'object',
|
|
67
|
+
properties: {
|
|
68
|
+
selector: { type: 'string', description: '元素选择器' },
|
|
69
|
+
text: { type: 'string', description: '要输入的文本' },
|
|
70
|
+
},
|
|
71
|
+
required: ['selector', 'text'],
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'browser_fill',
|
|
76
|
+
description: '填充输入框(直接设置值)',
|
|
77
|
+
inputSchema: {
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
selector: { type: 'string', description: '元素选择器' },
|
|
81
|
+
text: { type: 'string', description: '要填充的文本' },
|
|
82
|
+
},
|
|
83
|
+
required: ['selector', 'text'],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'browser_hover',
|
|
88
|
+
description: '悬停在元素上',
|
|
89
|
+
inputSchema: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
properties: { selector: { type: 'string' } },
|
|
92
|
+
required: ['selector'],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'browser_press',
|
|
97
|
+
description: '按下键盘按键',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: { key: { type: 'string', description: '按键名称' } },
|
|
101
|
+
required: ['key'],
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'browser_select',
|
|
106
|
+
description: '选择下拉选项',
|
|
107
|
+
inputSchema: {
|
|
108
|
+
type: 'object',
|
|
109
|
+
properties: {
|
|
110
|
+
selector: { type: 'string' },
|
|
111
|
+
value: { type: 'string' },
|
|
112
|
+
},
|
|
113
|
+
required: ['selector', 'value'],
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
// 信息获取工具
|
|
117
|
+
{
|
|
118
|
+
name: 'browser_snapshot',
|
|
119
|
+
description: '获取页面快照(可访问性树,最适合 AI)',
|
|
120
|
+
inputSchema: { type: 'object', properties: {} },
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'browser_get_text',
|
|
124
|
+
description: '获取元素文本内容',
|
|
125
|
+
inputSchema: {
|
|
126
|
+
type: 'object',
|
|
127
|
+
properties: { selector: { type: 'string' } },
|
|
128
|
+
required: ['selector'],
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'browser_get_html',
|
|
133
|
+
description: '获取元素 HTML',
|
|
134
|
+
inputSchema: {
|
|
135
|
+
type: 'object',
|
|
136
|
+
properties: { selector: { type: 'string' } },
|
|
137
|
+
required: ['selector'],
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'browser_screenshot',
|
|
142
|
+
description: '截取页面截图',
|
|
143
|
+
inputSchema: {
|
|
144
|
+
type: 'object',
|
|
145
|
+
properties: {
|
|
146
|
+
path: { type: 'string', description: '保存路径' },
|
|
147
|
+
fullPage: { type: 'boolean' },
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'browser_scroll',
|
|
153
|
+
description: '滚动页面',
|
|
154
|
+
inputSchema: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: {
|
|
157
|
+
direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },
|
|
158
|
+
amount: { type: 'number' },
|
|
159
|
+
},
|
|
160
|
+
required: ['direction'],
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
/**
|
|
165
|
+
* 处理工具调用
|
|
166
|
+
*/
|
|
167
|
+
async function handleToolCall(name, args) {
|
|
168
|
+
// 合并全局选项和 CDP 配置
|
|
169
|
+
const opts = { ...globalOptions };
|
|
170
|
+
if (appConfig?.cdp.enabled && appConfig.cdp.endpoint) {
|
|
171
|
+
opts.cdp = appConfig.cdp.endpoint;
|
|
172
|
+
}
|
|
173
|
+
switch (name) {
|
|
174
|
+
// 导航
|
|
175
|
+
case 'browser_open':
|
|
176
|
+
return JSON.stringify(await navigation.open(args.url, opts));
|
|
177
|
+
case 'browser_back':
|
|
178
|
+
return JSON.stringify(await navigation.back(opts));
|
|
179
|
+
case 'browser_forward':
|
|
180
|
+
return JSON.stringify(await navigation.forward(opts));
|
|
181
|
+
case 'browser_reload':
|
|
182
|
+
return JSON.stringify(await navigation.reload(opts));
|
|
183
|
+
case 'browser_get_url':
|
|
184
|
+
return JSON.stringify(await navigation.getUrl(opts));
|
|
185
|
+
case 'browser_get_title':
|
|
186
|
+
return JSON.stringify(await navigation.getTitle(opts));
|
|
187
|
+
// 交互
|
|
188
|
+
case 'browser_click':
|
|
189
|
+
return JSON.stringify(await interaction.click(args.selector, opts));
|
|
190
|
+
case 'browser_type':
|
|
191
|
+
return JSON.stringify(await interaction.type(args.selector, args.text, opts));
|
|
192
|
+
case 'browser_fill':
|
|
193
|
+
return JSON.stringify(await interaction.fill(args.selector, args.text, opts));
|
|
194
|
+
case 'browser_hover':
|
|
195
|
+
return JSON.stringify(await interaction.hover(args.selector, opts));
|
|
196
|
+
case 'browser_press':
|
|
197
|
+
return JSON.stringify(await interaction.press(args.key, opts));
|
|
198
|
+
case 'browser_select':
|
|
199
|
+
return JSON.stringify(await interaction.select(args.selector, args.value, opts));
|
|
200
|
+
// 信息获取
|
|
201
|
+
case 'browser_snapshot':
|
|
202
|
+
return JSON.stringify(await information.snapshot(opts));
|
|
203
|
+
case 'browser_get_text':
|
|
204
|
+
return JSON.stringify(await information.getText(args.selector, opts));
|
|
205
|
+
case 'browser_get_html':
|
|
206
|
+
return JSON.stringify(await information.getHtml(args.selector, opts));
|
|
207
|
+
// 高级功能
|
|
208
|
+
case 'browser_screenshot':
|
|
209
|
+
return JSON.stringify(await advanced.screenshot(args.path, opts));
|
|
210
|
+
case 'browser_scroll':
|
|
211
|
+
return JSON.stringify(await advanced.scroll(args.direction, args.amount, opts));
|
|
212
|
+
default:
|
|
213
|
+
return JSON.stringify({ success: false, error: `未知工具: ${name}` });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 创建并启动 MCP 服务器
|
|
218
|
+
*/
|
|
219
|
+
export async function createServer() {
|
|
220
|
+
const server = new Server({ name: 'agent-browser-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
221
|
+
// 列出工具
|
|
222
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
223
|
+
return { tools };
|
|
224
|
+
});
|
|
225
|
+
// 调用工具
|
|
226
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
227
|
+
const { name, arguments: args } = request.params;
|
|
228
|
+
try {
|
|
229
|
+
const result = await handleToolCall(name, args || {});
|
|
230
|
+
return { content: [{ type: 'text', text: result }] };
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
234
|
+
return { content: [{ type: 'text', text: JSON.stringify({ success: false, error: msg }) }] };
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
return server;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 启动服务器
|
|
241
|
+
*/
|
|
242
|
+
export async function startServer() {
|
|
243
|
+
appConfig = getConfig();
|
|
244
|
+
// 如果启用了 CDP,设置到全局选项
|
|
245
|
+
if (appConfig.cdp.enabled && appConfig.cdp.endpoint) {
|
|
246
|
+
globalOptions.cdp = appConfig.cdp.endpoint;
|
|
247
|
+
console.error(`[CDP] 已启用远程连接: ${appConfig.cdp.endpoint}`);
|
|
248
|
+
}
|
|
249
|
+
const server = await createServer();
|
|
250
|
+
if (appConfig.server.transport === 'sse') {
|
|
251
|
+
await startSseServer(server, appConfig);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
await startStdioServer(server);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 启动 Stdio 模式服务器
|
|
259
|
+
*/
|
|
260
|
+
async function startStdioServer(server) {
|
|
261
|
+
console.error('[服务器] 以 Stdio 模式启动');
|
|
262
|
+
const transport = new StdioServerTransport();
|
|
263
|
+
await server.connect(transport);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 启动 SSE 模式服务器
|
|
267
|
+
*/
|
|
268
|
+
async function startSseServer(server, config) {
|
|
269
|
+
const { port, host } = config.server;
|
|
270
|
+
// 存储活跃的 SSE 传输连接
|
|
271
|
+
const transports = new Map();
|
|
272
|
+
const httpServer = createHttpServer(async (req, res) => {
|
|
273
|
+
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
274
|
+
// 设置 CORS 头
|
|
275
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
276
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
277
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
278
|
+
if (req.method === 'OPTIONS') {
|
|
279
|
+
res.writeHead(200);
|
|
280
|
+
res.end();
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
// SSE 端点
|
|
284
|
+
if (url.pathname === '/sse' && req.method === 'GET') {
|
|
285
|
+
const transport = new SSEServerTransport('/messages', res);
|
|
286
|
+
const sessionId = crypto.randomUUID();
|
|
287
|
+
transports.set(sessionId, transport);
|
|
288
|
+
console.error(`[SSE] 新连接: ${sessionId}`);
|
|
289
|
+
res.on('close', () => {
|
|
290
|
+
transports.delete(sessionId);
|
|
291
|
+
console.error(`[SSE] 连接关闭: ${sessionId}`);
|
|
292
|
+
});
|
|
293
|
+
await server.connect(transport);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// 消息端点
|
|
297
|
+
if (url.pathname === '/messages' && req.method === 'POST') {
|
|
298
|
+
const sessionId = url.searchParams.get('sessionId');
|
|
299
|
+
if (!sessionId) {
|
|
300
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
301
|
+
res.end(JSON.stringify({ error: '缺少 sessionId 参数' }));
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const transport = transports.get(sessionId);
|
|
305
|
+
if (!transport) {
|
|
306
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
307
|
+
res.end(JSON.stringify({ error: '会话不存在' }));
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
await transport.handlePostMessage(req, res);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
// 健康检查端点
|
|
314
|
+
if (url.pathname === '/health') {
|
|
315
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
316
|
+
res.end(JSON.stringify({
|
|
317
|
+
status: 'ok',
|
|
318
|
+
transport: 'sse',
|
|
319
|
+
connections: transports.size
|
|
320
|
+
}));
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
// 404
|
|
324
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
325
|
+
res.end(JSON.stringify({ error: 'Not Found' }));
|
|
326
|
+
});
|
|
327
|
+
httpServer.listen(port, host, () => {
|
|
328
|
+
console.error(`[服务器] SSE 模式已启动`);
|
|
329
|
+
console.error(`[服务器] 监听地址: http://${host}:${port}`);
|
|
330
|
+
console.error(`[服务器] SSE 端点: http://${host}:${port}/sse`);
|
|
331
|
+
console.error(`[服务器] 健康检查: http://${host}:${port}/health`);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-cli.d.ts","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":""}
|
package/dist/test-cli.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { executeCommand } from './utils/executor.js';
|
|
2
|
+
async function test() {
|
|
3
|
+
console.log('测试 agent-browser CLI 命令执行...\n');
|
|
4
|
+
// 测试打开页面
|
|
5
|
+
console.log('1. 测试打开百度...');
|
|
6
|
+
const openResult = await executeCommand(['open', 'https://www.baidu.com']);
|
|
7
|
+
console.log('结果:', openResult);
|
|
8
|
+
// 测试获取标题
|
|
9
|
+
console.log('\n2. 测试获取页面标题...');
|
|
10
|
+
const titleResult = await executeCommand(['get', 'title']);
|
|
11
|
+
console.log('结果:', titleResult);
|
|
12
|
+
// 测试获取快照
|
|
13
|
+
console.log('\n3. 测试获取页面快照...');
|
|
14
|
+
const snapshotResult = await executeCommand(['snapshot']);
|
|
15
|
+
console.log('结果:', snapshotResult.success ? '成功' : snapshotResult.error);
|
|
16
|
+
if (snapshotResult.success) {
|
|
17
|
+
console.log('快照长度:', snapshotResult.output.length, '字符');
|
|
18
|
+
}
|
|
19
|
+
console.log('\n测试完成!');
|
|
20
|
+
}
|
|
21
|
+
test().catch(console.error);
|
|
22
|
+
//# sourceMappingURL=test-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-cli.js","sourceRoot":"","sources":["../src/test-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAE/B,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEhC,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzE,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createServer } from './server.js';
|
|
2
|
+
async function test() {
|
|
3
|
+
console.log('创建 MCP 服务器...');
|
|
4
|
+
const server = await createServer();
|
|
5
|
+
console.log('服务器创建成功');
|
|
6
|
+
// 测试列出工具
|
|
7
|
+
console.log('\n测试列出工具...');
|
|
8
|
+
const toolsHandler = server._requestHandlers?.get('tools/list');
|
|
9
|
+
if (toolsHandler) {
|
|
10
|
+
const result = await toolsHandler({});
|
|
11
|
+
console.log(`找到 ${result.tools.length} 个工具:`);
|
|
12
|
+
result.tools.forEach((t) => console.log(` - ${t.name}: ${t.description}`));
|
|
13
|
+
}
|
|
14
|
+
console.log('\n测试完成!');
|
|
15
|
+
}
|
|
16
|
+
test().catch(console.error);
|
|
17
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEvB,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAI,MAAc,CAAC,gBAAgB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ExecuteOptions } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 高级功能工具
|
|
4
|
+
*/
|
|
5
|
+
/** 截图 */
|
|
6
|
+
export declare function screenshot(path?: string, options?: ExecuteOptions & {
|
|
7
|
+
fullPage?: boolean;
|
|
8
|
+
}): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
9
|
+
/** 滚动页面 */
|
|
10
|
+
export declare function scroll(direction: 'up' | 'down' | 'left' | 'right', amount?: number, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
11
|
+
/** 滚动到元素 */
|
|
12
|
+
export declare function scrollTo(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
13
|
+
/** 等待元素出现 */
|
|
14
|
+
export declare function waitFor(selector: string, options?: ExecuteOptions & {
|
|
15
|
+
state?: 'visible' | 'hidden' | 'attached';
|
|
16
|
+
}): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
17
|
+
/** 执行 JavaScript */
|
|
18
|
+
export declare function evaluate(script: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
19
|
+
//# sourceMappingURL=advanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../src/tools/advanced.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AAEH,SAAS;AACT,wBAAsB,UAAU,CAC9B,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,yDAUlD;AAED,WAAW;AACX,wBAAsB,MAAM,CAC1B,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAC3C,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,yDAOzB;AAED,YAAY;AACZ,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAExE;AAED,aAAa;AACb,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;CAAE,yDAOzE;AAED,oBAAoB;AACpB,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { executeCommand } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 高级功能工具
|
|
4
|
+
*/
|
|
5
|
+
/** 截图 */
|
|
6
|
+
export async function screenshot(path, options) {
|
|
7
|
+
const args = ['screenshot'];
|
|
8
|
+
if (path) {
|
|
9
|
+
args.push(path);
|
|
10
|
+
}
|
|
11
|
+
if (options?.fullPage) {
|
|
12
|
+
args.push('--full-page');
|
|
13
|
+
}
|
|
14
|
+
return executeCommand(args, options);
|
|
15
|
+
}
|
|
16
|
+
/** 滚动页面 */
|
|
17
|
+
export async function scroll(direction, amount, options) {
|
|
18
|
+
const args = ['scroll', direction];
|
|
19
|
+
if (amount !== undefined) {
|
|
20
|
+
args.push(String(amount));
|
|
21
|
+
}
|
|
22
|
+
return executeCommand(args, options);
|
|
23
|
+
}
|
|
24
|
+
/** 滚动到元素 */
|
|
25
|
+
export async function scrollTo(selector, options) {
|
|
26
|
+
return executeCommand(['scroll', 'to', selector], options);
|
|
27
|
+
}
|
|
28
|
+
/** 等待元素出现 */
|
|
29
|
+
export async function waitFor(selector, options) {
|
|
30
|
+
const args = ['wait', 'for', selector];
|
|
31
|
+
if (options?.state) {
|
|
32
|
+
args.push('--state', options.state);
|
|
33
|
+
}
|
|
34
|
+
return executeCommand(args, options);
|
|
35
|
+
}
|
|
36
|
+
/** 执行 JavaScript */
|
|
37
|
+
export async function evaluate(script, options) {
|
|
38
|
+
return executeCommand(['eval', script], options);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=advanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.js","sourceRoot":"","sources":["../../src/tools/advanced.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AAEH,SAAS;AACT,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAa,EACb,OAAiD;IAEjD,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,WAAW;AACX,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAA2C,EAC3C,MAAe,EACf,OAAwB;IAExB,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,YAAY;AACZ,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,OAAwB;IACvE,OAAO,cAAc,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAAwE;IAExE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,OAAwB;IACrE,OAAO,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ExecuteOptions } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 信息获取相关工具
|
|
4
|
+
*/
|
|
5
|
+
/** 获取页面快照(可访问性树) */
|
|
6
|
+
export declare function snapshot(options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
7
|
+
/** 获取元素文本 */
|
|
8
|
+
export declare function getText(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
9
|
+
/** 获取元素 HTML */
|
|
10
|
+
export declare function getHtml(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
11
|
+
/** 获取输入框的值 */
|
|
12
|
+
export declare function getValue(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
13
|
+
/** 获取元素属性 */
|
|
14
|
+
export declare function getAttribute(selector: string, attribute: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
15
|
+
/** 获取元素数量 */
|
|
16
|
+
export declare function count(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
17
|
+
/** 检查元素是否可见 */
|
|
18
|
+
export declare function isVisible(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
19
|
+
/** 检查元素是否启用 */
|
|
20
|
+
export declare function isEnabled(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
21
|
+
/** 检查复选框是否选中 */
|
|
22
|
+
export declare function isChecked(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
23
|
+
//# sourceMappingURL=information.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"information.d.ts","sourceRoot":"","sources":["../../src/tools/information.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AAEH,oBAAoB;AACpB,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,yDAEtD;AAED,aAAa;AACb,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEvE;AAED,gBAAgB;AAChB,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEvE;AAED,cAAc;AACd,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAExE;AAED,aAAa;AACb,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,cAAc,yDAGzB;AAED,aAAa;AACb,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAErE;AAED,eAAe;AACf,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEzE;AAED,eAAe;AACf,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEzE;AAED,gBAAgB;AAChB,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEzE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { executeCommand } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 信息获取相关工具
|
|
4
|
+
*/
|
|
5
|
+
/** 获取页面快照(可访问性树) */
|
|
6
|
+
export async function snapshot(options) {
|
|
7
|
+
return executeCommand(['snapshot'], options);
|
|
8
|
+
}
|
|
9
|
+
/** 获取元素文本 */
|
|
10
|
+
export async function getText(selector, options) {
|
|
11
|
+
return executeCommand(['get', 'text', selector], options);
|
|
12
|
+
}
|
|
13
|
+
/** 获取元素 HTML */
|
|
14
|
+
export async function getHtml(selector, options) {
|
|
15
|
+
return executeCommand(['get', 'html', selector], options);
|
|
16
|
+
}
|
|
17
|
+
/** 获取输入框的值 */
|
|
18
|
+
export async function getValue(selector, options) {
|
|
19
|
+
return executeCommand(['get', 'value', selector], options);
|
|
20
|
+
}
|
|
21
|
+
/** 获取元素属性 */
|
|
22
|
+
export async function getAttribute(selector, attribute, options) {
|
|
23
|
+
return executeCommand(['get', 'attr', selector, attribute], options);
|
|
24
|
+
}
|
|
25
|
+
/** 获取元素数量 */
|
|
26
|
+
export async function count(selector, options) {
|
|
27
|
+
return executeCommand(['count', selector], options);
|
|
28
|
+
}
|
|
29
|
+
/** 检查元素是否可见 */
|
|
30
|
+
export async function isVisible(selector, options) {
|
|
31
|
+
return executeCommand(['visible', selector], options);
|
|
32
|
+
}
|
|
33
|
+
/** 检查元素是否启用 */
|
|
34
|
+
export async function isEnabled(selector, options) {
|
|
35
|
+
return executeCommand(['enabled', selector], options);
|
|
36
|
+
}
|
|
37
|
+
/** 检查复选框是否选中 */
|
|
38
|
+
export async function isChecked(selector, options) {
|
|
39
|
+
return executeCommand(['checked', selector], options);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=information.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"information.js","sourceRoot":"","sources":["../../src/tools/information.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AAEH,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,OAAO,cAAc,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,OAAwB;IACtE,OAAO,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,OAAwB;IACtE,OAAO,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,cAAc;AACd,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,OAAwB;IACvE,OAAO,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,SAAiB,EACjB,OAAwB;IAExB,OAAO,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAgB,EAAE,OAAwB;IACpE,OAAO,cAAc,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,eAAe;AACf,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAwB;IACxE,OAAO,cAAc,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,eAAe;AACf,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAwB;IACxE,OAAO,cAAc,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAwB;IACxE,OAAO,cAAc,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ExecuteOptions } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 交互相关工具
|
|
4
|
+
*/
|
|
5
|
+
/** 点击元素 */
|
|
6
|
+
export declare function click(selector: string, options?: ExecuteOptions & {
|
|
7
|
+
button?: 'left' | 'right' | 'middle';
|
|
8
|
+
}): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
9
|
+
/** 双击元素 */
|
|
10
|
+
export declare function dblclick(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
11
|
+
/** 悬停在元素上 */
|
|
12
|
+
export declare function hover(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
13
|
+
/** 输入文本(逐字符) */
|
|
14
|
+
export declare function type(selector: string, text: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
15
|
+
/** 填充文本(直接设置值) */
|
|
16
|
+
export declare function fill(selector: string, text: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
17
|
+
/** 清空输入框 */
|
|
18
|
+
export declare function clear(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
19
|
+
/** 按键 */
|
|
20
|
+
export declare function press(key: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
21
|
+
/** 选择下拉选项 */
|
|
22
|
+
export declare function select(selector: string, value: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
23
|
+
/** 勾选复选框 */
|
|
24
|
+
export declare function check(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
25
|
+
/** 取消勾选复选框 */
|
|
26
|
+
export declare function uncheck(selector: string, options?: ExecuteOptions): Promise<import("../utils/executor.js").ExecuteResult>;
|
|
27
|
+
//# sourceMappingURL=interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../src/tools/interaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AAEH,WAAW;AACX,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;CAAE,yDAOpE;AAED,WAAW;AACX,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAExE;AAED,aAAa;AACb,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAErE;AAED,gBAAgB;AAChB,wBAAsB,IAAI,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,yDAGzB;AAED,kBAAkB;AAClB,wBAAsB,IAAI,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,yDAGzB;AAED,YAAY;AACZ,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAErE;AAED,SAAS;AACT,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEhE;AAED,aAAa;AACb,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,yDAGzB;AAED,YAAY;AACZ,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAErE;AAED,cAAc;AACd,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,yDAEvE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { executeCommand } from '../utils/executor.js';
|
|
2
|
+
/**
|
|
3
|
+
* 交互相关工具
|
|
4
|
+
*/
|
|
5
|
+
/** 点击元素 */
|
|
6
|
+
export async function click(selector, options) {
|
|
7
|
+
const args = ['click', selector];
|
|
8
|
+
if (options?.button) {
|
|
9
|
+
args.push('--button', options.button);
|
|
10
|
+
}
|
|
11
|
+
return executeCommand(args, options);
|
|
12
|
+
}
|
|
13
|
+
/** 双击元素 */
|
|
14
|
+
export async function dblclick(selector, options) {
|
|
15
|
+
return executeCommand(['dblclick', selector], options);
|
|
16
|
+
}
|
|
17
|
+
/** 悬停在元素上 */
|
|
18
|
+
export async function hover(selector, options) {
|
|
19
|
+
return executeCommand(['hover', selector], options);
|
|
20
|
+
}
|
|
21
|
+
/** 输入文本(逐字符) */
|
|
22
|
+
export async function type(selector, text, options) {
|
|
23
|
+
return executeCommand(['type', selector, text], options);
|
|
24
|
+
}
|
|
25
|
+
/** 填充文本(直接设置值) */
|
|
26
|
+
export async function fill(selector, text, options) {
|
|
27
|
+
return executeCommand(['fill', selector, text], options);
|
|
28
|
+
}
|
|
29
|
+
/** 清空输入框 */
|
|
30
|
+
export async function clear(selector, options) {
|
|
31
|
+
return executeCommand(['clear', selector], options);
|
|
32
|
+
}
|
|
33
|
+
/** 按键 */
|
|
34
|
+
export async function press(key, options) {
|
|
35
|
+
return executeCommand(['press', key], options);
|
|
36
|
+
}
|
|
37
|
+
/** 选择下拉选项 */
|
|
38
|
+
export async function select(selector, value, options) {
|
|
39
|
+
return executeCommand(['select', selector, value], options);
|
|
40
|
+
}
|
|
41
|
+
/** 勾选复选框 */
|
|
42
|
+
export async function check(selector, options) {
|
|
43
|
+
return executeCommand(['check', selector], options);
|
|
44
|
+
}
|
|
45
|
+
/** 取消勾选复选框 */
|
|
46
|
+
export async function uncheck(selector, options) {
|
|
47
|
+
return executeCommand(['uncheck', selector], options);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=interaction.js.map
|