ms-vite-plugin 1.4.40 → 1.4.43

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.
@@ -1,364 +1,325 @@
1
1
  # 节点模块
2
2
 
3
- 节点模块提供了强大的 UI 元素访问和操作功能,可以通过各种条件选择和操作界面元素。
3
+ 用于查找和操作当前界面上的控件节点。
4
4
 
5
- **注意事项**
5
+ **注意**
6
6
 
7
- - 此模块仅支持 快点 Agent 模式使用
8
- - 节点用完需要调用 `释放内存` 方法释放内存,找完节点就能释放,不需要点击后释放
7
+ - 仅支持快点 Agent 模式
8
+ - 用完调用 `释放内存()`;找完节点即可释放,不必等点击结束
9
9
 
10
- ## 节点选择器 ($节点选择器)
10
+ **基本流程**
11
11
 
12
- 节点选择器是访问 UI 元素的核心工具,提供了灵活的筛选和查找机制。
13
-
14
- ### 创建节点选择器
12
+ ```text
13
+ $创建节点选择器 → 设置筛选条件 → 获取一个节点信息 / 获取节点信息
14
+ 点击 / 输入 / 设值等 → 释放内存
15
+ ```
15
16
 
16
- #### $创建节点选择器
17
+ ---
17
18
 
18
- 创建一个新的节点选择器实例。
19
+ ## 创建选择器
19
20
 
20
21
  ```typescript
21
22
  function $创建节点选择器(params?: {
22
- /**
23
- * 代表要获取节点的层级,越少速度越快,默认 50
24
- */
25
- maxDepth?: 数字;
26
- /**
27
- * 抓取模式:模式 1、模式 2、模式 3,默认模式 1
28
- */
29
- mode?: 数字;
23
+ maxDepth?: 数字; // 最大层级,默认 50;越小通常越快
24
+ mode?: 数字; // 抓取模式 1 | 2 | 3,默认 1
30
25
  }): $节点选择器;
31
26
  ```
32
27
 
33
- **参数说明:**
34
-
35
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
36
- | ---------- | ---- | -------- | ------ | --------------------------- |
37
- | `maxDepth` | 数字 | 否 | 50 | 遍历的最大层级深度,默认 50 |
38
- | `mode` | 数字 | 否 | 1 | 抓取模式。支持模式 1、模式 2、模式 3,默认模式 1 |
39
-
40
- **返回值:**
41
-
42
- | 类型 | 描述 |
43
- | ------------- | ---------------------- |
44
- | `$节点选择器` | 新创建的节点选择器实例 |
45
-
46
- **示例:**
28
+ | 参数 | 默认 | 说明 |
29
+ | --- | --- | --- |
30
+ | `maxDepth` | `50` | 抓取深度,深层控件抓不到时可调大 |
31
+ | `mode` | `1` | 抓取模式,可选 `1` / `2` / `3`,默认 `1` |
47
32
 
48
33
  ```typescript
49
- // 创建选择器
50
- const selector = $创建节点选择器({
51
- maxDepth: 20, // 最大20层深度
52
- mode: 1, // 默认模式 1
53
- });
34
+ const selector = $创建节点选择器();
35
+ const shallow = $创建节点选择器({ maxDepth: 15 });
36
+ const listPage = $创建节点选择器({ mode: 2 });
54
37
  ```
55
38
 
