上篇文章讲了怎么拆分子流程,拆完之后马上遇到新问题:子流程A采集到的数据,怎么传给子流程B?
子流程B处理完的结果,怎么返回给主流程?
核心答案:用流程参数(输入参数和输出参数)。
我一开始以为全局变量就能搞定,后来发现多个子流程同时运行时数据会串——流程参数才是最规范的方式。
一、参数类型:输入、输出、输入输出
影道的流程参数分三种:
| 类型 | 作用 | 方向 | 典型场景 |
|------|------|------|----------|
| 输入参数 | 主流程传数据给子流程 | 单向(进) | 传入URL、关键词、账号密码 |
| 输出参数 | 子流程返回数据给主流程 | 单向(出) | 返回采集到的标题、价格 |
| 输入输出参数 | 同一个参数既传入又传出 | 双向 | 计数器、累计数据 |
日常开发中,90%用输入+输出分开,极少用输入输出。
二、输入参数:主流程传给子流程
场景
子流程 C_采集商品详情 需要一个URL才能工作。
这个URL由主流程(或上一个子流程)提供。
操作步骤
-
打开子流程,点顶部“流程参数”按钮
-
添加输入参数
- 参数名:
商品链接(用中文或英文,建议中文易懂)
- 参数类型:文本(也可选数字、布尔、列表、字典)
- 默认值:可留空
3. 在子流程里使用这个参数
直接写
{{商品链接}},就像用普通变量一样。
# 子流程 C_采集商品详情 内部
打开网页({{商品链接}})
等待元素出现(标题元素, 5秒)
标题 = 获取元素文本(标题元素)
- 在主流程调用时,传入实际值
调用子流程(C_采集商品详情, 输入={商品链接: "https://item.taobao.com/123"})
传入变量
如果主流程里有变量 当前商品URL,这样传:
调用子流程(C_采集商品详情, 输入={商品链接: 当前商品URL})
注意: 参数名 商品链接 必须和子流程里定义的一致,变量名 当前商品URL 可以任意。
三、输出参数:子流程返回给主流程
场景
子流程采集到标题、价格,要拿回主流程汇总。
操作步骤
-
在子流程的“流程参数”里添加输出参数
- 参数名:
标题、价格 - 参数类型:文本
- 参数名:
-
在子流程内部,用“设置输出参数”指令赋值
这个指令在“流程控制”类别里。
# 子流程内部
标题 = 获取元素文本(标题元素)
设置输出参数(标题, 标题) # 第一个是参数名,第二个是值
价格 = 获取元素文本(价格元素)
设置输出参数(价格, 价格)
- 在主流程调用时,用变量接收
调用子流程(C_采集商品详情,
输入={商品链接: 当前商品URL},
输出={标题: 标题变量, 价格: 价格变量})
输出日志("采集到标题:" + 标题变量)
容易踩的坑
- 忘记在子流程里写“设置输出参数”,主流程收到的变量是空
- 输出参数名写错(大小写、中文全角)
- 设置了输出参数但没有赋值,也会返回空
四、实战:翻页采集完整流程
需求
- 主流程控制翻页
- 子流程
采集单页采集当前页所有商品,返回商品列表 - 主流程把所有页的数据合并
子流程 B_采集单页 设计
输入参数: 页码(数字类型)
输出参数: 本页商品列表(列表类型)
# 子流程内部
等待元素出现(商品卡片, 5秒)
商品卡片列表 = 获取相似元素列表(父元素_商品卡片)
本页数据 = [] # 新建空列表
循环遍历列表(商品卡片列表, 当前卡片)
标题 = 获取元素文本(当前卡片, ".//a[@class='title']")
价格 = 获取元素文本(当前卡片, ".//span[@class='price']")
本页数据.追加([标题, 价格]) # 将一行数据追加到列表
设置输出参数(本页商品列表, 本页数据)
主流程调用
全部数据 = [] # 存储所有页数据
循环 当 有下一页
调用子流程(B_采集单页,
输入={页码: 当前页码},
输出={本页商品列表: 当前页数据})
# 合并
全部数据 = 全部数据 + 当前页数据
# 翻页
点击下一页按钮
等待元素出现(商品卡片, 5秒)
当前页码 = 当前页码 + 1
# 循环结束后,一次性写入Excel
调用子流程(E_写入Excel, 输入={数据: 全部数据})
五、传递列表和字典(批量数据)
场景
需要把一个Excel表格数据传给子流程批量处理。
主流程读取Excel
Excel数据列表 = 读取区域数据到列表(Excel对象, "A2:C100")
# 返回的是二维列表,比如 [["商品A","10元","100件"], ["商品B","20元","50件"]]
子流程接收列表参数
输入参数: 商品数据(类型选“列表”)
# 子流程内部
循环遍历列表({{商品数据}}, 当前商品行)
商品名 = 当前商品行[0]
价格 = 当前商品行[1]
销量 = 当前商品行[2]
# 做批量上架或其他操作
传递字典(键值对)
输出参数也可以返回字典。比如子流程返回 {"标题":"xxx", "价格":"99"},主流程可以直接用 结果字典["标题"] 取值。
六、输入输出参数:双向传递计数器
场景
子流程里需要修改主流程传入的计数器,并返回新值。
操作
- 在子流程参数里添加参数
累计数量,类型选择“输入输出” - 主流程调用时,既在输入里传,也在输出里收
- 子流程里可以读取和修改这个变量
示例:
主流程:累计 = 0
子流程:累计 = 累计 + 本页数量
主流程调用后:累计 被更新。
注意: 输入输出参数用不好容易乱,新手建议用“输入参数+输出参数”分开代替。
七、参数类型选择参考
| 数据类型 | 使用场景 | 示例 |
|---|---|---|
| 文本 | URL、用户名、商品标题 | "https://..." |
| 数字 | 页码、价格、数量 | 100 |
| 布尔 | 成功/失败标志 | True 或 False |
| 列表 | 多条数据、商品卡片列表 | [["a",10], ["b",20]] |
| 字典 | 单个商品多个属性 | {"标题":"手机","价格":1999} |
影刀限制: 不支持直接传“元素对象”作为参数(因为元素对象只在当前流程有效)。
如果需要在子流程里操作同一个元素,要在子流程内部重新捕获。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 子流程收不到输入参数 | 主流程调用时参数名写错 | 检查参数名是否完全一致(包括大小写) |
| 输出参数返回空 | 子流程里没写“设置输出参数” | 在子流程结束前必须设置所有输出参数 |
| 传入列表后子流程里取不到值 | 参数类型选成了“文本” | 在流程参数里把类型改为“列表” |
| 主流程调用时报错“参数类型不匹配” | 传了文本给数字类型的参数 | 用“转换为数字”指令先转换 |
| 修改了子流程参数,主流程调用不变 | 影刀缓存 | 删除主流程的调用指令,重新拖入 |
推荐资源
- 影刀官方学院: “流程设计——参数传递详解”(视频里演示了输入输出的完整案例)
- 我的文章联动:
- 上一篇:[子流程拆分原则——ABCD编号法与模块化设计(选题池13号)]
- 下一篇预告:[影刀RPA避坑指南:try-catch-finally异常处理完整用法与常见误区](选题池15号)
- 调试技巧: 在子流程开头用“输出日志”打印接收到的输入参数,确认传进来了
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
