拆分了子流程之后,数据怎么从一个子流程传到另一个子流程? 比如在登录子流程里获取了登录后的用户名,要在主流程或其他子流程里用到。 新手最容易犯的错:用全局变量到处传,结果变量被覆盖或者拿不到。
核心方法:子流程的输入参数接收数据,输出参数返回结果。尽量不用全局变量。
一、为什么需要流程参数?
没有参数传递的问题:
# 子流程A:采集商品
# 里面写死了关键词 = "手机"
# 子流程B:采集商品

# 里面写死了关键词 = "电脑"

# 想复用同一个采集子流程,不同关键词,做不到

有参数之后:

# 采集子流程:接收输入参数“关键词”
# 用这个关键词去搜索
# 主流程调用:
采集子流程(关键词="手机")

采集子流程(关键词="电脑")
原则:子流程应该是“函数”,而不是“脚本”。给它输入,它给你输出。
二、输入参数:向子流程传值
操作步骤
- 打开子流程,点击顶部工具栏的**“流程参数”**按钮
- 点击“添加”,选择**“输入”**
- 输入参数名(如
关键词),选择类型(文本/数字/列表/布尔等) - 在子流程内部,直接用
{关键词}变量使用这个参数
# 子流程:C01_SearchAndCollect
# 输入参数:关键词(文本)
# 内部使用
输入文本://input[@class='search-input'],内容={关键词}
点击元素://button[text()='搜索']
等待元素出现://div[@class='result-list']
# 采集逻辑...
在主流程中调用时:
# 主流程 A_Main
调用子流程:C01_SearchAndCollect
输入参数:关键词 = "新疆苹果"
调用子流程:C01_SearchAndCollect
输入参数:关键词 = "山东樱桃"
容易踩的坑: 参数类型不匹配。子流程参数定义为“数字”,你传了个“文本”进去会报错。在调用前用“转为数字”指令转换。
三、输出参数:从子流程返回值
子流程执行完后,想把结果(比如采集到的商品列表)传回主流程。
操作步骤
- 在子流程的“流程参数”窗口,添加“输出”参数
- 输出参数名如
采集结果,类型选“列表” - 在子流程内部,用**“设置输出参数”**指令给返回值赋值
- 子流程结束时,这个值会传回调用处
# 子流程:C01_SearchAndCollect
# 输入:关键词
# 输出:采集结果(列表)
# 内部逻辑...
设置变量:商品数据列表 = [] # 存放采集到的商品
循环处理每个商品
商品数据列表.append([标题, 价格])
# 最后设置输出参数

