新手写流程,喜欢把所有指令堆在一个流程里。 采集、登录、翻页、写Excel全塞在一起,200多行指令,改一个地方要找半天,出错了也不好定位。
核心方法:按功能拆分子流程,用ABCD编号法命名,每个子流程只做一件事。
一、为什么要拆分子流程?
不拆的后果:
- 一个流程超过50个指令,拖拽找指令都费劲
- 某一步报错,整个流程重跑,浪费时间
- 换个平台(拼多多→淘宝),要复制整个流程改,维护两套
- 别人看不懂你的流程,没法协作
拆了的好处:
- 每个子流程可以单独测试、单独调试
- 公共功能(如登录、写入表格)一次写好,到处复用
- 报错时日志显示“登录子流程第12行”,秒定位
- 社区版30分钟可以只跑部分子流程测试
二、ABCD编号法:让子流程一目了然
影道里子流程默认叫“子流程1”“子流程2”,时间久了根本记不住。 推荐用 ABCD编号法 命名,一看就知道顺序和功能。
命名规则
| 前缀 | 含义 | 示例 |
|---|---|---|
| A_ | 主流程入口(唯一) | A_Main |
| B_ | 初始化/准备阶段 | B_Login, B_LoadConfig |
| C_ | 核心采集/业务逻辑 | C_CollectProduct, C_ParseDetail |
| D_ | 数据处理/输出 | D_WriteToExcel, D_SendReport |
| E_ | 异常处理/清理 | E_Retry, E_ClosePopup, E_Logout |
数字编号: 每个字母后跟两位数字,表示执行顺序。
A_Main
├── B01_Login
├── B02_LoadKeywords
├── C01_SearchProduct
├── C02_CollectList
├── C03_ParseDetail
├── D01_WriteExcel
└── E01_Logout
这样排序时,影刀画布里会按字母+数字自然排序,不会乱。
三、拆分原则:一个子流程只做一件事
判断标准: 这个子流程能否用一句话描述清楚?
- “登录淘宝” ✅ 可以
- “登录淘宝然后搜索商品然后采集” ❌ 太宽泛
实操:把一个大流程拆成5个子流程
以“拼多多商品采集”为例:
原流程(200行): 打开网页→登录→输入关键词→点击搜索→等待加载→循环商品列表→获取标题→获取价格→获取销量→翻页判断→写入Excel→关闭浏览器
拆分后:
# A_Main(主流程,只有调用指令)
调用子流程:B01_Login
调用子流程:B02_LoadKeywords
调用子流程:C01_SearchAndCollect
调用子流程:D01_SaveToExcel
调用子流程:E01_CloseBrowser
# B01_Login:只做登录
打开网页:"https://pinduoduo.com"
判断是否已登录,如未登录则扫码/账密登录
等待登录成功标志出现
# B02_LoadKeywords:只做关键词加载
从Excel读取A列关键词 → 存入列表变量“关键词列表”
输出日志:"共加载{关键词列表长度}个关键词"
# C01_SearchAndCollect:循环搜索+采集
循环列表:关键词列表
输入关键词到搜索框,点击搜索
等待搜索结果加载
调用子流程:C02_CollectCurrentPage # 采集当前页
调用子流程:C03_CheckNextPage # 翻页判断
# C02_CollectCurrentPage:只采集当前页商品
获取相似元素列表:商品容器
循环元素列表
提取标题、价格、销量
存入临时数据列表
# C03_CheckNextPage:只做翻页判断
判断“下一页”按钮是否存在且未禁用
如存在则点击,返回True;否则返回False
# D01_SaveToExcel:只做写入
将采集到的数据列表写入Excel,自动生成表头
# E01_CloseBrowser:只做清理
关闭浏览器标签页
清空全局变量(可选)
每个子流程不超过30个指令,调试时只需运行单个子流程。
四、子流程参数传递:输入和输出
拆分了就要传数据。影刀子流程支持“输入参数”和“输出参数”。
设置输入参数
- 打开子流程,点击顶部“流程参数”
- 添加输入参数,如“关键词”(文本类型)
- 在子流程里直接用
{关键词}变量
# 子流程:C01_SearchAndCollect
# 输入参数:关键词(文本)
# 输出参数:采集结果(列表)
# 使用输入参数
输入文本://input[@class='search'],内容={关键词}
点击搜索
# 采集完成后,设置输出参数
设置输出参数:采集结果 = 商品数据列表
调用时传递参数
# 在A_Main中调用
调用子流程:C01_SearchAndCollect
输入参数:关键词 = {当前关键词}
输出参数存入:当前商品列表
# 再把结果汇总
容易踩的坑: 参数类型不匹配。输入参数是文本,你传了个列表进去会报错。在调用前用“转为文本”或“转为列表”转换。
五、子流程的复用:一次编写,多处调用
写好一个子流程,可以在不同主流程里重复使用。
典型可复用的子流程:
- 登录(淘宝/拼多多/小红书,各自写一个)
- 写入Excel(通用)
- 发送飞书通知(通用)
- 验证码处理(通用)
- 异常重试(通用)
# 写入Excel通用子流程:D01_WriteExcel
# 输入参数:数据列表(列表类型)、文件路径(文本)、工作表名(文本)
# 内部:打开Excel → 写入表头 → 循环写入行数据 → 保存关闭
# 在多个主流程中调用
调用子流程:D01_WriteExcel
输入参数:数据列表={商品数据},文件路径="C:/output.xlsx",工作表名="商品"
注意: 复用子流程时,要保证它的XPath、元素定位是通用的。比如“登录淘宝”子流程里的登录按钮XPath只针对淘宝,不能拿到拼多多用。
六、子流程调试技巧
技巧1:单独运行子流程
在影刀画布里,右键点击子流程标签,选择“运行此流程”。 不用从A_Main开始跑,节省时间。
技巧2:子流程加前后日志
每个子流程开头和结尾加“输出日志”。
# B01_Login 开头
输出日志:"=== 开始执行登录子流程 ==="
# 结尾
输出日志:"=== 登录子流程执行完成 ==="
技巧3:子流程报错时返回错误码
给子流程加一个“输出参数:错误码”(整数,0表示成功)。
# 子流程内部
try:
登录操作...
设置输出参数:错误码 = 0
catch:
设置输出参数:错误码 = 1
输出日志:"登录失败"
# 主流程中判断
调用子流程:B01_Login,输出参数存入:登录结果
如果 登录结果.错误码 != 0
输出日志:"登录失败,终止流程"
返回 # 停止主流程
七、子流程拆分检查清单
| 检查项 | 好的示例 | 坏的示例 |
|---|---|---|
| 子流程名称 | C02_CollectCurrentPage | 子流程3 |
| 指令数量 | 10-30行 | 80行以上 |
| 单一职责 | 只做采集当前页 | 采集+翻页+写Excel |
| 参数传递 | 有明确的输入输出 | 用全局变量到处传 |
| 可复用性 | 登录子流程可在多个项目用 | 写死在主流程里 |
| 日志 | 开头结尾有日志 | 完全没有日志 |
易错速查表
| 错误现象 | 原因 | 解决方法 |
|---|---|---|
| 子流程调用后变量是空的 | 忘记设置输出参数 | 在子流程内部用“设置输出参数” |
| 子流程里改了变量,主流程没变 | 变量作用域问题 | 用输出参数返回,或用全局变量(不推荐) |
| 子流程找不到元素 | 页面对象没传进去 | 把“网页对象”作为输入参数传入 |
| 子流程太多,主流程很长 | 主流程还是做了逻辑 | 主流程只放调用,逻辑都在子流程 |
| 调试时改了子流程,主流程没生效 | 没保存 | 保存所有流程(Ctrl+Shift+S) |
推荐资源
- 影刀官方帮助中心:搜索“子流程”有视频教程和最佳实践
- 我的经验:从第一次写流程就养成拆分的习惯,哪怕只拆成3个(初始化、采集、保存),后期维护会轻松10倍
- 模板参考:影刀流程市场搜索“电商采集模板”,下载看别人怎么拆分的
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
