ms-vite-plugin 1.4.41 → 1.4.45
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/global.md +70 -15
- package/docs/api/node.md +239 -348
- package/docs/apicn/global.md +65 -10
- package/docs/apicn/node.md +242 -365
- package/docs/apipython/g.md +74 -23
- package/docs/apipython/node.md +186 -287
- package/docs/httpapi/api.md +190 -189
- package/package.json +1 -1
package/docs/apicn/node.md
CHANGED
|
@@ -1,450 +1,327 @@
|
|
|
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
|
-
**示例:**
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
// 创建选择器
|
|
50
|
-
const selector = $创建节点选择器({
|
|
51
|
-
maxDepth: 20, // 最大20层深度
|
|
52
|
-
mode: 1, // 默认模式 1
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 节点信息接口
|
|
57
|
-
|
|
58
|
-
#### $节点位置信息
|
|
28
|
+
| 参数 | 默认 | 说明 |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `maxDepth` | `50` | 抓取深度,深层控件抓不到时可调大 |
|
|
31
|
+
| `mode` | `1` | 抓取模式,可选 `1` / `2` / `3`,默认 `1` |
|
|
59
32
|
|
|
60
33
|
```typescript
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
width: 数字; // 宽度
|
|
65
|
-
height: 数字; // 高度
|
|
66
|
-
centerX: 数字; // 中心点x坐标
|
|
67
|
-
centerY: 数字; // 中心点y坐标
|
|
68
|
-
}
|
|
34
|
+
const selector = $创建节点选择器();
|
|
35
|
+
const shallow = $创建节点选择器({ maxDepth: 15 });
|
|
36
|
+
const listPage = $创建节点选择器({ mode: 2 });
|
|
69
37
|
```
|
|
70
38
|
|
|
71
|
-
|
|
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()` | 清空输入内容(内部会先 `tap` 聚焦,因而也会自动滚到可见) |
|
|
83
|
+
| `input(text)` | 追加输入(不先清空;内部会先 `tap` 聚焦) |
|
|
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`。
|
|
72
108
|
|
|
73
109
|
```typescript
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
tap(): 布尔值; // 无障碍点击
|
|
94
|
-
doubleTap(): 布尔值; // 无障碍双击
|
|
95
|
-
press(duration: 数字): 布尔值; // 无障碍长按,duration 单位毫秒
|
|
96
|
-
scrollToVisible(): 布尔值; // 将节点滚动到可见区域
|
|
97
|
-
clearInput(): 布尔值; // 清空输入
|
|
98
|
-
input(text: 字符串): 布尔值; // 追加输入(聚焦后输入)
|
|
99
|
-
setValue(text: 字符串): 布尔值; // 设置节点的值(见下方支持控件)
|
|
100
|
-
parent(): $节点信息 | null; // 获取父节点
|
|
101
|
-
child(index: 数字): $节点信息 | null; // 获取子节点
|
|
102
|
-
allChildren(): $节点信息[]; // 获取所有子节点
|
|
103
|
-
siblings(): $节点信息[]; // 获取兄弟节点
|
|
104
|
-
previousSiblings(): $节点信息[]; // 获取前面的兄弟节点
|
|
105
|
-
nextSiblings(): $节点信息[]; // 获取后面的兄弟节点
|
|
106
|
-
}
|
|
110
|
+
const selector = $创建节点选择器();
|
|
111
|
+
const nodes = selector.标签("确定").获取节点信息(5000);
|
|
112
|
+
const one = selector.获取一个节点信息(3000);
|
|
113
|
+
const xml = selector.xml();
|
|
114
|
+
selector.释放内存();
|
|
107
115
|
```
|
|
108
116
|
|
|
109
|
-
###
|
|
110
|
-
|
|
111
|
-
#### 获取节点
|
|
117
|
+
### 筛选条件
|
|
112
118
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
function 释放内存(): 无返回值;
|
|
119
|
+
可链式调用,多个条件同时满足(并且关系)。
|
|
120
|
+
带「匹配」的为模糊/正则匹配。
|
|
116
121
|
|
|
117
|
-
|
|
118
|
-
function xml(超时时间?: 数字): 字符串 | null;
|
|
122
|
+
**文本**
|
|
119
123
|
|
|
120
|
-
|
|
121
|
-
|
|
124
|
+
| 方法 | 说明 |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| `标签` / `标签匹配` | 标签 |
|
|
127
|
+
| `名称` / `名称匹配` | 标题 |
|
|
128
|
+
| `标识符` / `标识符匹配` | 标识符 |
|
|
129
|
+
| `值` / `值匹配` | 值 |
|
|
130
|
+
| `占位符` / `占位符匹配` | 占位文字 |
|
|
122
131
|
|
|
123
|
-
|
|
124
|
-
function 获取一个节点(超时时间?: 数字): $节点信息 | null;
|
|
132
|
+
**类型与状态**
|
|
125
133
|
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
| 方法 | 说明 |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| `类型` / `类型匹配` | 类型,如 `XCUIElementTypeButton` |
|
|
137
|
+
| `是否启用` | 是否启用 |
|
|
128
138
|
|
|
129
|
-
|
|
130
|
-
function 清除所有选择条件(): $节点选择器;
|
|
131
|
-
```
|
|
139
|
+
**位置与结构**
|
|
132
140
|
|
|
133
|
-
|
|
141
|
+
| 方法 | 说明 |
|
|
142
|
+
| --- | --- |
|
|
143
|
+
| `索引` | 序号 |
|
|
144
|
+
| `层级` | 层级 |
|
|
145
|
+
| `子节点数量` | 子节点数,支持数字或如 `">0"` |
|
|
146
|
+
| `范围(x, y, width, height)` | 区域 |
|
|
147
|
+
| `xpath` | XPath |
|
|
148
|
+
| `id` | 按节点 ID |
|
|
134
149
|
|
|
135
150
|
```typescript
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
选择器.释放内存();
|
|
151
|
+
// 精确
|
|
152
|
+
selector.标签("确定").类型("XCUIElementTypeButton").获取一个节点信息(3000);
|
|
153
|
+
|
|
154
|
+
// 模糊
|
|
155
|
+
selector.标签匹配(".*登录.*").获取节点信息(3000);
|
|
156
|
+
selector.标识符匹配("^login_").获取节点信息(3000);
|
|
157
|
+
|
|
158
|
+
// 组合
|
|
159
|
+
selector
|
|
160
|
+
.类型("XCUIElementTypeTextField")
|
|
161
|
+
.是否启用(true)
|
|
162
|
+
.获取一个节点信息(3000);
|
|
149
163
|
```
|
|
150
164
|
|
|
151
|
-
|
|
165
|
+
常见类型:`XCUIElementTypeButton`、`StaticText`、`TextField`、`SecureTextField`、`TextView`、`SearchField`、`Cell`、`Table`、`CollectionView`、`PickerWheel`、`Switch`、`Slider` 等。
|
|
152
166
|
|
|
153
|
-
|
|
167
|
+
---
|
|
154
168
|
|
|
155
|
-
|
|
156
|
-
// 精确匹配标签
|
|
157
|
-
label(label: 字符串): $节点选择器
|
|
169
|
+
## 节点操作说明
|
|
158
170
|
|
|
159
|
-
|
|
160
|
-
labelMatch(match: 字符串): $节点选择器
|
|
171
|
+
### 是否可点 / 滚到可见
|
|
161
172
|
|
|
162
|
-
|
|
163
|
-
title(title: 字符串): $节点选择器
|
|
164
|
-
|
|
165
|
-
// 名称模糊匹配
|
|
166
|
-
titleMatch(match: 字符串): $节点选择器
|
|
167
|
-
|
|
168
|
-
// 精确匹配标识符
|
|
169
|
-
identifier(identifier: 字符串): $节点选择器
|
|
170
|
-
|
|
171
|
-
// 标识符模糊匹配
|
|
172
|
-
identifierMatch(match: 字符串): $节点选择器
|
|
173
|
-
|
|
174
|
-
// 精确匹配值
|
|
175
|
-
value(value: 字符串): $节点选择器
|
|
176
|
-
|
|
177
|
-
// 值模糊匹配
|
|
178
|
-
valueMatch(match: 字符串): $节点选择器
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**示例:**
|
|
173
|
+
`tap` / `doubleTap` / `press` / `setValue`(以及内部会先 `tap` 的 `clearInput` / `input`)在元素当前不可见时,会**自动**先滚到可见再操作,一般不用手写滚动:
|
|
182
174
|
|
|
183
175
|
```typescript
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const loginElements = 选择器.labelMatch(".*登录.*").获取所有节点(3000);
|
|
190
|
-
|
|
191
|
-
// 查找名称包含"button"的元素
|
|
192
|
-
const buttons = 选择器.titleMatch("button").获取所有节点(3000);
|
|
193
|
-
|
|
194
|
-
// 查找值为"submit"的元素
|
|
195
|
-
const submitElement = 选择器.value("submit").获取一个节点(2000);
|
|
196
|
-
|
|
197
|
-
// 通过标识符查找
|
|
198
|
-
const 通过标识符 = 选择器.identifier("login_btn").获取一个节点(2000);
|
|
199
|
-
const 标识符模糊 = 选择器.identifierMatch("^login_.*").获取所有节点(3000);
|
|
176
|
+
// 推荐:直接操作,不可见时会自动滚到可见
|
|
177
|
+
node.tap();
|
|
178
|
+
node.doubleTap();
|
|
179
|
+
node.press(800);
|
|
180
|
+
node.setValue("hello");
|
|
200
181
|
```
|
|
201
182
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
##### 类型和属性
|
|
183
|
+
- `hittable()`:当前能否点到(可见且未被挡住),用于排查“点了没反应”
|
|
184
|
+
- `scrollToVisible()`:只滚到可见、不点击;仅在你想先露出元素、稍后再操作时使用
|
|
185
|
+
- `点击中心()` / `点击随机范围()`:按坐标点击,**不会**自动滚动
|
|
206
186
|
|
|
207
|
-
|
|
208
|
-
// 精确匹配类型
|
|
209
|
-
type(type: string): $节点选择器
|
|
187
|
+
### 点击
|
|
210
188
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
**示例:**
|
|
189
|
+
| 方法 | 说明 |
|
|
190
|
+
| --- | --- |
|
|
191
|
+
| `tap()` | 推荐,单击;不可见时自动滚到可见 |
|
|
192
|
+
| `doubleTap()` | 双击;不可见时自动滚到可见 |
|
|
193
|
+
| `press(ms?)` | 长按,默认 500ms;不可见时自动滚到可见 |
|
|
194
|
+
| `点击中心()` | 点中心坐标,不自动滚动 |
|
|
195
|
+
| `点击随机范围()` | 范围内随机点,不自动滚动 |
|
|
219
196
|
|
|
220
197
|
```typescript
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
198
|
+
const btn = selector
|
|
199
|
+
.标签("确定")
|
|
200
|
+
.类型("XCUIElementTypeButton")
|
|
201
|
+
.获取一个节点信息(3000);
|
|
224
202
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
// 查找启用的元素
|
|
231
|
-
const enabledElements = 选择器.enabled(true).获取所有节点(3000);
|
|
232
|
-
|
|
233
|
-
// 释放选择器内存
|
|
234
|
-
选择器.释放内存();
|
|
203
|
+
if (btn) {
|
|
204
|
+
btn.tap();
|
|
205
|
+
btn.doubleTap();
|
|
206
|
+
btn.press(800);
|
|
207
|
+
}
|
|
235
208
|
```
|
|
236
209
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
// 索引位置
|
|
241
|
-
index(index: number): $节点选择器
|
|
242
|
-
|
|
243
|
-
// 层级深度
|
|
244
|
-
depth(depth: number): $节点选择器
|
|
210
|
+
### 输入与设值
|
|
245
211
|
|
|
246
|
-
|
|
247
|
-
|
|
212
|
+
| 方法 | 说明 |
|
|
213
|
+
| --- | --- |
|
|
214
|
+
| `clearInput()` | 清空(内部先 `tap` 聚焦,不可见时也会自动滚到可见) |
|
|
215
|
+
| `input(text)` | 追加输入,不清空原内容(内部先 `tap` 聚焦) |
|
|
216
|
+
| `setValue(text)` | 按控件类型设置;不可见时会先自动滚到可见 |
|
|
248
217
|
|
|
249
|
-
|
|
250
|
-
bounds(x: number, y: number, width: number, height: number): $节点选择器
|
|
218
|
+
**`setValue` 行为**
|
|
251
219
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
220
|
+
| 控件类型 | 传参 | 效果 |
|
|
221
|
+
| --- | --- | --- |
|
|
222
|
+
| `PickerWheel` | 选项文案,如 `"1小时"` | 滚到该选项(控件本身不可见时也会先自动滚到可见) |
|
|
223
|
+
| 文本框类(TextField 等) | 字符串 | 聚焦后追加输入,不先清空 |
|
|
255
224
|
|
|
256
|
-
|
|
225
|
+
覆盖原内容请先清空:
|
|
257
226
|
|
|
258
227
|
```typescript
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
const firstElement = 选择器.index(0).获取一个节点(2000);
|
|
262
|
-
|
|
263
|
-
// 查找特定深度的元素
|
|
264
|
-
const level3Elements = 选择器.depth(3).获取所有节点(3000);
|
|
265
|
-
|
|
266
|
-
// 查找有子节点的元素
|
|
267
|
-
const parentElements = 选择器.childCount(">0").获取所有节点(3000);
|
|
268
|
-
|
|
269
|
-
// 查找特定区域的元素
|
|
270
|
-
const regionElements = 选择器.bounds(100, 100, 200, 50).获取所有节点(3000);
|
|
271
|
-
|
|
272
|
-
// 使用 XPath 查找
|
|
273
|
-
const xpathElements = 选择器.xpath("//*[@title='快点JS']").获取所有节点(3000);
|
|
274
|
-
|
|
275
|
-
// 释放选择器内存
|
|
276
|
-
选择器.释放内存();
|
|
228
|
+
field.clearInput();
|
|
229
|
+
field.setValue("hello");
|
|
277
230
|
```
|
|
278
231
|
|
|
279
|
-
### 节点操作
|
|
280
|
-
|
|
281
|
-
#### 点击操作
|
|
282
|
-
|
|
283
232
|
```typescript
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
// 节点是否可接收事件(用于判断是否显示在屏幕上)
|
|
291
|
-
node.hittable(): 布尔值;
|
|
292
|
-
|
|
293
|
-
// 无障碍点击
|
|
294
|
-
node.tap(): 布尔值;
|
|
295
|
-
|
|
296
|
-
// 无障碍双击
|
|
297
|
-
node.doubleTap(): 布尔值;
|
|
298
|
-
|
|
299
|
-
// 无障碍长按,duration 单位毫秒
|
|
300
|
-
node.press(duration: 数字): 布尔值;
|
|
301
|
-
|
|
302
|
-
// 将节点滚动到可见区域
|
|
303
|
-
node.scrollToVisible(): 布尔值;
|
|
304
|
-
|
|
305
|
-
// 清空输入
|
|
306
|
-
node.clearInput(): 布尔值;
|
|
307
|
-
|
|
308
|
-
// 追加输入
|
|
309
|
-
node.input(text: 字符串): 布尔值;
|
|
310
|
-
|
|
311
|
-
// 设置节点的值
|
|
312
|
-
node.setValue(text: 字符串): 布尔值;
|
|
233
|
+
const wheel = selector.类型("XCUIElementTypePickerWheel").获取一个节点信息(3000);
|
|
234
|
+
if (wheel) {
|
|
235
|
+
// 不可见时会自动滚到可见,再调到目标选项
|
|
236
|
+
wheel.setValue("1小时");
|
|
237
|
+
}
|
|
313
238
|
```
|
|
314
239
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
通过无障碍 API 直接操作节点,不依赖坐标点击。
|
|
318
|
-
|
|
319
|
-
| 方法 | 参数 | 说明 |
|
|
320
|
-
| --- | --- | --- |
|
|
321
|
-
| `tap()` | 无 | 无障碍单击 |
|
|
322
|
-
| `doubleTap()` | 无 | 无障碍双击 |
|
|
323
|
-
| `press(duration)` | `duration`:长按持续时间,单位毫秒 | 无障碍长按 |
|
|
324
|
-
|
|
325
|
-
**示例:**
|
|
240
|
+
### 树导航
|
|
326
241
|
|
|
327
242
|
```typescript
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
// 无障碍双击
|
|
336
|
-
btn.doubleTap();
|
|
337
|
-
|
|
338
|
-
// 无障碍长按 800ms
|
|
339
|
-
btn.press(800);
|
|
243
|
+
const field = selector.类型("XCUIElementTypeTextField").获取一个节点信息(3000);
|
|
244
|
+
if (field) {
|
|
245
|
+
const parent = field.parent();
|
|
246
|
+
const children = parent?.allChildren() ?? [];
|
|
247
|
+
const prev = field.previousSiblings();
|
|
248
|
+
const next = field.nextSiblings();
|
|
249
|
+
const second = parent?.child(1);
|
|
340
250
|
}
|
|
341
|
-
|
|
342
|
-
// 释放选择器内存
|
|
343
|
-
选择器.释放内存();
|
|
344
251
|
```
|
|
345
252
|
|
|
346
|
-
|
|
253
|
+
---
|
|
347
254
|
|
|
348
|
-
|
|
255
|
+
## 示例
|
|
349
256
|
|
|
350
|
-
|
|
351
|
-
| --- | --- | --- |
|
|
352
|
-
| `XCUIElementTypePickerWheel` | `"1小时"` | 滚轮选到对应选项文案 |
|
|
353
|
-
| `XCUIElementTypeTextField` | `"hello"` | 先聚焦再输入文本 |
|
|
354
|
-
| `XCUIElementTypeSecureTextField` | `"123456"` | 同上 |
|
|
355
|
-
| `XCUIElementTypeTextView` | `"多行内容"` | 同上 |
|
|
356
|
-
| `XCUIElementTypeSearchField` | `"关键词"` | 同上 |
|
|
257
|
+
### 登录
|
|
357
258
|
|
|
358
|
-
|
|
259
|
+
```typescript
|
|
260
|
+
const selector = $创建节点选择器();
|
|
359
261
|
|
|
360
|
-
|
|
262
|
+
try {
|
|
263
|
+
const user = selector.类型("XCUIElementTypeTextField").获取一个节点信息(5000);
|
|
264
|
+
if (user) {
|
|
265
|
+
user.clearInput();
|
|
266
|
+
user.setValue("demo_user");
|
|
267
|
+
}
|
|
361
268
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
if (confirmBtn) {
|
|
371
|
-
const isHittable = confirmBtn.hittable();
|
|
372
|
-
$打印信息日志(`是否可接收事件: ${isHittable}`);
|
|
373
|
-
|
|
374
|
-
confirmBtn.scrollToVisible();
|
|
375
|
-
// 优先使用无障碍点击;也可用 点击中心 / 点击随机范围 做坐标点击
|
|
376
|
-
const clicked = confirmBtn.tap();
|
|
377
|
-
if (clicked) {
|
|
378
|
-
$打印信息日志("成功点击确定按钮");
|
|
269
|
+
const pass = selector
|
|
270
|
+
.清除选择器()
|
|
271
|
+
.类型("XCUIElementTypeSecureTextField")
|
|
272
|
+
.获取一个节点信息(3000);
|
|
273
|
+
if (pass) {
|
|
274
|
+
pass.clearInput();
|
|
275
|
+
pass.setValue("password");
|
|
379
276
|
}
|
|
380
|
-
}
|
|
381
277
|
|
|
382
|
-
const
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
278
|
+
const login = selector
|
|
279
|
+
.清除选择器()
|
|
280
|
+
.标签匹配(".*登录.*")
|
|
281
|
+
.类型("XCUIElementTypeButton")
|
|
282
|
+
.获取一个节点信息(3000);
|
|
283
|
+
if (login) {
|
|
284
|
+
login.tap();
|
|
285
|
+
}
|
|
286
|
+
} finally {
|
|
287
|
+
selector.释放内存();
|
|
386
288
|
}
|
|
289
|
+
```
|
|
387
290
|
|
|
388
|
-
|
|
389
|
-
if (wheel) {
|
|
390
|
-
wheel.setValue("1小时");
|
|
391
|
-
}
|
|
291
|
+
### 列表里靠后的项
|
|
392
292
|
|
|
393
|
-
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
293
|
+
```typescript
|
|
294
|
+
const selector = $创建节点选择器({ mode: 2 });
|
|
295
|
+
const item = selector.标签("第 30 项").获取一个节点信息(5000);
|
|
296
|
+
if (item) {
|
|
297
|
+
item.tap(); // 不在可见区域时会自动滚动
|
|
397
298
|
}
|
|
398
|
-
|
|
399
|
-
// 释放选择器内存
|
|
400
|
-
选择器.释放内存();
|
|
299
|
+
selector.释放内存();
|
|
401
300
|
```
|
|
402
301
|
|
|
403
|
-
|
|
302
|
+
### 查看界面结构
|
|
404
303
|
|
|
405
304
|
```typescript
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
node.allChildren(): $节点信息[]
|
|
305
|
+
const selector = $创建节点选择器();
|
|
306
|
+
const xml = selector.xml(8000);
|
|
307
|
+
if (xml) {
|
|
308
|
+
$打印信息日志(xml);
|
|
309
|
+
}
|
|
310
|
+
selector.释放内存();
|
|
311
|
+
```
|
|
414
312
|
|
|
415
|
-
|
|
416
|
-
node.siblings(): $节点信息[]
|
|
313
|
+
---
|
|
417
314
|
|
|
418
|
-
|
|
419
|
-
node.previousSiblings(): $节点信息[]
|
|
315
|
+
## 常见问题
|
|
420
316
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
```
|
|
317
|
+
**找不到节点**
|
|
318
|
+
加大超时;减少条件或改用匹配;换 `mode`;用 `xml()` 看实际文案和类型。
|
|
424
319
|
|
|
425
|
-
|
|
320
|
+
**点了没反应**
|
|
321
|
+
先看 `hittable()`;确认点到的是目标控件;可对比 `点击中心()`。
|
|
426
322
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
// 查找输入框并获取其父容器
|
|
430
|
-
const textField = 选择器.type("XCUIElementTypeTextField").获取一个节点(3000);
|
|
431
|
-
|
|
432
|
-
if (textField) {
|
|
433
|
-
const container = textField.parent();
|
|
434
|
-
if (container) {
|
|
435
|
-
$打印信息日志(`容器类型: ${container.type}`);
|
|
436
|
-
|
|
437
|
-
// 获取容器的所有子元素
|
|
438
|
-
const siblings = container.allChildren();
|
|
439
|
-
$打印信息日志(`容器包含 ${siblings.length} 个子元素`);
|
|
440
|
-
|
|
441
|
-
// 查找同级的按钮
|
|
442
|
-
const siblingButtons = siblings.filter(
|
|
443
|
-
(node) => node.type === "XCUIElementTypeButton",
|
|
444
|
-
);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
323
|
+
**输入叠在旧文字后面**
|
|
324
|
+
`input` / 文本类 `setValue` 是追加,先 `clearInput()`。
|
|
447
325
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
```
|
|
326
|
+
**滚轮设不中**
|
|
327
|
+
`setValue` 要传界面上显示的选项文案;确认类型是 `PickerWheel`;多列时选对那一列。
|