android-midscene-automation 0.1.13 → 0.1.15
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/CHANGELOG.md +35 -0
- package/README.md +49 -51
- package/USAGE.md +1018 -0
- package/package.json +2 -1
- package/server/android-sdk.ts +104 -0
- package/server/appium-recorder/appium-runner.ts +144 -35
- package/server/appium-recorder/report.ts +138 -0
- package/server/appium-recorder/repository.ts +78 -0
- package/server/appium-recorder/routes.ts +141 -14
- package/server/config.ts +12 -0
- package/server/http-api.ts +9 -6
- package/src/App.vue +23 -23
- package/src/appium-recorder/AppiumPage.vue +403 -38
- package/src/appium-recorder/api.ts +62 -5
- package/src/appium-recorder/components/FlowStepEditor.vue +175 -0
- package/src/appium-recorder/components/RecordedSteps.vue +514 -277
- package/src/appium-recorder/types.ts +2 -0
- package/src/pages/ConfigPage.vue +28 -0
- package/src/style.css +162 -89
- package/src/types.ts +4 -0
package/USAGE.md
ADDED
|
@@ -0,0 +1,1018 @@
|
|
|
1
|
+
# Appium 录制器使用说明
|
|
2
|
+
|
|
3
|
+
本文档说明 Appium 组件树录制器的完整使用方式,包括每个操作按钮的用途、录制方法和示例。
|
|
4
|
+
|
|
5
|
+
本文档随 npm 包发布,也可以从 README 的“功能文档”直接打开。
|
|
6
|
+
|
|
7
|
+
## 使用前准备
|
|
8
|
+
|
|
9
|
+
### 1. 连接 Android 设备
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
adb devices -l
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
确认设备已连接,并且手机已允许 USB 调试。
|
|
16
|
+
|
|
17
|
+
### 2. 启动 Appium
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
appium
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
如果没有安装 UiAutomator2 Driver:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
appium driver install uiautomator2
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. 启动项目
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
npx --yes android-midscene-automation@latest
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
或源码开发:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
npm install
|
|
39
|
+
npm run dev
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
打开页面后进入 `Appium` 菜单。
|
|
43
|
+
|
|
44
|
+
### 4. 配置运行路径(可选)
|
|
45
|
+
|
|
46
|
+
进入“参数配置 > 运行配置”可以设置:
|
|
47
|
+
|
|
48
|
+
- `Android SDK 路径`:填写包含 `platform-tools/adb` 的 SDK 根目录。留空时依次读取 `ANDROID_SDK_ROOT`、`ANDROID_HOME`、系统常见 SDK 目录和 PATH 中的 ADB。
|
|
49
|
+
- `回放报告目录`:填写 Markdown 回放报告的保存目录。支持绝对路径;相对路径以启动命令所在目录为基准。留空时使用启动目录下的 `output`。
|
|
50
|
+
|
|
51
|
+
回放开始前会检测 Android SDK。检测失败时不会创建 Appium session,回放输出会直接显示需要修正的 SDK 路径。
|
|
52
|
+
|
|
53
|
+
## 基本录制流程
|
|
54
|
+
|
|
55
|
+
1. 选择设备。
|
|
56
|
+
2. 在“参数配置”中添加预设 App 参数。
|
|
57
|
+
3. 回到 `Appium` 页面,在“节点与脚本”区域选择预设 App。
|
|
58
|
+
4. 等待设备预览和 App 组件树自动加载;必要时点击“刷新组件树”。
|
|
59
|
+
5. 在设备预览或 App 组件树中选择目标组件。
|
|
60
|
+
6. 在“开始”节点或任意步骤后的“插入操作”中选择要录制的操作。
|
|
61
|
+
7. 在“录制步骤”中检查流程、编辑节点备注并配置判断分支。
|
|
62
|
+
8. 输入脚本名称并保存。
|
|
63
|
+
9. 选择已保存脚本后点击“回放”。
|
|
64
|
+
|
|
65
|
+
App 包名是必填项,只能从“参数配置”中已经添加的“预设 App 参数”选择,不能手动输入。未选择 App 时不能录制操作。
|
|
66
|
+
|
|
67
|
+
## 设备预览与组件树
|
|
68
|
+
|
|
69
|
+
### 设备预览
|
|
70
|
+
|
|
71
|
+
- 设备预览优先使用 Midscene Playground 的 scrcpy 实时画面,可以直接点击和滑动手机画面。
|
|
72
|
+
- 点击预览中的组件后,组件树会定位并选中对应节点,默认同时显示组件边框。
|
|
73
|
+
- 实时流不可用时会自动使用 ADB 截图轮询,避免两种画面来源相互覆盖。
|
|
74
|
+
- 画面停止更新时,可点击设备预览工具栏中的刷新按钮重新获取画面。
|
|
75
|
+
|
|
76
|
+
### App 组件树
|
|
77
|
+
|
|
78
|
+
- 首次进入页面、切换设备、Activity 变化或页面结构变化后,组件树会自动刷新。
|
|
79
|
+
- 自动刷新会尽量保留仍然存在的已选节点。
|
|
80
|
+
- 录制操作、回放和手动刷新期间会暂停自动刷新,结束后自动恢复。
|
|
81
|
+
- 组件树支持横向和纵向滚动;下方“当前 Activity”最多显示三行。
|
|
82
|
+
- 手动点击“刷新组件树”可立即重新抓取当前页面结构。
|
|
83
|
+
|
|
84
|
+
注意:Appium 回放和组件树抓取都会占用 Android UiAutomation。系统会按设备串行执行,并在连接被抢占时清理残留进程后自动重试一次。
|
|
85
|
+
|
|
86
|
+
## 流程图节点
|
|
87
|
+
|
|
88
|
+
录制步骤以流程图节点展示。
|
|
89
|
+
|
|
90
|
+
节点类型:
|
|
91
|
+
|
|
92
|
+
- 操作:执行点击、输入、滑动、返回等动作。
|
|
93
|
+
- 判断:根据页面状态走“是 / 否”分支。
|
|
94
|
+
- 校验:验证页面是否满足预期。
|
|
95
|
+
|
|
96
|
+
点击节点可以展开编辑面板,支持修改:
|
|
97
|
+
|
|
98
|
+
- 节点名称
|
|
99
|
+
- 备注,例如“登录按钮”“账号输入框”
|
|
100
|
+
- 节点类型
|
|
101
|
+
- 超时时间
|
|
102
|
+
- 输入文本
|
|
103
|
+
- 是否可选
|
|
104
|
+
- selector 和父级上下文 selector
|
|
105
|
+
- 判断节点的指定文本与匹配方式
|
|
106
|
+
|
|
107
|
+
流程画布支持以下操作:
|
|
108
|
+
|
|
109
|
+
- 按住空白区域或节点拖动画布。
|
|
110
|
+
- 按住 `Ctrl` 并滚动鼠标滚轮,在 `50%` 到 `200%` 之间缩放。
|
|
111
|
+
- 点击“放大”打开流程总览;总览中同样可以点击节点编辑。
|
|
112
|
+
- 点击节点后的“插入操作”可在任意步骤中间新增操作。
|
|
113
|
+
- 点击节点右上角删除按钮可移除节点,流程引用会自动修正。
|
|
114
|
+
- 浏览器刷新后会保持当前功能页面和 Appium 工作区 Tab;存在未保存修改时,刷新或关闭页面前会提示保存。
|
|
115
|
+
|
|
116
|
+
### 单 Activity 录制规则
|
|
117
|
+
|
|
118
|
+
每个脚本只允许录制一个 Activity。录制点击后如果检测到 Activity 发生变化,会强制弹出保存提示;保存完成后清空当前流程,并从新 Activity 开始录制新脚本。
|
|
119
|
+
|
|
120
|
+
加载历史脚本时,如果手机当前 Activity 与脚本入口 Activity 不一致,流程编辑会锁定。此时可执行脚本中的“启动 APP”节点,或插入“系统返回”使页面回到脚本绑定的 Activity;Activity 匹配后自动解除锁定。
|
|
121
|
+
|
|
122
|
+
## 操作说明
|
|
123
|
+
|
|
124
|
+
### 录制点击
|
|
125
|
+
|
|
126
|
+
用途:点击某个组件。
|
|
127
|
+
|
|
128
|
+
操作方法:
|
|
129
|
+
|
|
130
|
+
1. 在设备预览或组件树中选择按钮、图标、列表项等组件。
|
|
131
|
+
2. 点击“添加操作”。
|
|
132
|
+
3. 选择“录制点击”。
|
|
133
|
+
|
|
134
|
+
示例:
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
点击 登录按钮
|
|
138
|
+
点击 添加设备入口
|
|
139
|
+
点击 我的 Tab
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
适用场景:
|
|
143
|
+
|
|
144
|
+
- 点击按钮。
|
|
145
|
+
- 点击列表项。
|
|
146
|
+
- 点击页面入口。
|
|
147
|
+
|
|
148
|
+
注意:
|
|
149
|
+
|
|
150
|
+
- 优先使用组件 selector。
|
|
151
|
+
- 如果 Appium 找不到组件,会使用 bounds 坐标兜底。
|
|
152
|
+
|
|
153
|
+
### 录制输入
|
|
154
|
+
|
|
155
|
+
用途:向输入框输入文本。
|
|
156
|
+
|
|
157
|
+
操作方法:
|
|
158
|
+
|
|
159
|
+
1. 选择输入框组件。
|
|
160
|
+
2. 点击“添加操作”。
|
|
161
|
+
3. 选择“录制输入”。
|
|
162
|
+
4. 在弹窗中输入文本。
|
|
163
|
+
|
|
164
|
+
示例:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
输入 账号输入框:test@example.com
|
|
168
|
+
输入 密码输入框:123456
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
适用场景:
|
|
172
|
+
|
|
173
|
+
- 账号输入。
|
|
174
|
+
- 密码输入。
|
|
175
|
+
- 搜索框输入。
|
|
176
|
+
- 表单字段输入。
|
|
177
|
+
|
|
178
|
+
注意:
|
|
179
|
+
|
|
180
|
+
- 如果账号框和密码框底层 id 一样,录制器会自动保存父级上下文 selector;回放时会先找父级,再找子输入框。
|
|
181
|
+
- 录制后可以展开节点修改输入内容。
|
|
182
|
+
|
|
183
|
+
### 清空输入
|
|
184
|
+
|
|
185
|
+
用途:清空输入框已有内容。
|
|
186
|
+
|
|
187
|
+
操作方法:
|
|
188
|
+
|
|
189
|
+
1. 选择输入框组件。
|
|
190
|
+
2. 点击“添加操作”。
|
|
191
|
+
3. 选择“清空输入”。
|
|
192
|
+
|
|
193
|
+
示例:
|
|
194
|
+
|
|
195
|
+
```text
|
|
196
|
+
清空 搜索框
|
|
197
|
+
输入 搜索框:摄像机
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
适用场景:
|
|
201
|
+
|
|
202
|
+
- 搜索框重复测试。
|
|
203
|
+
- 输入框默认已有内容。
|
|
204
|
+
- 修改表单字段前先清空。
|
|
205
|
+
|
|
206
|
+
### 点击坐标
|
|
207
|
+
|
|
208
|
+
用途:按当前组件中心坐标点击,不依赖 selector。
|
|
209
|
+
|
|
210
|
+
操作方法:
|
|
211
|
+
|
|
212
|
+
1. 选择目标区域。
|
|
213
|
+
2. 点击“添加操作”。
|
|
214
|
+
3. 选择“点击坐标”。
|
|
215
|
+
|
|
216
|
+
示例:
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
点击坐标 540,1680
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
适用场景:
|
|
223
|
+
|
|
224
|
+
- 组件树识别不到的自绘区域。
|
|
225
|
+
- selector 不稳定,但坐标稳定的按钮。
|
|
226
|
+
|
|
227
|
+
注意:
|
|
228
|
+
|
|
229
|
+
- 对分辨率、横竖屏、布局变化敏感。
|
|
230
|
+
- 能用组件点击时,不建议优先用坐标点击。
|
|
231
|
+
|
|
232
|
+
### 长按
|
|
233
|
+
|
|
234
|
+
用途:长按某个组件或坐标。
|
|
235
|
+
|
|
236
|
+
操作方法:
|
|
237
|
+
|
|
238
|
+
1. 选择目标组件。
|
|
239
|
+
2. 点击“添加操作”。
|
|
240
|
+
3. 选择“长按”。
|
|
241
|
+
|
|
242
|
+
示例:
|
|
243
|
+
|
|
244
|
+
```text
|
|
245
|
+
长按 设备卡片
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
适用场景:
|
|
249
|
+
|
|
250
|
+
- 长按打开菜单。
|
|
251
|
+
- 长按删除列表项。
|
|
252
|
+
- 长按进入编辑模式。
|
|
253
|
+
|
|
254
|
+
默认长按时间为 `800ms`,可展开节点修改超时时间。
|
|
255
|
+
|
|
256
|
+
### 返回键
|
|
257
|
+
|
|
258
|
+
用途:执行 Android 返回键。
|
|
259
|
+
|
|
260
|
+
操作方法:
|
|
261
|
+
|
|
262
|
+
1. 点击“添加操作”。
|
|
263
|
+
2. 选择“返回键”。
|
|
264
|
+
|
|
265
|
+
示例:
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
点击设备详情
|
|
269
|
+
返回键
|
|
270
|
+
断言存在 设备列表
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
适用场景:
|
|
274
|
+
|
|
275
|
+
- 从详情页返回列表页。
|
|
276
|
+
- 关闭页面。
|
|
277
|
+
- 关闭系统弹窗或软键盘。
|
|
278
|
+
|
|
279
|
+
### Home 键
|
|
280
|
+
|
|
281
|
+
用途:执行 Android Home 键。
|
|
282
|
+
|
|
283
|
+
操作方法:
|
|
284
|
+
|
|
285
|
+
1. 点击“添加操作”。
|
|
286
|
+
2. 选择“Home 键”。
|
|
287
|
+
|
|
288
|
+
示例:
|
|
289
|
+
|
|
290
|
+
```text
|
|
291
|
+
Home 键
|
|
292
|
+
启动 App
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
适用场景:
|
|
296
|
+
|
|
297
|
+
- 验证 App 从后台恢复。
|
|
298
|
+
- 回到桌面后重新启动 App。
|
|
299
|
+
|
|
300
|
+
### 最近任务
|
|
301
|
+
|
|
302
|
+
用途:打开 Android 最近任务页面。
|
|
303
|
+
|
|
304
|
+
操作方法:
|
|
305
|
+
|
|
306
|
+
1. 点击“添加操作”。
|
|
307
|
+
2. 选择“最近任务”。
|
|
308
|
+
|
|
309
|
+
示例:
|
|
310
|
+
|
|
311
|
+
```text
|
|
312
|
+
最近任务
|
|
313
|
+
Home 键
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
适用场景:
|
|
317
|
+
|
|
318
|
+
- 验证多任务切换。
|
|
319
|
+
- 验证 App 后台状态。
|
|
320
|
+
|
|
321
|
+
### 电源键
|
|
322
|
+
|
|
323
|
+
用途:发送 Android 电源键。
|
|
324
|
+
|
|
325
|
+
操作方法:
|
|
326
|
+
|
|
327
|
+
1. 点击“添加操作”。
|
|
328
|
+
2. 选择“电源键”。
|
|
329
|
+
|
|
330
|
+
示例:
|
|
331
|
+
|
|
332
|
+
```text
|
|
333
|
+
电源键
|
|
334
|
+
添加延时 1000ms
|
|
335
|
+
电源键
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
适用场景:
|
|
339
|
+
|
|
340
|
+
- 锁屏 / 亮屏相关测试。
|
|
341
|
+
|
|
342
|
+
注意:
|
|
343
|
+
|
|
344
|
+
- 不同设备锁屏行为可能不同。
|
|
345
|
+
- 自动化回放时请确认设备不会因锁屏无法继续操作。
|
|
346
|
+
|
|
347
|
+
### 滑动
|
|
348
|
+
|
|
349
|
+
用途:执行上、下、左、右滑动。
|
|
350
|
+
|
|
351
|
+
操作方法:
|
|
352
|
+
|
|
353
|
+
1. 点击“添加操作”。
|
|
354
|
+
2. 选择“滑动”。
|
|
355
|
+
3. 输入方向:`上`、`下`、`左`、`右`。
|
|
356
|
+
|
|
357
|
+
示例:
|
|
358
|
+
|
|
359
|
+
```text
|
|
360
|
+
下滑
|
|
361
|
+
断言存在 下一页内容
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
适用场景:
|
|
365
|
+
|
|
366
|
+
- 列表滚动。
|
|
367
|
+
- 页面翻页。
|
|
368
|
+
- 轮播切换。
|
|
369
|
+
|
|
370
|
+
### 双指缩放
|
|
371
|
+
|
|
372
|
+
用途:执行双指放大或缩小。
|
|
373
|
+
|
|
374
|
+
操作方法:
|
|
375
|
+
|
|
376
|
+
1. 点击“添加操作”。
|
|
377
|
+
2. 选择“双指缩放”。
|
|
378
|
+
3. 输入方向:`放大` 或 `缩小`。
|
|
379
|
+
|
|
380
|
+
示例:
|
|
381
|
+
|
|
382
|
+
```text
|
|
383
|
+
双指放大
|
|
384
|
+
双指缩小
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
适用场景:
|
|
388
|
+
|
|
389
|
+
- 地图缩放。
|
|
390
|
+
- 图片预览缩放。
|
|
391
|
+
- 视频画面缩放。
|
|
392
|
+
|
|
393
|
+
### 启动 App
|
|
394
|
+
|
|
395
|
+
用途:启动当前选择的预设 App。
|
|
396
|
+
|
|
397
|
+
操作方法:
|
|
398
|
+
|
|
399
|
+
1. 先选择预设 App 参数。
|
|
400
|
+
2. 在录制步骤的“开始”节点下点击“插入操作”。
|
|
401
|
+
3. 选择“启动 App”,该操作会作为流程第一步插入。
|
|
402
|
+
|
|
403
|
+
示例:
|
|
404
|
+
|
|
405
|
+
```text
|
|
406
|
+
启动 App
|
|
407
|
+
等待 Activity com.example.MainActivity
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
适用场景:
|
|
411
|
+
|
|
412
|
+
- 脚本第一步启动目标 App。
|
|
413
|
+
- 从桌面或其他 App 回到目标 App。
|
|
414
|
+
|
|
415
|
+
“启动 APP”只能从开始节点添加,并且每个脚本只能有一个启动节点。添加后菜单中的“启动 App”会自动置灰,删除该节点后恢复可用。启动时会通过 ADB 使用当前预设 App 参数中保存的包名打开应用。
|
|
416
|
+
|
|
417
|
+
录制时可以点击启动节点上的执行按钮立即启动 App,并刷新当前 Activity。回放前会先检查目标 App 是否已在前台:已经启动时跳过“启动 APP”节点并保留当前页面;通过“连接脚本”进入子脚本时,也会跳过子脚本中的启动节点。
|
|
418
|
+
|
|
419
|
+
### 添加延时
|
|
420
|
+
|
|
421
|
+
用途:等待固定时间。
|
|
422
|
+
|
|
423
|
+
操作方法:
|
|
424
|
+
|
|
425
|
+
1. 点击“添加操作”。
|
|
426
|
+
2. 选择“添加延时”。
|
|
427
|
+
3. 输入毫秒数。
|
|
428
|
+
|
|
429
|
+
也可以在流程节点后点击“插入延时”。
|
|
430
|
+
|
|
431
|
+
示例:
|
|
432
|
+
|
|
433
|
+
```text
|
|
434
|
+
点击 登录按钮
|
|
435
|
+
添加延时 1000ms
|
|
436
|
+
断言存在 首页元素
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
适用场景:
|
|
440
|
+
|
|
441
|
+
- 等动画结束。
|
|
442
|
+
- 等网络请求短暂完成。
|
|
443
|
+
- 等系统弹窗出现。
|
|
444
|
+
|
|
445
|
+
注意:
|
|
446
|
+
|
|
447
|
+
- 优先使用“等待 Activity”“断言存在”等状态等待。
|
|
448
|
+
- 固定延时越多,脚本越慢。
|
|
449
|
+
|
|
450
|
+
### 判断存在
|
|
451
|
+
|
|
452
|
+
用途:判断某个组件或指定文本是否出现,并根据结果走不同分支。它可以用于弹窗,也可以用于按钮、列表项、提示文案等普通页面组件。
|
|
453
|
+
|
|
454
|
+
操作方法:
|
|
455
|
+
|
|
456
|
+
1. 选择目标组件上的稳定元素,例如标题、按钮、列表项或提示文案。
|
|
457
|
+
2. 点击“添加操作”。
|
|
458
|
+
3. 选择“判断存在”。
|
|
459
|
+
4. 点击判断节点,按需填写“指定文本”。
|
|
460
|
+
5. 选择“模糊匹配(包含)”或“精准匹配(完全一致)”。
|
|
461
|
+
6. 在“是”或“否”分支下点击“插入操作”,分别添加分支步骤。
|
|
462
|
+
7. 需要回到判断后的主流程时,点击分支旁的“连接到下一节点”;连接成功后按钮变为“取消连接”。
|
|
463
|
+
|
|
464
|
+
示例:
|
|
465
|
+
|
|
466
|
+
```text
|
|
467
|
+
判断存在 确认按钮
|
|
468
|
+
是 -> 点击 确认按钮
|
|
469
|
+
否 -> 继续主流程
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
分支说明:
|
|
473
|
+
|
|
474
|
+
- 未配置指定文本时,只判断目标组件是否存在。
|
|
475
|
+
- 配置指定文本后,会同时检查组件及其子节点文本。
|
|
476
|
+
- 模糊匹配会忽略换行和连续空白差异,只要规范化后的文本包含目标内容即可。
|
|
477
|
+
- 精准匹配要求 Appium 返回的完整文本与指定文本完全一致。
|
|
478
|
+
- 分支可以包含多个连续步骤,也可以在分支末尾连接其他脚本。
|
|
479
|
+
- “连接到下一节点”只在判断后仍有主流程节点时显示。
|
|
480
|
+
|
|
481
|
+
适用场景:
|
|
482
|
+
|
|
483
|
+
- 首次启动确认弹窗。
|
|
484
|
+
- 权限说明弹窗。
|
|
485
|
+
- 活动弹窗。
|
|
486
|
+
- 只出现一次的引导弹窗。
|
|
487
|
+
|
|
488
|
+
### 判断同组件不同内容弹窗
|
|
489
|
+
|
|
490
|
+
用途:同一个页面有两个弹窗复用同一个组件,只是标题或正文不同,需要按文案区分弹窗类型。
|
|
491
|
+
|
|
492
|
+
操作方法:
|
|
493
|
+
|
|
494
|
+
1. 选择能覆盖弹窗正文的节点;如果文本位于子节点中,也可以选择其稳定父容器。
|
|
495
|
+
2. 点击“添加操作”。
|
|
496
|
+
3. 选择“判断存在”。
|
|
497
|
+
4. 展开节点,在“指定文本”中输入该弹窗特有的文案。
|
|
498
|
+
5. 根据需要选择模糊匹配或精准匹配。
|
|
499
|
+
6. 在“是”分支添加该弹窗对应的确认、取消或关闭步骤;“否”分支继续下一个判断或主流程。
|
|
500
|
+
|
|
501
|
+
示例:
|
|
502
|
+
|
|
503
|
+
```text
|
|
504
|
+
判断存在:指定文本“是否删除设备”
|
|
505
|
+
是 -> 点击 确定
|
|
506
|
+
否 -> 判断存在:指定文本“是否退出登录”
|
|
507
|
+
是 -> 点击 确定
|
|
508
|
+
否 -> 继续主流程
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
适用场景:
|
|
512
|
+
|
|
513
|
+
- 两个弹窗 `resource-id`、按钮 id、class 都一样。
|
|
514
|
+
- 同一个弹窗组件展示不同业务文案。
|
|
515
|
+
- 需要根据弹窗内容执行不同分支。
|
|
516
|
+
|
|
517
|
+
注意:
|
|
518
|
+
|
|
519
|
+
- 弹窗不是必出现时,先用“判断存在”形成分支,不要直接使用“断言文本”,否则弹窗未出现会让回放失败。
|
|
520
|
+
- 不要只判断“确定”按钮是否存在,这会把两个弹窗都识别成同一种弹窗。
|
|
521
|
+
- 优先用弹窗标题、正文、关键提示文案作为判断目标。
|
|
522
|
+
- 节点详情里的 selector 会显示当前 Activity,方便确认该定位属于哪个页面。
|
|
523
|
+
|
|
524
|
+
### 存在则点击
|
|
525
|
+
|
|
526
|
+
用途:元素出现时点击,不出现时跳过。
|
|
527
|
+
|
|
528
|
+
操作方法:
|
|
529
|
+
|
|
530
|
+
1. 选择可能出现的按钮,例如权限确认、协议同意、活动关闭。
|
|
531
|
+
2. 点击“添加操作”。
|
|
532
|
+
3. 选择“存在则点击”。
|
|
533
|
+
|
|
534
|
+
示例:
|
|
535
|
+
|
|
536
|
+
```text
|
|
537
|
+
存在则点击 同意按钮
|
|
538
|
+
存在则点击 关闭活动弹窗
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
适用场景:
|
|
542
|
+
|
|
543
|
+
- 一次性弹窗。
|
|
544
|
+
- 偶尔出现的活动弹窗。
|
|
545
|
+
- 首次启动协议确认。
|
|
546
|
+
|
|
547
|
+
### 存在则输入
|
|
548
|
+
|
|
549
|
+
用途:输入框出现时输入文本,不出现时跳过。
|
|
550
|
+
|
|
551
|
+
操作方法:
|
|
552
|
+
|
|
553
|
+
1. 选择可能出现的输入框。
|
|
554
|
+
2. 点击“添加操作”。
|
|
555
|
+
3. 选择“存在则输入”。
|
|
556
|
+
4. 在居中弹窗中输入文本。
|
|
557
|
+
|
|
558
|
+
示例:
|
|
559
|
+
|
|
560
|
+
```text
|
|
561
|
+
存在则输入 搜索框:摄像机
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
录制后可展开节点修改输入内容。
|
|
565
|
+
|
|
566
|
+
### 存在则清空
|
|
567
|
+
|
|
568
|
+
用途:输入框出现时清空,不出现时跳过。
|
|
569
|
+
|
|
570
|
+
示例:
|
|
571
|
+
|
|
572
|
+
```text
|
|
573
|
+
存在则清空 搜索框
|
|
574
|
+
存在则输入 搜索框:摄像机
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### 存在则返回
|
|
578
|
+
|
|
579
|
+
用途:某个遮挡元素或页面出现时执行返回键,不出现时跳过。
|
|
580
|
+
|
|
581
|
+
示例:
|
|
582
|
+
|
|
583
|
+
```text
|
|
584
|
+
存在则返回 权限说明页
|
|
585
|
+
存在则返回 引导页
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
适用场景:
|
|
589
|
+
|
|
590
|
+
- 临时引导页。
|
|
591
|
+
- 偶尔出现的中间页。
|
|
592
|
+
- 可通过系统返回关闭的遮挡页面。
|
|
593
|
+
|
|
594
|
+
### 等待出现
|
|
595
|
+
|
|
596
|
+
用途:等待页面加载到某个目标状态。
|
|
597
|
+
|
|
598
|
+
操作方法:
|
|
599
|
+
|
|
600
|
+
1. 选择目标页面的稳定元素。
|
|
601
|
+
2. 点击“添加操作”。
|
|
602
|
+
3. 选择“等待出现”。
|
|
603
|
+
|
|
604
|
+
示例:
|
|
605
|
+
|
|
606
|
+
```text
|
|
607
|
+
点击 登录按钮
|
|
608
|
+
等待出现 首页设备列表
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
适用场景:
|
|
612
|
+
|
|
613
|
+
- 页面跳转后等待目标元素出现。
|
|
614
|
+
- 单 Activity App 无法通过 Activity 判断页面时。
|
|
615
|
+
|
|
616
|
+
### 断言存在
|
|
617
|
+
|
|
618
|
+
用途:校验页面上必须存在某个组件。
|
|
619
|
+
|
|
620
|
+
操作方法:
|
|
621
|
+
|
|
622
|
+
1. 选择目标组件。
|
|
623
|
+
2. 点击“添加操作”。
|
|
624
|
+
3. 选择“断言存在”。
|
|
625
|
+
|
|
626
|
+
示例:
|
|
627
|
+
|
|
628
|
+
```text
|
|
629
|
+
断言存在 首页设备列表
|
|
630
|
+
断言存在 登录失败提示
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
适用场景:
|
|
634
|
+
|
|
635
|
+
- 校验登录成功。
|
|
636
|
+
- 校验页面跳转成功。
|
|
637
|
+
- 校验按钮或列表存在。
|
|
638
|
+
|
|
639
|
+
注意:
|
|
640
|
+
|
|
641
|
+
- 断言失败表示测试失败。
|
|
642
|
+
- 不建议用于可有可无的弹窗。
|
|
643
|
+
|
|
644
|
+
### 断言文本
|
|
645
|
+
|
|
646
|
+
用途:校验组件文本是否包含指定内容。
|
|
647
|
+
|
|
648
|
+
操作方法:
|
|
649
|
+
|
|
650
|
+
1. 选择带文本的组件。
|
|
651
|
+
2. 点击“添加操作”。
|
|
652
|
+
3. 选择“断言文本”。
|
|
653
|
+
4. 输入要校验的文本。
|
|
654
|
+
|
|
655
|
+
示例:
|
|
656
|
+
|
|
657
|
+
```text
|
|
658
|
+
断言文本 登录失败提示:密码错误
|
|
659
|
+
断言文本 页面标题:设备
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
适用场景:
|
|
663
|
+
|
|
664
|
+
- 校验错误提示。
|
|
665
|
+
- 校验标题。
|
|
666
|
+
- 校验列表文案。
|
|
667
|
+
|
|
668
|
+
### 等待元素消失
|
|
669
|
+
|
|
670
|
+
用途:等待某个组件从页面上消失。
|
|
671
|
+
|
|
672
|
+
操作方法:
|
|
673
|
+
|
|
674
|
+
1. 选择 loading、弹窗或遮罩组件。
|
|
675
|
+
2. 点击“添加操作”。
|
|
676
|
+
3. 选择“等待元素消失”。
|
|
677
|
+
|
|
678
|
+
示例:
|
|
679
|
+
|
|
680
|
+
```text
|
|
681
|
+
点击 登录按钮
|
|
682
|
+
等待元素消失 loading
|
|
683
|
+
断言存在 首页设备列表
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
适用场景:
|
|
687
|
+
|
|
688
|
+
- 等 loading 结束。
|
|
689
|
+
- 等弹窗关闭。
|
|
690
|
+
- 等遮罩消失。
|
|
691
|
+
|
|
692
|
+
### 等待 Activity
|
|
693
|
+
|
|
694
|
+
用途:等待 Android 当前 Activity 切换到指定值。
|
|
695
|
+
|
|
696
|
+
操作方法:
|
|
697
|
+
|
|
698
|
+
1. 点击“添加操作”。
|
|
699
|
+
2. 选择“等待 Activity”。
|
|
700
|
+
3. 输入目标 Activity。
|
|
701
|
+
|
|
702
|
+
示例:
|
|
703
|
+
|
|
704
|
+
```text
|
|
705
|
+
点击 登录按钮
|
|
706
|
+
等待 Activity com.example.MainActivity
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
适用场景:
|
|
710
|
+
|
|
711
|
+
- 点击按钮后进入新页面。
|
|
712
|
+
- 启动 App 后等待首页 Activity。
|
|
713
|
+
|
|
714
|
+
注意:
|
|
715
|
+
|
|
716
|
+
- 有些 App 使用单 Activity 架构,Activity 不会变化,这时应改用“断言存在”判断页面元素。
|
|
717
|
+
|
|
718
|
+
### 连接脚本
|
|
719
|
+
|
|
720
|
+
用途:把一个已保存脚本连接到当前脚本后继续执行。
|
|
721
|
+
|
|
722
|
+
操作方法:
|
|
723
|
+
|
|
724
|
+
1. 先保存被连接的脚本,例如“首页脚本”。
|
|
725
|
+
2. 打开当前脚本,例如“登录脚本”。
|
|
726
|
+
3. 在主流程节点或判断分支下点击“插入操作”。
|
|
727
|
+
4. 选择“连接脚本”,再选择目标脚本。
|
|
728
|
+
5. 保存当前脚本。
|
|
729
|
+
|
|
730
|
+
校验规则:
|
|
731
|
+
|
|
732
|
+
- 主流程中连接脚本:插入点 Activity 优先使用前一步录制的 `pageAfter.activity`,只允许选择入口 Activity 与插入点一致的脚本。
|
|
733
|
+
- 判断分支中连接脚本:允许选择同一 App 的其他 Activity 脚本,适合登录成功后进入首页等跳转路径。
|
|
734
|
+
- 分支连接在回放时会等待手机进入目标脚本的入口 Activity;页面没有真正跳转时会超时失败,不会提前执行其他页面的步骤。
|
|
735
|
+
- 目标脚本必须属于当前 App,且不能连接当前脚本自身。
|
|
736
|
+
- 脚本互相连接形成循环时,回放会终止并提示循环连接。
|
|
737
|
+
|
|
738
|
+
示例:
|
|
739
|
+
|
|
740
|
+
```text
|
|
741
|
+
登录脚本:
|
|
742
|
+
输入账号
|
|
743
|
+
输入密码
|
|
744
|
+
点击登录
|
|
745
|
+
连接脚本:首页脚本
|
|
746
|
+
|
|
747
|
+
首页脚本:
|
|
748
|
+
启动 App
|
|
749
|
+
断言存在 首页元素
|
|
750
|
+
点击设备列表
|
|
751
|
+
断言存在 设备详情
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
适用场景:
|
|
755
|
+
|
|
756
|
+
- 测试人员不知道点击后页面是什么。
|
|
757
|
+
- 登录流程和首页流程由不同人录制。
|
|
758
|
+
- 复用公共前置流程。
|
|
759
|
+
|
|
760
|
+
回放行为:
|
|
761
|
+
|
|
762
|
+
- 不重新创建 Appium session。
|
|
763
|
+
- 子脚本中的“启动 App”节点会自动跳过,不会重新启动 App。
|
|
764
|
+
- 在当前页面状态继续执行目标脚本。
|
|
765
|
+
- 子脚本单独回放时仍会正常执行自己的“启动 App”节点。
|
|
766
|
+
- 如果脚本互相连接形成循环,会终止并提示循环连接。
|
|
767
|
+
|
|
768
|
+
## 脚本保存与管理
|
|
769
|
+
|
|
770
|
+
### 保存和更新
|
|
771
|
+
|
|
772
|
+
- 新脚本需要填写名称并选择预设 App 后保存。
|
|
773
|
+
- 从顶部脚本下拉框或“脚本列表”加载历史脚本后,再次点击“保存”会更新原脚本,不会因为名称相同而报错。
|
|
774
|
+
- 脚本数据只保存流程图 `flow_json`,其中包含主流程、判断分支、连接关系、节点备注和页面检查点。
|
|
775
|
+
- 已保存脚本加载后会校验当前 Activity;页面不匹配时按“单 Activity 录制规则”锁定编辑。
|
|
776
|
+
|
|
777
|
+
### 脚本列表
|
|
778
|
+
|
|
779
|
+
在“录制与脚本”区域切换到“脚本列表”Tab,可以:
|
|
780
|
+
|
|
781
|
+
- 加载脚本:回到“当前录制”继续查看、编辑或回放。
|
|
782
|
+
- 下载脚本:导出包含完整流程的 JSON 文件。
|
|
783
|
+
- 导入脚本:选择此前导出的 JSON 文件;名称重复时自动生成新名称,不覆盖已有脚本。
|
|
784
|
+
- 删除脚本:删除数据库中的已录制脚本。
|
|
785
|
+
|
|
786
|
+
导入脚本后仍需在本机配置对应的预设 App,并连接可用的 Android 设备。
|
|
787
|
+
|
|
788
|
+
## 回放输出与报告
|
|
789
|
+
|
|
790
|
+
### 实时日志
|
|
791
|
+
|
|
792
|
+
点击“回放”后,日志会随着执行过程实时追加,不需要等待整个脚本结束。所有流程统一使用 `[节点 N]` 编号,常见内容包括:
|
|
793
|
+
|
|
794
|
+
```text
|
|
795
|
+
[节点 1] 开始:启动 APP com.example.app
|
|
796
|
+
[节点 1] 结果:APP 已在前台,跳过启动 com.example.app
|
|
797
|
+
[节点 1] 完成:启动 APP com.example.app
|
|
798
|
+
[节点 2] 判断:是
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
“回放输出”默认只保留最近 `80` 行的可视高度,避免无限撑长页面。可以使用:
|
|
802
|
+
|
|
803
|
+
- 复制:复制当前完整日志。
|
|
804
|
+
- 展开查看:在弹窗中查看完整日志。
|
|
805
|
+
- 清除:清空页面上的回放输出。
|
|
806
|
+
|
|
807
|
+
### Markdown 回放报告
|
|
808
|
+
|
|
809
|
+
每次回放结束后,无论成功或失败,都会生成 Markdown 报告。文件名格式为:
|
|
810
|
+
|
|
811
|
+
```text
|
|
812
|
+
当前日期时间-脚本名称.md
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
报告保存到“参数配置 > 运行配置”指定的目录;没有指定时,默认保存在启动命令所在目录的 `output` 文件夹中,例如:
|
|
816
|
+
|
|
817
|
+
```text
|
|
818
|
+
output/2026-08-21_17-13-42-831-登录流程.md
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
报告包含:
|
|
822
|
+
|
|
823
|
+
- 脚本、App、Activity、设备、执行时间和结果。
|
|
824
|
+
- 每个节点的类型、selector、上下文 selector、输入值、超时、备注和分支配置。
|
|
825
|
+
- 每个节点的实际执行状态与执行信息。
|
|
826
|
+
- 完整回放日志。
|
|
827
|
+
|
|
828
|
+
生成成功后,报告绝对路径会追加到实时回放日志中,并保存到数据库,便于后续追溯。
|
|
829
|
+
|
|
830
|
+
## 组合示例
|
|
831
|
+
|
|
832
|
+
### 示例 1:登录成功后连接首页脚本
|
|
833
|
+
|
|
834
|
+
登录脚本:
|
|
835
|
+
|
|
836
|
+
```text
|
|
837
|
+
启动 App
|
|
838
|
+
输入 账号
|
|
839
|
+
输入 密码
|
|
840
|
+
判断存在 用户协议弹窗
|
|
841
|
+
是 -> 点击 同意
|
|
842
|
+
否 -> 连接到下一节点
|
|
843
|
+
点击 登录
|
|
844
|
+
判断登录是否成功
|
|
845
|
+
是 -> 连接脚本 首页脚本
|
|
846
|
+
否 -> 断言文本 登录错误提示
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
首页脚本:
|
|
850
|
+
|
|
851
|
+
```text
|
|
852
|
+
启动 App
|
|
853
|
+
断言存在 首页设备列表
|
|
854
|
+
点击 添加设备
|
|
855
|
+
断言存在 添加设备页面标题
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
适合场景:
|
|
859
|
+
|
|
860
|
+
- 录制登录时不知道登录成功后跳到哪个页面。
|
|
861
|
+
- 首页流程希望独立维护。
|
|
862
|
+
|
|
863
|
+
### 示例 2:登录成功 / 失败分支
|
|
864
|
+
|
|
865
|
+
```text
|
|
866
|
+
输入 账号
|
|
867
|
+
输入 密码
|
|
868
|
+
点击 登录
|
|
869
|
+
判断 首页设备列表是否存在
|
|
870
|
+
是 -> 断言存在 首页设备列表
|
|
871
|
+
否 -> 断言文本 登录错误提示
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
操作方法:
|
|
875
|
+
|
|
876
|
+
1. 先录制输入和点击登录。
|
|
877
|
+
2. 选择用于区分登录结果的稳定元素,添加“判断存在”。
|
|
878
|
+
3. 在“是”分支插入首页校验或“连接脚本”。
|
|
879
|
+
4. 在“否”分支插入错误提示断言。
|
|
880
|
+
5. 需要继续执行判断后的公共步骤时,点击对应分支的“连接到下一节点”。
|
|
881
|
+
|
|
882
|
+
### 示例 3:一次性弹窗
|
|
883
|
+
|
|
884
|
+
```text
|
|
885
|
+
启动 App
|
|
886
|
+
判断存在 确认按钮
|
|
887
|
+
是 -> 点击 确认按钮
|
|
888
|
+
否 -> 连接到下一节点
|
|
889
|
+
断言存在 首页
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
适合场景:
|
|
893
|
+
|
|
894
|
+
- 只第一次安装后出现的确认弹窗。
|
|
895
|
+
- 老用户不再出现的弹窗。
|
|
896
|
+
|
|
897
|
+
### 示例 4:列表滚动查找元素
|
|
898
|
+
|
|
899
|
+
```text
|
|
900
|
+
启动 App
|
|
901
|
+
断言存在 列表页标题
|
|
902
|
+
上滑
|
|
903
|
+
添加延时 500ms
|
|
904
|
+
断言存在 目标列表项
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
如果列表加载慢,可以把固定延时换成目标元素断言。
|
|
908
|
+
|
|
909
|
+
### 示例 5:从详情页返回列表页
|
|
910
|
+
|
|
911
|
+
```text
|
|
912
|
+
点击 设备卡片
|
|
913
|
+
断言存在 设备详情标题
|
|
914
|
+
返回键
|
|
915
|
+
断言存在 设备列表
|
|
916
|
+
```
|
|
917
|
+
|
|
918
|
+
适合场景:
|
|
919
|
+
|
|
920
|
+
- 校验页面返回路径。
|
|
921
|
+
- 校验返回后列表仍可见。
|
|
922
|
+
|
|
923
|
+
## 常见问题
|
|
924
|
+
|
|
925
|
+
### 同一个 id 定位到错误输入框怎么办
|
|
926
|
+
|
|
927
|
+
如果账号框和密码框都是 `id/tg_edit`,只按 id 回放可能输入到第一个输入框。
|
|
928
|
+
|
|
929
|
+
建议:
|
|
930
|
+
|
|
931
|
+
- 直接分别选择账号框和密码框录制输入。
|
|
932
|
+
- 在节点详情里确认 selector 是否显示“重复 N”,以及“推荐定位”是否显示父级 + 子级。
|
|
933
|
+
- 如果推荐定位不准确,展开录制步骤,手动修改父级上下文 selector。
|
|
934
|
+
- 坐标点击只作为最后兜底。
|
|
935
|
+
|
|
936
|
+
### 点击后没有检测到页面跳转怎么办
|
|
937
|
+
|
|
938
|
+
可能原因:
|
|
939
|
+
|
|
940
|
+
- 按钮当前禁用。
|
|
941
|
+
- 账号密码不正确。
|
|
942
|
+
- App 使用单 Activity,Activity 不变化。
|
|
943
|
+
- 页面跳转依赖网络。
|
|
944
|
+
|
|
945
|
+
推荐:
|
|
946
|
+
|
|
947
|
+
- 使用“断言存在”判断下个页面核心元素。
|
|
948
|
+
- 多 Activity 页面可以拆成两个脚本,在判断分支中用“连接脚本”串起来;回放会等待目标 Activity 出现。
|
|
949
|
+
- 单 Activity App 不要依赖 Activity 变化,应使用页面核心元素判断是否已进入目标状态。
|
|
950
|
+
|
|
951
|
+
### 为什么连接脚本提示入口 Activity 不匹配
|
|
952
|
+
|
|
953
|
+
- 主流程连接要求目标脚本入口 Activity 与当前插入点一致,适合复用同一页面上的公共流程。
|
|
954
|
+
- 登录后进入首页等跨 Activity 场景,应先添加“判断存在”,再在“是”或“否”分支中添加“连接脚本”。
|
|
955
|
+
- 分支连接允许选择同一 App 的其他 Activity,但不会主动跳转页面;前面的点击或输入必须真正触发跳转。
|
|
956
|
+
- 如果页面未跳转,回放会在等待目标 Activity 超时后失败,这是为了防止在错误页面执行目标脚本。
|
|
957
|
+
|
|
958
|
+
### 弹窗只出现一次怎么办
|
|
959
|
+
|
|
960
|
+
使用“判断存在”。
|
|
961
|
+
|
|
962
|
+
```text
|
|
963
|
+
判断存在 确认按钮
|
|
964
|
+
是 -> 点击 确认按钮
|
|
965
|
+
否 -> 继续主流程
|
|
966
|
+
```
|
|
967
|
+
|
|
968
|
+
不要直接把弹窗确认按钮作为普通必选点击,否则弹窗不出现时脚本会失败。
|
|
969
|
+
|
|
970
|
+
### 什么时候用等待 Activity
|
|
971
|
+
|
|
972
|
+
适合多 Activity App。
|
|
973
|
+
|
|
974
|
+
如果 App 是单 Activity 架构,优先用:
|
|
975
|
+
|
|
976
|
+
```text
|
|
977
|
+
断言存在 页面核心元素
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
### 什么时候用可选步骤
|
|
981
|
+
|
|
982
|
+
可选步骤适合非主流程阻塞项:
|
|
983
|
+
|
|
984
|
+
- 权限弹窗
|
|
985
|
+
- 协议弹窗
|
|
986
|
+
- 活动弹窗
|
|
987
|
+
- 首次引导
|
|
988
|
+
|
|
989
|
+
不建议把登录按钮、提交按钮、核心断言设置为可选。
|
|
990
|
+
|
|
991
|
+
### 回放时出现 UiAutomation not connected 怎么办
|
|
992
|
+
|
|
993
|
+
组件树刷新和 Appium 回放不能同时占用 UiAutomation。当前版本会在回放期间暂停组件树自动刷新,并在断开时清理残留抓取进程后重试一次。
|
|
994
|
+
|
|
995
|
+
如果仍然失败:
|
|
996
|
+
|
|
997
|
+
1. 确认手机保持解锁,USB 调试授权没有失效。
|
|
998
|
+
2. 确认 Appium 和 UiAutomator2 Driver 已正常启动。
|
|
999
|
+
3. 停止其他正在抓取同一设备组件树的工具。
|
|
1000
|
+
4. 重新连接设备后再次回放。
|
|
1001
|
+
|
|
1002
|
+
### 设备预览或组件树没有更新怎么办
|
|
1003
|
+
|
|
1004
|
+
1. 先确认设备仍显示在设备下拉框中。
|
|
1005
|
+
2. 点击设备预览刷新按钮重新获取画面。
|
|
1006
|
+
3. 点击“刷新组件树”重新抓取页面结构。
|
|
1007
|
+
4. 回放期间组件树自动刷新会暂停,回放完成后会自动恢复。
|
|
1008
|
+
|
|
1009
|
+
## 推荐录制规范
|
|
1010
|
+
|
|
1011
|
+
- 每个脚本只负责一个清晰场景。
|
|
1012
|
+
- 登录、首页、详情页可以拆成多个脚本,用“连接脚本”组合。
|
|
1013
|
+
- 每次页面跳转后,添加一个“断言存在”或“等待 Activity”。
|
|
1014
|
+
- 弹窗或其他可选组件使用“判断存在”,不要直接写死必点。
|
|
1015
|
+
- 坐标点击只作为兜底。
|
|
1016
|
+
- 给关键节点填写“登录按钮”“账号输入框”等备注,方便查看流程和报告。
|
|
1017
|
+
- 判断分支需要回到主流程时,明确点击“连接到下一节点”。
|
|
1018
|
+
- 回放失败后优先查看“回放输出”中的失败节点、Activity 和 selector,再打开 `output` 中的 Markdown 报告查看完整配置。
|