56
- ### 节点信息接口
57
-
58
- #### $节点位置信息
39
+ ---
40
+
41
+ ## 节点信息
42
+
43
+ ### 位置 `$节点位置信息`
44
+
45
+ | 字段 | 说明 |
46
+ | --- | --- |
47
+ | `x` / `y` | 左上角 |
48
+ | `width` / `height` | 宽高 |
49
+ | `centerX` / `centerY` | 中心点 |
50
+
51
+ ### 节点 `$节点信息`
52
+
53
+ **属性**
54
+
55
+ | 字段 | 说明 |
56
+ | --- | --- |
57
+ | `id` | 节点 ID(内部定位用,不要改) |
58
+ | `identifier` | 控件标识符 |
59
+ | `label` | 标签文案 |
60
+ | `type` | 类型,如 `XCUIElementTypeButton` |
61
+ | `value` | 当前值 |
62
+ | `placeholderValue` | 输入框占位文字 |
63
+ | `title` | 标题 |
64
+ | `enabled` | 是否启用 |
65
+ | `bounds` | 位置大小 |
66
+ | `depth` | 层级 |
67
+ | `index` | 在父节点下的序号 |
68
+ | `parentId` | 父节点 ID |
69
+ | `childCount` | 子节点数量 |
70
+
71
+ **方法**
72
+
73
+ | 方法 | 说明 |
74
+ | --- | --- |
75
+ | `hittable()` | 当前是否可点击(可见且未被挡住) |
76
+ | `scrollToVisible()` | 滚动到可见区域 |
77
+ | `tap()` | 单击(不可见时会先尝试滚到可见) |
78
+ | `doubleTap()` | 双击 |
79
+ | `press(duration?)` | 长按,`duration` 单位毫秒,默认 500 |
80
+ | `点击中心()` | 点击中心坐标 |
81
+ | `点击随机范围()` | 在节点范围内随机点击 |
82
+ | `clearInput()` | 清空输入内容 |
83
+ | `input(text)` | 追加输入(不先清空) |
84
+ | `setValue(text)` | 设置值(见下方) |
85
+ | `parent()` | 父节点 |
86
+ | `child(index)` | 第 `index` 个子节点 |
87
+ | `allChildren()` | 全部子节点 |
88
+ | `siblings()` | 全部兄弟节点 |
89
+ | `previousSiblings()` | 前面的兄弟 |
90
+ | `nextSiblings()` | 后面的兄弟 |
91
+
92
+ ---
93
+
94
+ ## 选择器方法
95
+
96
+ ### 加载与结果
97
+
98
+ | 方法 | 说明 |
99
+ | --- | --- |
100
+ | `释放内存()` | 释放内存 |
101
+ | `加载节点数据(timeout?)` | 重新加载界面节点,默认超时 5000ms |
102
+ | `清除选择器()` | 清除已设置的筛选条件 |
103
+ | `xml(timeout?)` | 获取界面 XML,失败返回 `null` |
104
+ | `获取节点信息(timeout?)` | 获取所有匹配节点 |
105
+ | `获取一个节点信息(timeout?)` | 获取第一个匹配节点,没有则 `null` |
106
+
107
+ 超时单位均为毫秒,默认 `5000`。
59
108
 
60
109
  ```typescript
61
- interface $节点位置信息 {
62
- x: 数字; // x坐标
63
- y: 数字; // y坐标
64
- width: 数字; // 宽度
65
- height: 数字; // 高度
66
- centerX: 数字; // 中心点x坐标
67
- centerY: 数字; // 中心点y坐标
68
- }
110
+ const selector = $创建节点选择器();
111
+ const nodes = selector.标签("确定").获取节点信息(5000);
112
+ const one = selector.获取一个节点信息(3000);
113
+ const xml = selector.xml();
114
+ selector.释放内存();
69
115
  ```
70
116
 
71
- #### $节点信息
117
+ ### 筛选条件
72
118
 
73
- ```typescript
74
- interface $节点信息 {
75
- id: 字符串; // 节点ID
76
- identifier: 字符串; // 节点标识符
77
- label: 字符串; // 节点标签
78
- type: 字符串; // 节点类型
79
- value: 字符串; // 节点值
80
- placeholderValue: 字符串; // 节点占位符值
81
- title: 字符串; // 节点名称
82
- enabled: 布尔值; // 是否启用
83
- bounds: $节点位置信息; // 边界信息
84
- depth: 数字; // 层级深度
85
- index: 数字; // 索引
86
- parentId: 字符串; // 父节点ID
87
- childCount: 数字; // 子节点数量
88
-
89
- // 操作方法
90
- 点击中心(): 布尔值; // 点击中心
91
- 点击随机范围(): 布尔值; // 随机点击
92
- hittable(): 布尔值; // 节点是否可接收事件,用于判断节点是否在屏幕可见
93
- parent(): $节点信息 | null; // 获取父节点
94
- child(index: 数字): $节点信息 | null; // 获取子节点
95
- allChildren(): $节点信息[]; // 获取所有子节点
96
- siblings(): $节点信息[]; // 获取兄弟节点
97
- previousSiblings(): $节点信息[]; // 获取前面的兄弟节点
98
- nextSiblings(): $节点信息[]; // 获取后面的兄弟节点
99
- }
100
- ```
101
-
102
- ### 选择器方法
103
-
104
- #### 获取节点
119
+ 可链式调用,多个条件同时满足(并且关系)。
120
+ 带「匹配」的为模糊/正则匹配。
105
121
 
