@pyrokine/mcp-chrome 1.0.0 → 1.3.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/README.md +236 -96
- package/dist/anti-detection/behavior.d.ts +0 -8
- package/dist/anti-detection/behavior.d.ts.map +1 -1
- package/dist/anti-detection/behavior.js +0 -16
- package/dist/anti-detection/behavior.js.map +1 -1
- package/dist/cdp/client.d.ts +10 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +76 -61
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/launcher.d.ts +1 -8
- package/dist/cdp/launcher.d.ts.map +1 -1
- package/dist/cdp/launcher.js +18 -24
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts +8 -1
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js +15 -5
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/errors.d.ts +11 -13
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +50 -31
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/locator.d.ts +17 -6
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js +137 -28
- package/dist/core/locator.js.map +1 -1
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/core/retry.js +1 -1
- package/dist/core/retry.js.map +1 -1
- package/dist/core/session.d.ts +71 -16
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +365 -124
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +11 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +418 -0
- package/dist/core/unified-session.d.ts.map +1 -0
- package/dist/core/unified-session.js +1044 -0
- package/dist/core/unified-session.js.map +1 -0
- package/dist/extension/bridge.d.ts +203 -0
- package/dist/extension/bridge.d.ts.map +1 -0
- package/dist/extension/bridge.js +375 -0
- package/dist/extension/bridge.js.map +1 -0
- package/dist/extension/http-server.d.ts +60 -0
- package/dist/extension/http-server.d.ts.map +1 -0
- package/dist/extension/http-server.js +319 -0
- package/dist/extension/http-server.js.map +1 -0
- package/dist/extension/index.d.ts +7 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +6 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/native-host-installer.d.ts +21 -0
- package/dist/extension/native-host-installer.d.ts.map +1 -0
- package/dist/extension/native-host-installer.js +147 -0
- package/dist/extension/native-host-installer.js.map +1 -0
- package/dist/extension/socket-server.d.ts +32 -0
- package/dist/extension/socket-server.d.ts.map +1 -0
- package/dist/extension/socket-server.js +177 -0
- package/dist/extension/socket-server.js.map +1 -0
- package/dist/extension/ws-server.d.ts +40 -0
- package/dist/extension/ws-server.d.ts.map +1 -0
- package/dist/extension/ws-server.js +246 -0
- package/dist/extension/ws-server.js.map +1 -0
- package/dist/index.js +16 -67
- package/dist/index.js.map +1 -1
- package/dist/native-host/index.js +280 -0
- package/dist/native-host/mcp-chrome-host +2 -0
- package/dist/tools/browse.d.ts +3 -76
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +193 -237
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.d.ts +6 -66
- package/dist/tools/cookies.d.ts.map +1 -1
- package/dist/tools/cookies.js +129 -125
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/evaluate.d.ts +3 -37
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +68 -55
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts +3 -200
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +287 -238
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/index.d.ts +9 -9
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +9 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/input.d.ts +3 -228
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +190 -129
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +3 -47
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +100 -127
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/manage.d.ts +6 -51
- package/dist/tools/manage.d.ts.map +1 -1
- package/dist/tools/manage.js +284 -209
- package/dist/tools/manage.js.map +1 -1
- package/dist/tools/schema.d.ts +75 -168
- package/dist/tools/schema.d.ts.map +1 -1
- package/dist/tools/schema.js +276 -126
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/wait.d.ts +3 -191
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +298 -155
- package/dist/tools/wait.js.map +1 -1
- package/package.json +4 -5
- package/scripts/start-chrome-headless.sh +0 -37
- package/scripts/start-chrome.sh +0 -41
package/dist/tools/schema.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 公共
|
|
2
|
+
* 公共 Schema 定义
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Target Zod Schema 和定位参数转换
|
|
5
5
|
*/
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
/**
|
|
@@ -19,133 +19,283 @@ import { z } from 'zod';
|
|
|
19
19
|
* - xpath: XPath 定位
|
|
20
20
|
* - x/y: 坐标定位
|
|
21
21
|
*/
|
|
22
|
-
|
|
23
|
-
z.object({
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
z.object({
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
const targetObjectSchema = z.intersection(z.union([
|
|
23
|
+
z.object({
|
|
24
|
+
role: z.string().describe('ARIA role(如 button、link、textbox)'),
|
|
25
|
+
name: z.string().optional().describe('可访问名称(可选)'),
|
|
26
|
+
}),
|
|
27
|
+
// CSS+text 必须在纯 text / 纯 CSS 之前:z.object strip 未知字段
|
|
28
|
+
z.object({
|
|
29
|
+
css: z.string().describe('CSS 选择器'),
|
|
30
|
+
text: z.string().describe('文本内容'),
|
|
31
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
32
|
+
}),
|
|
33
|
+
z.object({
|
|
34
|
+
text: z.string().describe('文本内容'),
|
|
35
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
36
|
+
}),
|
|
37
|
+
z.object({
|
|
38
|
+
label: z.string().describe('label 文本'),
|
|
39
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
40
|
+
}),
|
|
41
|
+
z.object({
|
|
42
|
+
placeholder: z.string().describe('placeholder 文本'),
|
|
43
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
44
|
+
}),
|
|
45
|
+
z.object({
|
|
46
|
+
title: z.string().describe('title 属性值'),
|
|
47
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
48
|
+
}),
|
|
49
|
+
z.object({
|
|
50
|
+
alt: z.string().describe('alt 属性值'),
|
|
51
|
+
exact: z.boolean().optional().describe('是否精确匹配(默认 false)'),
|
|
52
|
+
}),
|
|
53
|
+
z.object({ testId: z.string().describe('data-testid 值') }),
|
|
54
|
+
z.object({ css: z.string().describe('CSS 选择器') }),
|
|
55
|
+
z.object({ xpath: z.string().describe('XPath 表达式') }),
|
|
56
|
+
z.object({
|
|
57
|
+
x: z.number().describe('X 坐标(像素)'),
|
|
58
|
+
y: z.number().describe('Y 坐标(像素)'),
|
|
59
|
+
}),
|
|
60
|
+
]), z.object({
|
|
61
|
+
nth: z.number().int().min(0).optional()
|
|
62
|
+
.describe('第 N 个匹配元素(从 0 开始,默认 0 即第一个)'),
|
|
63
|
+
}));
|
|
34
64
|
/**
|
|
35
|
-
* Target
|
|
65
|
+
* Target Zod Schema(运行时校验)
|
|
66
|
+
*
|
|
67
|
+
* 支持对象形式或 JSON 字符串形式(兼容某些客户端的序列化行为)
|
|
68
|
+
*/
|
|
69
|
+
export const targetZodSchema = z.preprocess((val) => {
|
|
70
|
+
// 如果是字符串,尝试解析为 JSON
|
|
71
|
+
if (typeof val === 'string') {
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(val);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return val;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return val;
|
|
80
|
+
}, targetObjectSchema);
|
|
81
|
+
/**
|
|
82
|
+
* 转义 CSS 属性选择器中的值(防止引号注入)
|
|
83
|
+
*/
|
|
84
|
+
function escapeAttrValue(value) {
|
|
85
|
+
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 转义 XPath 字符串字面量(处理包含引号的值)
|
|
89
|
+
*/
|
|
90
|
+
function escapeXPathString(str) {
|
|
91
|
+
if (!str.includes('\'')) {
|
|
92
|
+
return `'${str}'`;
|
|
93
|
+
}
|
|
94
|
+
if (!str.includes('"')) {
|
|
95
|
+
return `"${str}"`;
|
|
96
|
+
}
|
|
97
|
+
// 同时包含单双引号:用 concat 拼接
|
|
98
|
+
const parts = [];
|
|
99
|
+
let current = '';
|
|
100
|
+
for (const char of str) {
|
|
101
|
+
if (char === '\'') {
|
|
102
|
+
if (current) {
|
|
103
|
+
parts.push(`'${current}'`);
|
|
104
|
+
}
|
|
105
|
+
parts.push(`"'"`);
|
|
106
|
+
current = '';
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
current += char;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (current) {
|
|
113
|
+
parts.push(`'${current}'`);
|
|
114
|
+
}
|
|
115
|
+
return `concat(${parts.join(',')})`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 从 Target 中提取 exact 标志
|
|
119
|
+
*/
|
|
120
|
+
function getExact(target) {
|
|
121
|
+
return target.exact ?? false;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 隐式 ARIA role → HTML 标签/选择器 映射
|
|
36
125
|
*
|
|
37
|
-
*
|
|
126
|
+
* 浏览器为特定 HTML 元素自动赋予隐式 ARIA role(如 <button> → button),
|
|
127
|
+
* 仅匹配 [role="button"] 会遗漏这些元素。此映射补齐隐式匹配。
|
|
128
|
+
* 参考:https://www.w3.org/TR/html-aria/#docconformance
|
|
38
129
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
role: { type: 'string', description: 'ARIA role(如 button、link、textbox)' },
|
|
47
|
-
name: { type: 'string', description: '可访问名称(可选)' },
|
|
48
|
-
},
|
|
49
|
-
required: ['role'],
|
|
50
|
-
additionalProperties: false,
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
type: 'object',
|
|
54
|
-
title: '文本内容定位',
|
|
55
|
-
description: '通过元素文本内容定位',
|
|
56
|
-
properties: {
|
|
57
|
-
text: { type: 'string', description: '文本内容' },
|
|
58
|
-
exact: { type: 'boolean', description: '是否精确匹配(默认 false)' },
|
|
59
|
-
},
|
|
60
|
-
required: ['text'],
|
|
61
|
-
additionalProperties: false,
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
type: 'object',
|
|
65
|
-
title: 'Label 定位',
|
|
66
|
-
description: '通过表单 label 文本定位关联的输入元素',
|
|
67
|
-
properties: {
|
|
68
|
-
label: { type: 'string', description: 'label 文本' },
|
|
69
|
-
exact: { type: 'boolean', description: '是否精确匹配(默认 false)' },
|
|
70
|
-
},
|
|
71
|
-
required: ['label'],
|
|
72
|
-
additionalProperties: false,
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
type: 'object',
|
|
76
|
-
title: 'Placeholder 定位',
|
|
77
|
-
description: '通过输入框的 placeholder 属性定位',
|
|
78
|
-
properties: {
|
|
79
|
-
placeholder: { type: 'string', description: 'placeholder 文本' },
|
|
80
|
-
exact: { type: 'boolean', description: '是否精确匹配(默认 false)' },
|
|
81
|
-
},
|
|
82
|
-
required: ['placeholder'],
|
|
83
|
-
additionalProperties: false,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
type: 'object',
|
|
87
|
-
title: 'Title 属性定位',
|
|
88
|
-
description: '通过元素的 title 属性定位',
|
|
89
|
-
properties: {
|
|
90
|
-
title: { type: 'string', description: 'title 属性值' },
|
|
91
|
-
exact: { type: 'boolean', description: '是否精确匹配(默认 false)' },
|
|
92
|
-
},
|
|
93
|
-
required: ['title'],
|
|
94
|
-
additionalProperties: false,
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
type: 'object',
|
|
98
|
-
title: 'Alt 属性定位',
|
|
99
|
-
description: '通过图片的 alt 属性定位',
|
|
100
|
-
properties: {
|
|
101
|
-
alt: { type: 'string', description: 'alt 属性值' },
|
|
102
|
-
exact: { type: 'boolean', description: '是否精确匹配(默认 false)' },
|
|
103
|
-
},
|
|
104
|
-
required: ['alt'],
|
|
105
|
-
additionalProperties: false,
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
type: 'object',
|
|
109
|
-
title: 'TestId 定位',
|
|
110
|
-
description: '通过 data-testid 属性定位',
|
|
111
|
-
properties: {
|
|
112
|
-
testId: { type: 'string', description: 'data-testid 值' },
|
|
113
|
-
},
|
|
114
|
-
required: ['testId'],
|
|
115
|
-
additionalProperties: false,
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
type: 'object',
|
|
119
|
-
title: 'CSS 选择器定位',
|
|
120
|
-
description: '通过 CSS 选择器定位',
|
|
121
|
-
properties: {
|
|
122
|
-
css: { type: 'string', description: 'CSS 选择器' },
|
|
123
|
-
},
|
|
124
|
-
required: ['css'],
|
|
125
|
-
additionalProperties: false,
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
type: 'object',
|
|
129
|
-
title: 'XPath 定位',
|
|
130
|
-
description: '通过 XPath 表达式定位',
|
|
131
|
-
properties: {
|
|
132
|
-
xpath: { type: 'string', description: 'XPath 表达式' },
|
|
133
|
-
},
|
|
134
|
-
required: ['xpath'],
|
|
135
|
-
additionalProperties: false,
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
type: 'object',
|
|
139
|
-
title: '坐标定位',
|
|
140
|
-
description: '通过页面坐标定位',
|
|
141
|
-
properties: {
|
|
142
|
-
x: { type: 'number', description: 'X 坐标(像素)' },
|
|
143
|
-
y: { type: 'number', description: 'Y 坐标(像素)' },
|
|
144
|
-
},
|
|
145
|
-
required: ['x', 'y'],
|
|
146
|
-
additionalProperties: false,
|
|
147
|
-
},
|
|
130
|
+
const IMPLICIT_ROLE_SELECTORS = {
|
|
131
|
+
button: ['button', 'input[type="submit"]', 'input[type="button"]', 'input[type="reset"]', 'summary'],
|
|
132
|
+
link: ['a[href]', 'area[href]'],
|
|
133
|
+
textbox: [
|
|
134
|
+
'input:not([type])', 'input[type="text"]', 'input[type="email"]',
|
|
135
|
+
'input[type="url"]', 'input[type="tel"]', 'input[type="search"]',
|
|
136
|
+
'input[type="password"]', 'textarea', '[contenteditable="true"]',
|
|
148
137
|
],
|
|
149
|
-
|
|
138
|
+
checkbox: ['input[type="checkbox"]'],
|
|
139
|
+
radio: ['input[type="radio"]'],
|
|
140
|
+
combobox: ['select'],
|
|
141
|
+
heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
|
|
142
|
+
image: ['img[alt]'],
|
|
143
|
+
img: ['img[alt]'],
|
|
144
|
+
navigation: ['nav'],
|
|
145
|
+
main: ['main'],
|
|
146
|
+
banner: ['header'],
|
|
147
|
+
contentinfo: ['footer'],
|
|
148
|
+
region: ['section[aria-label]', 'section[aria-labelledby]'],
|
|
149
|
+
article: ['article'],
|
|
150
|
+
complementary: ['aside'],
|
|
151
|
+
form: ['form[aria-label]', 'form[aria-labelledby]'],
|
|
152
|
+
table: ['table'],
|
|
153
|
+
list: ['ul', 'ol', 'menu'],
|
|
154
|
+
listitem: ['li'],
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* 隐式 ARIA role → XPath self:: 条件映射
|
|
158
|
+
*
|
|
159
|
+
* 用于 role+name 组合定位:需要 xpath 表达多来源可访问名称过滤。
|
|
160
|
+
* 与 IMPLICIT_ROLE_SELECTORS 内容对应,只是语法不同。
|
|
161
|
+
*/
|
|
162
|
+
const IMPLICIT_ROLE_XPATH = {
|
|
163
|
+
button: 'self::button or self::input[@type="submit"] or self::input[@type="button"] or self::input[@type="reset"] or self::summary',
|
|
164
|
+
link: 'self::a[@href] or self::area[@href]',
|
|
165
|
+
textbox: 'self::input[not(@type)] or self::input[@type="text"] or self::input[@type="email"] or self::input[@type="url"] or self::input[@type="tel"] or self::input[@type="search"] or self::input[@type="password"] or self::textarea or self::*[@contenteditable="true"]',
|
|
166
|
+
checkbox: 'self::input[@type="checkbox"]',
|
|
167
|
+
radio: 'self::input[@type="radio"]',
|
|
168
|
+
combobox: 'self::select',
|
|
169
|
+
heading: 'self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6',
|
|
170
|
+
image: 'self::img[@alt]',
|
|
171
|
+
img: 'self::img[@alt]',
|
|
172
|
+
navigation: 'self::nav',
|
|
173
|
+
main: 'self::main',
|
|
174
|
+
banner: 'self::header',
|
|
175
|
+
contentinfo: 'self::footer',
|
|
176
|
+
region: 'self::section[@aria-label or @aria-labelledby]',
|
|
177
|
+
article: 'self::article',
|
|
178
|
+
complementary: 'self::aside',
|
|
179
|
+
form: 'self::form[@aria-label or @aria-labelledby]',
|
|
180
|
+
table: 'self::table',
|
|
181
|
+
list: 'self::ul or self::ol or self::menu',
|
|
182
|
+
listitem: 'self::li',
|
|
150
183
|
};
|
|
184
|
+
/**
|
|
185
|
+
* 将 Target 对象解析为 find() 所需的查询参数
|
|
186
|
+
*
|
|
187
|
+
* 统一处理各种定位方式到 {selector, text, xpath} 的映射,
|
|
188
|
+
* 避免在 extract/input/wait 中重复编写相同逻辑。
|
|
189
|
+
*
|
|
190
|
+
* exact 语义(默认 false):
|
|
191
|
+
* - CSS 属性(placeholder/title/alt):false → *= 子串匹配,true → = 精确匹配
|
|
192
|
+
* - text:false → Extension find 的 includes 子串匹配,true → xpath 精确匹配
|
|
193
|
+
* - label:xpath 同时匹配 aria-label、<label for> 关联、<label> 内嵌控件
|
|
194
|
+
* - role:无 name 时 CSS 匹配隐式+显式 role;有 name 时 xpath 匹配多来源可访问名称
|
|
195
|
+
* - testId/css/xpath:exact 不影响
|
|
196
|
+
* - role 值自动 lowercase(ARIA role 不区分大小写)
|
|
197
|
+
*/
|
|
198
|
+
export function targetToFindParams(target) {
|
|
199
|
+
let selector;
|
|
200
|
+
let text;
|
|
201
|
+
let xpath;
|
|
202
|
+
if ('css' in target && target.css) {
|
|
203
|
+
selector = target.css;
|
|
204
|
+
// CSS + 文本组合定位:先 CSS 筛选,再按 text 过滤
|
|
205
|
+
if ('text' in target && target.text) {
|
|
206
|
+
text = target.text;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if ('xpath' in target && target.xpath) {
|
|
210
|
+
xpath = target.xpath;
|
|
211
|
+
}
|
|
212
|
+
else if ('text' in target && target.text) {
|
|
213
|
+
if (getExact(target)) {
|
|
214
|
+
// 精确匹配:通过 xpath 匹配 textContent 完全相等的元素
|
|
215
|
+
xpath = `//*[normalize-space(.)=${escapeXPathString(target.text)}]`;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
text = target.text;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if ('role' in target && target.role) {
|
|
222
|
+
const roleLower = target.role.toLowerCase();
|
|
223
|
+
if ('name' in target && target.name) {
|
|
224
|
+
// role + name:xpath 同时匹配隐式/显式 role 和多来源可访问名称
|
|
225
|
+
const roleConditions = [`@role=${escapeXPathString(roleLower)}`];
|
|
226
|
+
const implicitXPath = IMPLICIT_ROLE_XPATH[roleLower];
|
|
227
|
+
if (implicitXPath) {
|
|
228
|
+
roleConditions.push(implicitXPath);
|
|
229
|
+
}
|
|
230
|
+
const nameStr = escapeXPathString(target.name);
|
|
231
|
+
// 多来源可访问名称:textContent, aria-label, title, placeholder, alt, value, label-for
|
|
232
|
+
// 注意:@value 读 HTML attribute(初始值),脚本动态写入的值需用 evaluate 定位
|
|
233
|
+
const nameConditions = [
|
|
234
|
+
`contains(.,${nameStr})`,
|
|
235
|
+
`contains(@aria-label,${nameStr})`,
|
|
236
|
+
`contains(@title,${nameStr})`,
|
|
237
|
+
`contains(@placeholder,${nameStr})`,
|
|
238
|
+
`contains(@alt,${nameStr})`,
|
|
239
|
+
`contains(@value,${nameStr})`,
|
|
240
|
+
`@id=//label[contains(.,${nameStr})]/@for`,
|
|
241
|
+
].join(' or ');
|
|
242
|
+
xpath = `//*[(${roleConditions.join(' or ')}) and (${nameConditions})]`;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// role only:CSS 选择器匹配隐式标签 + 显式 role
|
|
246
|
+
const escapedRole = escapeAttrValue(roleLower);
|
|
247
|
+
const selectors = [`[role="${escapedRole}"]`];
|
|
248
|
+
const implicit = IMPLICIT_ROLE_SELECTORS[roleLower];
|
|
249
|
+
if (implicit) {
|
|
250
|
+
selectors.push(...implicit);
|
|
251
|
+
}
|
|
252
|
+
selector = selectors.join(',');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if ('label' in target && target.label) {
|
|
256
|
+
// xpath 同时匹配 aria-label、<label for="id"> 关联、<label> 内嵌控件
|
|
257
|
+
const xpathStr = escapeXPathString(target.label);
|
|
258
|
+
const formControls = 'self::input or self::select or self::textarea';
|
|
259
|
+
if (getExact(target)) {
|
|
260
|
+
const labelMatch = `normalize-space(.)=${xpathStr}`;
|
|
261
|
+
xpath = `//*[@aria-label=${xpathStr}]`
|
|
262
|
+
+
|
|
263
|
+
` | //*[@id=//label[${labelMatch}]/@for]`
|
|
264
|
+
+
|
|
265
|
+
` | //label[${labelMatch}]/descendant::*[${formControls}]`
|
|
266
|
+
+
|
|
267
|
+
` | //label[${labelMatch}]/following-sibling::*[${formControls}][1]`
|
|
268
|
+
+
|
|
269
|
+
` | //label[${labelMatch}]/parent::*/following-sibling::*[1]/descendant::*[${formControls}]`;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const labelMatch = `contains(.,${xpathStr})`;
|
|
273
|
+
xpath = `//*[contains(@aria-label,${xpathStr})]`
|
|
274
|
+
+
|
|
275
|
+
` | //*[@id=//label[${labelMatch}]/@for]`
|
|
276
|
+
+
|
|
277
|
+
` | //label[${labelMatch}]/descendant::*[${formControls}]`
|
|
278
|
+
+
|
|
279
|
+
` | //label[${labelMatch}]/following-sibling::*[${formControls}][1]`
|
|
280
|
+
+
|
|
281
|
+
` | //label[${labelMatch}]/parent::*/following-sibling::*[1]/descendant::*[${formControls}]`;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if ('placeholder' in target && target.placeholder) {
|
|
285
|
+
const escaped = escapeAttrValue(target.placeholder);
|
|
286
|
+
selector = getExact(target) ? `[placeholder="${escaped}"]` : `[placeholder*="${escaped}"]`;
|
|
287
|
+
}
|
|
288
|
+
else if ('title' in target && target.title) {
|
|
289
|
+
const escaped = escapeAttrValue(target.title);
|
|
290
|
+
selector = getExact(target) ? `[title="${escaped}"]` : `[title*="${escaped}"]`;
|
|
291
|
+
}
|
|
292
|
+
else if ('alt' in target && target.alt) {
|
|
293
|
+
const escaped = escapeAttrValue(target.alt);
|
|
294
|
+
selector = getExact(target) ? `[alt="${escaped}"]` : `[alt*="${escaped}"]`;
|
|
295
|
+
}
|
|
296
|
+
else if ('testId' in target && target.testId) {
|
|
297
|
+
selector = `[data-testid="${escapeAttrValue(target.testId)}"]`;
|
|
298
|
+
}
|
|
299
|
+
return { selector, text, xpath, nth: target.nth };
|
|
300
|
+
}
|
|
151
301
|
//# sourceMappingURL=schema.js.map
|
package/dist/tools/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/wait.d.ts
CHANGED
|
@@ -7,197 +7,9 @@
|
|
|
7
7
|
* - time: 固定等待时间
|
|
8
8
|
* - idle: 等待网络空闲
|
|
9
9
|
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
11
|
/**
|
|
11
|
-
* wait
|
|
12
|
+
* 注册 wait 工具
|
|
12
13
|
*/
|
|
13
|
-
export declare
|
|
14
|
-
name: string;
|
|
15
|
-
description: string;
|
|
16
|
-
inputSchema: {
|
|
17
|
-
type: "object";
|
|
18
|
-
properties: {
|
|
19
|
-
for: {
|
|
20
|
-
type: string;
|
|
21
|
-
enum: string[];
|
|
22
|
-
description: string;
|
|
23
|
-
};
|
|
24
|
-
target: {
|
|
25
|
-
description: string;
|
|
26
|
-
oneOf: readonly [{
|
|
27
|
-
readonly type: "object";
|
|
28
|
-
readonly title: "可访问性树定位";
|
|
29
|
-
readonly description: "通过 ARIA role 和 name 定位元素";
|
|
30
|
-
readonly properties: {
|
|
31
|
-
readonly role: {
|
|
32
|
-
readonly type: "string";
|
|
33
|
-
readonly description: "ARIA role(如 button、link、textbox)";
|
|
34
|
-
};
|
|
35
|
-
readonly name: {
|
|
36
|
-
readonly type: "string";
|
|
37
|
-
readonly description: "可访问名称(可选)";
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
readonly required: readonly ["role"];
|
|
41
|
-
readonly additionalProperties: false;
|
|
42
|
-
}, {
|
|
43
|
-
readonly type: "object";
|
|
44
|
-
readonly title: "文本内容定位";
|
|
45
|
-
readonly description: "通过元素文本内容定位";
|
|
46
|
-
readonly properties: {
|
|
47
|
-
readonly text: {
|
|
48
|
-
readonly type: "string";
|
|
49
|
-
readonly description: "文本内容";
|
|
50
|
-
};
|
|
51
|
-
readonly exact: {
|
|
52
|
-
readonly type: "boolean";
|
|
53
|
-
readonly description: "是否精确匹配(默认 false)";
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
readonly required: readonly ["text"];
|
|
57
|
-
readonly additionalProperties: false;
|
|
58
|
-
}, {
|
|
59
|
-
readonly type: "object";
|
|
60
|
-
readonly title: "Label 定位";
|
|
61
|
-
readonly description: "通过表单 label 文本定位关联的输入元素";
|
|
62
|
-
readonly properties: {
|
|
63
|
-
readonly label: {
|
|
64
|
-
readonly type: "string";
|
|
65
|
-
readonly description: "label 文本";
|
|
66
|
-
};
|
|
67
|
-
readonly exact: {
|
|
68
|
-
readonly type: "boolean";
|
|
69
|
-
readonly description: "是否精确匹配(默认 false)";
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
readonly required: readonly ["label"];
|
|
73
|
-
readonly additionalProperties: false;
|
|
74
|
-
}, {
|
|
75
|
-
readonly type: "object";
|
|
76
|
-
readonly title: "Placeholder 定位";
|
|
77
|
-
readonly description: "通过输入框的 placeholder 属性定位";
|
|
78
|
-
readonly properties: {
|
|
79
|
-
readonly placeholder: {
|
|
80
|
-
readonly type: "string";
|
|
81
|
-
readonly description: "placeholder 文本";
|
|
82
|
-
};
|
|
83
|
-
readonly exact: {
|
|
84
|
-
readonly type: "boolean";
|
|
85
|
-
readonly description: "是否精确匹配(默认 false)";
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
readonly required: readonly ["placeholder"];
|
|
89
|
-
readonly additionalProperties: false;
|
|
90
|
-
}, {
|
|
91
|
-
readonly type: "object";
|
|
92
|
-
readonly title: "Title 属性定位";
|
|
93
|
-
readonly description: "通过元素的 title 属性定位";
|
|
94
|
-
readonly properties: {
|
|
95
|
-
readonly title: {
|
|
96
|
-
readonly type: "string";
|
|
97
|
-
readonly description: "title 属性值";
|
|
98
|
-
};
|
|
99
|
-
readonly exact: {
|
|
100
|
-
readonly type: "boolean";
|
|
101
|
-
readonly description: "是否精确匹配(默认 false)";
|
|
102
|
-
};
|
|
103
|
-
};
|
|
104
|
-
readonly required: readonly ["title"];
|
|
105
|
-
readonly additionalProperties: false;
|
|
106
|
-
}, {
|
|
107
|
-
readonly type: "object";
|
|
108
|
-
readonly title: "Alt 属性定位";
|
|
109
|
-
readonly description: "通过图片的 alt 属性定位";
|
|
110
|
-
readonly properties: {
|
|
111
|
-
readonly alt: {
|
|
112
|
-
readonly type: "string";
|
|
113
|
-
readonly description: "alt 属性值";
|
|
114
|
-
};
|
|
115
|
-
readonly exact: {
|
|
116
|
-
readonly type: "boolean";
|
|
117
|
-
readonly description: "是否精确匹配(默认 false)";
|
|
118
|
-
};
|
|
119
|
-
};
|
|
120
|
-
readonly required: readonly ["alt"];
|
|
121
|
-
readonly additionalProperties: false;
|
|
122
|
-
}, {
|
|
123
|
-
readonly type: "object";
|
|
124
|
-
readonly title: "TestId 定位";
|
|
125
|
-
readonly description: "通过 data-testid 属性定位";
|
|
126
|
-
readonly properties: {
|
|
127
|
-
readonly testId: {
|
|
128
|
-
readonly type: "string";
|
|
129
|
-
readonly description: "data-testid 值";
|
|
130
|
-
};
|
|
131
|
-
};
|
|
132
|
-
readonly required: readonly ["testId"];
|
|
133
|
-
readonly additionalProperties: false;
|
|
134
|
-
}, {
|
|
135
|
-
readonly type: "object";
|
|
136
|
-
readonly title: "CSS 选择器定位";
|
|
137
|
-
readonly description: "通过 CSS 选择器定位";
|
|
138
|
-
readonly properties: {
|
|
139
|
-
readonly css: {
|
|
140
|
-
readonly type: "string";
|
|
141
|
-
readonly description: "CSS 选择器";
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
readonly required: readonly ["css"];
|
|
145
|
-
readonly additionalProperties: false;
|
|
146
|
-
}, {
|
|
147
|
-
readonly type: "object";
|
|
148
|
-
readonly title: "XPath 定位";
|
|
149
|
-
readonly description: "通过 XPath 表达式定位";
|
|
150
|
-
readonly properties: {
|
|
151
|
-
readonly xpath: {
|
|
152
|
-
readonly type: "string";
|
|
153
|
-
readonly description: "XPath 表达式";
|
|
154
|
-
};
|
|
155
|
-
};
|
|
156
|
-
readonly required: readonly ["xpath"];
|
|
157
|
-
readonly additionalProperties: false;
|
|
158
|
-
}, {
|
|
159
|
-
readonly type: "object";
|
|
160
|
-
readonly title: "坐标定位";
|
|
161
|
-
readonly description: "通过页面坐标定位";
|
|
162
|
-
readonly properties: {
|
|
163
|
-
readonly x: {
|
|
164
|
-
readonly type: "number";
|
|
165
|
-
readonly description: "X 坐标(像素)";
|
|
166
|
-
};
|
|
167
|
-
readonly y: {
|
|
168
|
-
readonly type: "number";
|
|
169
|
-
readonly description: "Y 坐标(像素)";
|
|
170
|
-
};
|
|
171
|
-
};
|
|
172
|
-
readonly required: readonly ["x", "y"];
|
|
173
|
-
readonly additionalProperties: false;
|
|
174
|
-
}];
|
|
175
|
-
};
|
|
176
|
-
state: {
|
|
177
|
-
type: string;
|
|
178
|
-
enum: string[];
|
|
179
|
-
description: string;
|
|
180
|
-
};
|
|
181
|
-
ms: {
|
|
182
|
-
type: string;
|
|
183
|
-
description: string;
|
|
184
|
-
};
|
|
185
|
-
timeout: {
|
|
186
|
-
type: string;
|
|
187
|
-
description: string;
|
|
188
|
-
};
|
|
189
|
-
};
|
|
190
|
-
required: string[];
|
|
191
|
-
};
|
|
192
|
-
};
|
|
193
|
-
/**
|
|
194
|
-
* wait 工具处理器
|
|
195
|
-
*/
|
|
196
|
-
export declare function handleWait(params: unknown): Promise<{
|
|
197
|
-
content: Array<{
|
|
198
|
-
type: 'text';
|
|
199
|
-
text: string;
|
|
200
|
-
}>;
|
|
201
|
-
isError?: boolean;
|
|
202
|
-
}>;
|
|
14
|
+
export declare function registerWaitTool(server: McpServer): void;
|
|
203
15
|
//# sourceMappingURL=wait.d.ts.map
|
package/dist/tools/wait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAA;AAmbtE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAKxD"}
|