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.
- package/docs/api/dotocr.md +4 -4
- package/docs/api/node.md +242 -266
- package/docs/api/opencv.md +46 -356
- package/docs/apicn/dotocr.md +2 -2
- package/docs/apicn/node.md +245 -284
- package/docs/apipython/dotocr.md +2 -2
- package/docs/apipython/node.md +193 -215
- package/package.json +1 -1
package/docs/apicn/node.md
CHANGED
|
@@ -1,364 +1,325 @@
|
|
|
1
1
|
# 节点模块
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
用于查找和操作当前界面上的控件节点。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**注意**
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- 仅支持快点 Agent 模式
|
|
8
|
+
- 用完调用 `释放内存()`;找完节点即可释放,不必等点击结束
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**基本流程**
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
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
|
|
51
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
74
|
-
|
|
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
|
-
|
|
107
|
-
// 释放节点选择器占用的内存
|
|
108
|
-
function 释放内存(): 无返回值;
|
|
109
|
-
|
|
110
|
-
// xml - 获取当前页面的 XML 字符串
|
|
111
|
-
function xml(超时时间?: 数字): 字符串 | null;
|
|
122
|
+
**文本**
|
|
112
123
|
|
|
113
|
-
|
|
114
|
-
|
|
124
|
+
| 方法 | 说明 |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| `标签` / `标签匹配` | 标签 |
|
|
127
|
+
| `名称` / `名称匹配` | 标题 |
|
|
128
|
+
| `标识符` / `标识符匹配` | 标识符 |
|
|
129
|
+
| `值` / `值匹配` | 值 |
|
|
130
|
+
| `占位符` / `占位符匹配` | 占位文字 |
|
|
115
131
|
|
|
116
|
-
|
|
117
|
-
function 获取一个节点(超时时间?: 数字): $节点信息 | null;
|
|
132
|
+
**类型与状态**
|
|
118
133
|
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
173
|
+
```typescript
|
|
174
|
+
if (node.hittable()) {
|
|
175
|
+
node.tap();
|
|
176
|
+
} else {
|
|
177
|
+
node.scrollToVisible();
|
|
178
|
+
node.tap();
|
|
179
|
+
}
|
|
180
|
+
```
|
|
166
181
|
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
185
|
-
const buttons = 选择器.titleMatch("button").获取所有节点(3000);
|
|
209
|
+
### 输入与设值
|
|
186
210
|
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
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
|
|
257
|
+
```typescript
|
|
258
|
+
const selector = $创建节点选择器();
|
|
261
259
|
|
|
262
|
-
|
|
263
|
-
const
|
|
260
|
+
try {
|
|
261
|
+
const user = selector.类型("XCUIElementTypeTextField").获取一个节点信息(5000);
|
|
262
|
+
if (user) {
|
|
263
|
+
user.clearInput();
|
|
264
|
+
user.setValue("demo_user");
|
|
265
|
+
}
|
|
264
266
|
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
279
|
-
|
|
280
|
-
//
|
|
281
|
-
|
|
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
|
-
|
|
293
|
-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
// 获取后面的兄弟节点
|
|
336
|
-
node.nextSiblings(): $节点信息[]
|
|
337
|
-
```
|
|
315
|
+
**找不到节点**
|
|
316
|
+
加大超时;减少条件或改用匹配;换 `mode`;用 `xml()` 看实际文案和类型。
|
|
338
317
|
|
|
339
|
-
|
|
318
|
+
**点了没反应**
|
|
319
|
+
先看 `hittable()`;确认点到的是目标控件;可对比 `点击中心()`。
|
|
340
320
|
|
|
341
|
-
|
|
342
|
-
|
|
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`;多列时选对那一列。
|
package/docs/apipython/dotocr.md
CHANGED
|
@@ -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
|
|
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
|
|
120
|
+
| `exactMatch` | bool | 否 | false | `false` 为行内子串包含匹配;`true` 要求某一整行文本完全等于目标字符串 |
|
|
121
121
|
|
|
122
122
|
**返回值:**命中结果数组。每个目标最多返回一次命中(最先匹配到的行);每项的 `text` 是目标字符串。
|
|
123
123
|
|