106
- ```typescript
107
- // 释放节点选择器占用的内存
108
- function 释放内存(): 无返回值;
109
-
110
- // xml - 获取当前页面的 XML 字符串
111
- function xml(超时时间?: 数字): 字符串 | null;
122
+ **文本**
112
123
 
113
- // 获取多个节点
114
- function 获取所有节点(超时时间?: 数字): 数组<$节点信息>;
124
+ | 方法 | 说明 |
125
+ | --- | --- |
126
+ | `标签` / `标签匹配` | 标签 |
127
+ | `名称` / `名称匹配` | 标题 |
128
+ | `标识符` / `标识符匹配` | 标识符 |
129
+ | `值` / `值匹配` | 值 |
130
+ | `占位符` / `占位符匹配` | 占位文字 |
115
131
 
116
- // 获取单个节点
117
- function 获取一个节点(超时时间?: 数字): $节点信息 | null;
132
+ **类型与状态**
118
133
 
119
- // 加载节点数据
120
- function 加载节点数据(超时时间?: 数字): $节点选择器;
134
+ | 方法 | 说明 |
135
+ | --- | --- |
136
+ | `类型` / `类型匹配` | 类型,如 `XCUIElementTypeButton` |
137
+ | `是否启用` | 是否启用 |
121
138
 
122
- // 清除所有选择条件
123
- function 清除所有选择条件(): $节点选择器;
124
- ```
139
+ **位置与结构**
125
140
 
126
- **示例:**
141
+ | 方法 | 说明 |
142
+ | --- | --- |
143
+ | `索引` | 序号 |
144
+ | `层级` | 层级 |
145
+ | `子节点数量` | 子节点数,支持数字或如 `">0"` |
146
+ | `范围(x, y, width, height)` | 区域 |
147
+ | `xpath` | XPath |
148
+ | `id` | 按节点 ID |
127
149
 
128
150
  ```typescript
129
- const 选择器 = $创建节点选择器();
130
- // 获取所有匹配的节点
131
- const allNodes = 选择器.获取所有节点(5000);
132
- $打印信息日志(`找到 ${allNodes.length} 个节点`);
133
-
134
- // 获取第一个匹配的节点
135
- const 第一个节点 = 选择器.获取一个节点(3000);
136
- if (第一个节点) {
137
- $打印信息日志(`节点标签: ${第一个节点.label}`);
138
- }
139
-
140
- // 释放选择器内存
141
- 选择器.释放内存();
151
+ // 精确
152
+ selector.标签("确定").类型("XCUIElementTypeButton").获取一个节点信息(3000);
153
+
154
+ // 模糊
155
+ selector.标签匹配(".*登录.*").获取节点信息(3000);
156
+ selector.标识符匹配("^login_").获取节点信息(3000);
157
+
158
+ // 组合
159
+ selector
160
+ .类型("XCUIElementTypeTextField")
161
+ .是否启用(true)
162
+ .获取一个节点信息(3000);
142
163
  ```
143
164
 
144
- #### 条件筛选
145
-
146
- ##### 文本相关
147
-
148
- ```typescript
149
- // 精确匹配标签
150
- label(label: 字符串): $节点选择器
151
-
152
- // 标签模糊匹配
153
- labelMatch(match: 字符串): $节点选择器
165
+ 常见类型:`XCUIElementTypeButton`、`StaticText`、`TextField`、`SecureTextField`、`TextView`、`SearchField`、`Cell`、`Table`、`CollectionView`、`PickerWheel`、`Switch`、`Slider` 等。
154
166
 
155
- // 精确匹配名称
156
- title(title: 字符串): $节点选择器
167
+ ---
157
168
 
158
- // 名称模糊匹配
159
- titleMatch(match: 字符串): $节点选择器
169
+ ## 节点操作说明
160
170
 
161
- // 精确匹配标识符
162
- identifier(identifier: 字符串): $节点选择器
171
+ ### 是否可点 / 滚到可见
163
172
 
164
- // 标识符模糊匹配
165
- identifierMatch(match: 字符串): $节点选择器
173
+ ```typescript
174
+ if (node.hittable()) {
175
+ node.tap();
176
+ } else {
177
+ node.scrollToVisible();
178
+ node.tap();
179
+ }
180
+ ```
166
181
 
167
- // 精确匹配值
168
- value(value: 字符串): $节点选择器
182
+ - `hittable()`:当前能否点到
183
+ - `scrollToVisible()`:手动滚到可见
184
+ - `tap` / `doubleTap` / `press`:不可见时会自动尝试滚到可见再操作
169
185
 
170
- // 值模糊匹配
171
- valueMatch(match: 字符串): $节点选择器
172
- ```
186
+ ### 点击
173
187
 