设置输出参数:采集结果 = 商品数据列表
在主流程中接收输出参数:
# 主流程
调用子流程:C01_SearchAndCollect
输入参数:关键词 = "苹果"
输出参数存入:苹果商品列表
输出日志:"苹果商品共{苹果商品列表的长度}条"
# 再调用一次,不同关键词
调用子流程:C01_SearchAndCollect
输入参数:关键词 = "香蕉"
输出参数存入:香蕉商品列表
注意: 输出参数必须用“设置输出参数”指令显式赋值。如果子流程执行完没有设置输出参数,调用方拿到的值是空(None)。
四、实战:登录子流程返回登录状态
# 子流程:B01_Login
# 输入参数:账号(文本)、密码(文本)
# 输出参数:登录成功(布尔)、用户昵称(文本)
# 内部逻辑
打开网页:"https://xxx.com/login"
输入文本://input[@name='username'],内容={账号}
输入文本://input[@name='password'],内容={密码}
点击元素://button[text()='登录']
# 等待登录成功标志
等待元素出现://div[@class='user-avatar'],超时10秒 → 存在存入“是否出现”
如果 是否出现 == True
获取元素文本://span[@class='nickname'] → 存入“昵称”
设置输出参数:登录成功 = True
设置输出参数:用户昵称 = {昵称}
否则
设置输出参数:登录成功 = False
设置输出参数:用户昵称 = ""
# 主流程调用
调用子流程:B01_Login
输入参数:账号="admin", 密码="123456"
输出参数存入:登录结果, 昵称
如果 登录结果 == False
输出日志:"登录失败,终止流程"
返回
否则
输出日志:"欢迎,{昵称}"
五、输入输出参数的类型详解
| 类型 | 适用场景 | 举例 |
|---|---|---|
| 文本 | 关键词、URL、账号密码 | "手机" |
| 数字 | 价格、数量、页数 | 10 |
| 布尔 | 是否成功、是否存在 | True |
| 列表 | 采集到的多条数据、关键词数组 | [["苹果",29.9],["香蕉",19.9]] |
| 字典 | 键值对数据(较少用) | {"name":"苹果","price":29.9} |
| 元素对象 | 网页元素(很少作为参数传递) | 不推荐传递,直接在子流程里捕获 |
注意: 列表和字典作为参数传递时,子流程内部修改会影响原数据(引用传递)。如果不希望被修改,传之前用“复制列表”指令拷贝一份。
六、全局变量 vs 流程参数
| 对比维度 | 全局变量 | 流程参数 |
|---|---|---|
| 作用域 | 整个应用的所有流程 | 仅限当前子流程调用 |
| 修改方式 | 用“设置全局变量”修改 | 通过输出参数返回 |
| 并发安全 | 多个子流程同时改会乱 | 每个调用独立 |
| 调试难度 | 难追踪谁改了值 | 清晰的数据流 |
| 推荐程度 | 尽量少用 | 优先使用 |
什么时候用全局变量:
- 系统配置(如Excel文件路径、截图保存目录)
- 需要在多个不相关子流程间共享的状态(较少见)
什么时候用流程参数:
- 子流程需要外部数据(输入参数)
- 子流程需要返回结果(输出参数)
- 99%的场景
# 全局变量示例(可接受的使用)
设置全局变量:日志文件夹路径 = "C:\logs\"
设置全局变量:是否开启调试 = False
# 这些是整个流程的配置,多个子流程只读不写
七、复杂数据传递:列表作为参数
最常见的场景:主流程读取Excel关键词列表,传给子流程批量处理。
# 主流程
Excel读取关键词列表 → 存入“关键词列表”(二维列表)
# 调用批量处理子流程,传入整个列表
调用子流程:C02_BatchSearch
输入参数:关键词列表 = {关键词列表}
输出参数存入:所有商品数据
# 子流程:C02_BatchSearch
# 输入参数:关键词列表(列表类型)
# 输出参数:所有商品数据(列表)
设置变量:汇总结果 = []
循环列表:关键词列表,循环变量=当前词
调用子流程:C01_SearchAndCollect
输入参数:关键词={当前词}
输出参数存入:商品列表
汇总结果 = 汇总结果 + 商品列表 # 列表拼接
设置输出参数:所有商品数据 = 汇总结果
八、默认值和可选参数
影刀的输入参数支持设置默认值。调用时不传该参数,就使用默认值。
操作步骤
- 在流程参数窗口,添加输入参数
- 在“默认值”列填写内容(如
1或"默认关键词") - 调用时可传可不传
# 子流程:C01_SearchAndCollect
# 输入参数:关键词(默认值="手机")、页数(默认值=5)
# 主流程调用方式1:使用默认值
调用子流程:C01_SearchAndCollect
# 不传关键词和页数,自动用"手机"和5页
# 方式2:覆盖默认值
调用子流程:C01_SearchAndCollect
输入参数:关键词="电脑",页数=10
注意: 输出参数没有默认值,必须在子流程内用“设置输出参数”赋值。
九、完整示例:多关键词搜索采集
# ========== 子流程:C01_SearchAndCollect ==========
# 输入参数:关键词(文本)
# 输出参数:商品数据(列表)
# 1. 搜索关键词
输入文本://input[@class='search'],内容={关键词}
点击元素://button[text()='搜索']
等待元素出现://div[@class='goods-card'],超时5秒
# 2. 采集当前页商品
获取相似元素列表://div[@class='goods-card'] → 存入“商品容器列表”
设置变量:当前页数据 = []
循环元素列表:商品容器列表
在当前元素下查找元素:.//span[@class='title'] → 获取文本 存入“标题”
在当前元素下查找元素:.//span[@class='price'] → 获取文本 存入“价格”
当前页数据.append([标题, 价格])
# 3. 返回数据
设置输出参数:商品数据 = 当前页数据
# ========== 主流程 A_Main ==========
# 1. 准备关键词列表
设置变量:关键词列表 = ["苹果手机", "华为手机", "小米手机"]
设置变量:全部数据 = []
# 2. 循环调用子流程
循环列表:关键词列表
调用子流程:C01_SearchAndCollect
输入参数:关键词 = {当前列表项}
输出参数存入:本次采集数据
全部数据 = 全部数据 + 本次采集数据
输出日志:"关键词{当前列表项}采集到{本次采集数据的长度}条"
# 3. 写入Excel
Excel Workbook打开:文件"C:\全部商品.xlsx",自动创建
写入行数据到表格:起始"A1",行数据["关键词","标题","价格"]
循环列表:全部数据
追加行到表格:行数据=[关键词(需额外保存), 标题, 价格]
Excel Workbook保存并关闭
输出日志:"共采集{全部数据的长度}条商品"
十、易错速查表
| 错误现象 | 原因 | 解决方法 |
|---|---|---|
| 调用子流程后输出参数是空的 | 子流程内没写“设置输出参数” | 检查子流程,确保有赋值 |
| 输入参数传到子流程变成None | 主流程传参时变量名写错 | 检查参数名是否一致(大小写敏感) |
| 列表参数在子流程里修改影响外面 | 引用传递 | 传入前用“复制列表”拷贝 |
| 输出参数类型和主流程预期不符 | 子流程设置了错误的类型 | 在设置输出参数前用“转为...”指令转换 |
| 流程参数窗口找不到 | 没选中子流程 | 点击子流程标签页,再点“流程参数” |
| 默认值不生效 | 调用时传了空值 | 调用前判断,如果为空则不传该参数 |
推荐资源
- 影刀官方帮助中心:搜索“流程参数”有视频教程
- 我的经验:子流程超过5个输入参数说明拆得不够细,考虑再拆分
- 练习:把之前写的流程改造成参数化版本,体会复用带来的便利
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