174
- **示例:**
188
+ | 方法 | 说明 |
189
+ | --- | --- |
190
+ | `tap()` | 推荐,单击 |
191
+ | `doubleTap()` | 双击 |
192
+ | `press(ms?)` | 长按,默认 500ms |
193
+ | `点击中心()` | 点中心坐标 |
194
+ | `点击随机范围()` | 范围内随机点 |
175
195
 
176
196
  ```typescript
177
- const 选择器 = $创建节点选择器();
178
- // 查找标签为"确定"的按钮
179
- const confirmButton = 选择器.label("确定").获取一个节点(3000);
180
-
181
- // 查找包含"登录"的元素
182
- const loginElements = 选择器.labelMatch(".*登录.*").获取所有节点(3000);
197
+ const btn = selector
198
+ .标签("确定")
199
+ .类型("XCUIElementTypeButton")
200
+ .获取一个节点信息(3000);
201
+
202
+ if (btn) {
203
+ btn.tap();
204
+ btn.doubleTap();
205
+ btn.press(800);
206
+ }
207
+ ```
183
208
 
184
- // 查找名称包含"button"的元素
185
- const buttons = 选择器.titleMatch("button").获取所有节点(3000);
209
+ ### 输入与设值
186
210
 
187
- // 查找值为"submit"的元素
188
- const submitElement = 选择器.value("submit").获取一个节点(2000);
211
+ | 方法 | 说明 |
212
+ | --- | --- |
213
+ | `clearInput()` | 清空 |
214
+ | `input(text)` | 追加输入,不清空原内容 |
215
+ | `setValue(text)` | 按控件类型设置 |
189
216
 
190
- // 通过标识符查找
191
- const 通过标识符 = 选择器.identifier("login_btn").获取一个节点(2000);
192
- const 标识符模糊 = 选择器.identifierMatch("^login_.*").获取所有节点(3000);
193
- ```
217
+ **`setValue` 行为**
194
218
 
195
- // 释放选择器内存
196
- 选择器.释放内存();
219
+ | 控件类型 | 传参 | 效果 |
220
+ | --- | --- | --- |
221
+ | `PickerWheel` | 选项文案,如 `"1小时"` | 滚到该选项 |
222
+ | 文本框类(TextField 等) | 字符串 | 聚焦后追加输入,不先清空 |
197
223
 
198
- ##### 类型和属性
224
+ 覆盖原内容请先清空:
199
225
 
200
226
  ```typescript
201
- // 精确匹配类型
202
- type(type: string): $节点选择器
203
-
204
- // 类型模糊匹配
205
- typeMatch(match: string): $节点选择器
206
-
207
- // 启用状态
208
- enabled(enabled: boolean): $节点选择器
227
+ field.clearInput();
228
+ field.setValue("hello");
209
229
  ```
210
230
 
211
- **示例:**
212
-
213
231
  ```typescript
214
- const 选择器 = $创建节点选择器();
215
- // 查找所有按钮
216
- const allButtons = 选择器.type("XCUIElementTypeButton").获取所有节点(3000);
217
-
218
- // 查找所有文本框
219
- const textFields = 选择器
220
- .typeMatch("XCUIElementTypeTextField")
221
- .获取所有节点(3000);
222
-
223
- // 查找启用的元素
224
- const enabledElements = 选择器.enabled(true).获取所有节点(3000);
225
-
226
- // 释放选择器内存
227
- 选择器.释放内存();
232
+ const wheel = selector.类型("XCUIElementTypePickerWheel").获取一个节点信息(3000);
233
+ if (wheel) {
234
+ wheel.setValue("1小时");
235
+ }
228
236
  ```
229
237
 
230
- ##### 位置和结构
238
+ ### 树导航
231
239
 
232
240
  ```typescript
233
- // 索引位置
234
- index(index: number): $节点选择器
235
-
236
- // 层级深度
237
- depth(depth: number): $节点选择器
238
-
239
- // 子节点数量
240
- childCount(childCount: number | string): $节点选择器
241
-
242
- // 边界范围
243
- bounds(x: number, y: number, width: number, height: number): $节点选择器
244
-
245
- // XPath 路径
246
- xpath(path: string): $节点选择器
241
+ const field = selector.类型("XCUIElementTypeTextField").获取一个节点信息(3000);
242
+ if (field) {
243
+ const parent = field.parent();
244
+ const children = parent?.allChildren() ?? [];
245
+ const prev = field.previousSiblings();
246
+ const next = field.nextSiblings();
247
+ const second = parent?.child(1);
248
+ }
247
249
  ```
248
250
 
249
- **示例:**
251
+ ---
250
252
 
251
- ```typescript
252
- const 选择器 = $创建节点选择器();
253
- // 查找第一个元素
254
- const firstElement = 选择器.index(0).获取一个节点(2000);
253
+ ## 示例
255
254
 
256
- // 查找特定深度的元素
257
- const level3Elements = 选择器.depth(3).获取所有节点(3000);
255
+ ### 登录
258
256
 
259
- // 查找有子节点的元素
260
- const parentElements = 选择器.childCount(">0").获取所有节点(3000);
257
+ ```typescript
258
+ const selector = $创建节点选择器();
261
259
 
262
- // 查找特定区域的元素
263
- const regionElements = 选择器.bounds(100, 100, 200, 50).获取所有节点(3000);
260
+ try {
261
+ const user = selector.类型("XCUIElementTypeTextField").获取一个节点信息(5000);
262
+ if (user) {
263
+ user.clearInput();
264
+ user.setValue("demo_user");
265
+ }
264
266
 
265
- // 使用 XPath 查找
266
- const xpathElements = 选择器.xpath("//*[@title='快点JS']").获取所有节点(3000);
267
+ const pass = selector
268
+ .清除选择器()
269
+ .类型("XCUIElementTypeSecureTextField")
270
+ .获取一个节点信息(3000);
271
+ if (pass) {
272
+ pass.clearInput();
273
+ pass.setValue("password");
274
+ }
267
275
 
268
- // 释放选择器内存
269
- 选择器.释放内存();
276
+ const login = selector
277
+ .清除选择器()
278
+ .标签匹配(".*登录.*")
279
+ .类型("XCUIElementTypeButton")
280
+ .获取一个节点信息(3000);
281
+ if (login) {
282
+ login.tap();
283
+ }
284
+ } finally {
285
+ selector.释放内存();
286
+ }
270
287
  ```
271
288
 
272
- ### 节点操作
273
-
274
- #### 点击操作
289
+ ### 列表里靠后的项
275
290
 
276
291
  ```typescript
277
- // 点击节点中心
278
- node.点击中心(): 布尔值;
279
-
280
- // 随机点击节点区域
281
- node.点击随机范围(): 布尔值;
282
-
283
- // 节点是否可接收事件(用于判断是否显示在屏幕上)
284
- node.hittable(): 布尔值;
292
+ const selector = $创建节点选择器({ mode: 2 });
293
+ const item = selector.标签("第 30 项").获取一个节点信息(5000);
294
+ if (item) {
295
+ item.tap(); // 不在可见区域时会自动滚动
296
+ }
297
+ selector.释放内存();
285
298
  ```
286
299
 
287
- **示例:**
300
+ ### 查看界面结构
288
301
 
289
302
  ```typescript
290
- const 选择器 = $创建节点选择器();
291
- // 查找并点击确定按钮
292
- const confirmBtn = 选择器
293
- .label("确定")
294
- .type("XCUIElementTypeButton")
295
- .获取一个节点(3000);
296
-
297
- if (confirmBtn) {
298
- const isHittable = confirmBtn.hittable();
299
- $打印信息日志(`是否可接收事件: ${isHittable}`);
300
-
301
- const clicked = confirmBtn.点击中心();
302
- if (clicked) {
303
- $打印信息日志("成功点击确定按钮");
304
- }
305
- }
306
-
307
- // 随机点击避免检测
308
- const randomClick = confirmBtn?.点击随机范围();
309
- if (randomClick) {
310
- $打印信息日志("成功随机点击确定按钮");
303
+ const selector = $创建节点选择器();
304
+ const xml = selector.xml(8000);
305
+ if (xml) {
306
+ $打印信息日志(xml);
311
307
  }
312
-
313
- // 释放选择器内存
314
- 选择器.释放内存();
308
+ selector.释放内存();
315
309
  ```
316
310
 
317
- #### 节点导航
318
-
319
- ```typescript
320
- // 获取父节点
321
- node.parent(): $节点信息 | null
322
-
323
- // 获取指定索引的子节点
324
- node.child(index: number): $节点信息 | null
325
-
326
- // 获取所有子节点
327
- node.allChildren(): $节点信息[]
311
+ ---
328
312
 
329
- // 获取兄弟节点
330
- node.siblings(): $节点信息[]
313
+ ## 常见问题
331
314
 
332
- // 获取前面的兄弟节点
333
- node.previousSiblings(): $节点信息[]
334
-
335
- // 获取后面的兄弟节点
336
- node.nextSiblings(): $节点信息[]
337
- ```
315
+ **找不到节点**
316
+ 加大超时;减少条件或改用匹配;换 `mode`;用 `xml()` 看实际文案和类型。
338
317
 
339
- **示例:**
318
+ **点了没反应**
319
+ 先看 `hittable()`;确认点到的是目标控件;可对比 `点击中心()`。
340
320
 
341
- ```typescript
342
- const 选择器 = $创建节点选择器();
343
- // 查找输入框并获取其父容器
344
- const textField = 选择器.type("XCUIElementTypeTextField").获取一个节点(3000);
345
-
346
- if (textField) {
347
- const container = textField.parent();
348
- if (container) {
349
- $打印信息日志(`容器类型: ${container.type}`);
350
-
351
- // 获取容器的所有子元素
352
- const siblings = container.allChildren();
353
- $打印信息日志(`容器包含 ${siblings.length} 个子元素`);
354
-
355
- // 查找同级的按钮
356
- const siblingButtons = siblings.filter(
357
- (node) => node.type === "XCUIElementTypeButton",
358
- );
359
- }
360
- }
321
+ **输入叠在旧文字后面**
322
+ `input` / 文本类 `setValue` 是追加,先 `clearInput()`。
361
323
 
362
- // 释放选择器内存
363
- 选择器.释放内存();
364
- ```
324
+ **滚轮设不中**
325
+ `setValue` 要传界面上显示的选项文案;确认类型是 `PickerWheel`;多列时选对那一列。
@@ -81,7 +81,7 @@ def recognizeAbs(
81
81
  | `input` | str | 是 | | 输入源,支持 `"screen"`、图片文件路径、URL 或 imageId |
82
82
  | `x`, `y` | int | 否 | 0 | 裁剪区域左上角坐标 |
83
83
  | `ex`, `ey` | int | 否 | 0 | 裁剪区域右下角坐标;`ex` 或 `ey` 为 0 时分别使用图像宽度或高度 |
84
- | `confidenceThreshold` | float | 否 | 0.8 | 相似度下限;`<=0` 时按 `0.8`;低于阈值的字符会被过滤;`>0.95` 时要求模板与图像像素完全一致 |
84
+ | `confidenceThreshold` | float | 否 | 0.8 | 相似度下限;`<=0` 时按 `0.8`;低于阈值的字符会被过滤;`>0.95` 时要求像素完全一致 |
85
85
 
86
86
  **返回值:**`List[OCRChar]`。按行从上到下、同一行从左到右排列。颜色按字库各字自带的前景色/偏色匹配,无需额外传色。
87
87
 
@@ -117,7 +117,7 @@ def findTextAbs(
117
117
  | `x`, `y` | int | 否 | 0 | 裁剪区域左上角坐标 |
118
118
  | `ex`, `ey` | int | 否 | 0 | 裁剪区域右下角坐标;`ex` 或 `ey` 为 0 时分别使用图像宽度或高度 |
119
119
  | `confidenceThreshold` | float | 否 | 0.8 | 单字符识别相似度下限;语义同 `recognizeAbs` |
120
- | `exactMatch` | bool | 否 | false | `false` 为行内子串包含匹配;`true` 要求某一整行文本完全等于目标字符串 |
120
+ | `exactMatch` | bool | 否 | false | `false` 为行内子串包含匹配;`true` 要求某一整行文本完全等于目标字符串 |
121
121
 
122
122
  **返回值:**命中结果数组。每个目标最多返回一次命中(最先匹配到的行);每项的 `text` 是目标字符串。
123
123