影刀RPA新手教程:流程参数实战——子流程之间如何传递数据

拆分了子流程之后,数据怎么从一个子流程传到另一个子流程? 比如在登录子流程里获取了登录后的用户名,要在主流程或其他子流程里用到。 新手最容易犯的错:用全局变量到处传,结果变量被覆盖或者拿不到。

核心方法:子流程的输入参数接收数据,输出参数返回结果。尽量不用全局变量。

一、为什么需要流程参数?

没有参数传递的问题:

# 子流程A:采集商品
# 里面写死了关键词 = "手机"

# 子流程B:采集商品

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/d35d430d7c8a4a5cb49c9eae19cedade~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=oyS6ol2niZMlw9Vo%2FnjPuauhyY4%3D)
# 里面写死了关键词 = "电脑"

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/d7d5b5c30e254ce1b3c3f6e68c8b738c~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=kdzJtJh5dGtLixko4L3MBAiiPxE%3D)
# 想复用同一个采集子流程,不同关键词,做不到

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/3bc6f68019fb4cb698d5361aa21f78db~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=CkGZZAAAh94E4QlIl9P%2Frljg4jE%3D)

有参数之后:


![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/538b95254e534e86ad32421b837f8a92~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=5OZPxYoecOLcTlPOmc1DbLhlgHo%3D)
# 采集子流程:接收输入参数“关键词”
# 用这个关键词去搜索

# 主流程调用:
采集子流程(关键词="手机")

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/05c7486315934d9e9352c2656f426439~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=zk2KG3drXg9y2BBrQ%2BKDJTa9ZGA%3D)
采集子流程(关键词="电脑")

原则:子流程应该是“函数”,而不是“脚本”。给它输入,它给你输出。

picture.image

二、输入参数:向子流程传值

操作步骤

picture.image

  1. 打开子流程,点击顶部工具栏的**“流程参数”**按钮
  2. 点击“添加”,选择**“输入”**
  3. 输入参数名(如关键词),选择类型(文本/数字/列表/布尔等)
  4. 在子流程内部,直接用{关键词}变量使用这个参数
# 子流程:C01_SearchAndCollect
# 输入参数:关键词(文本)
# 内部使用

输入文本://input[@class='search-input'],内容={关键词}
点击元素://button[text()='搜索']
等待元素出现://div[@class='result-list']
# 采集逻辑...

在主流程中调用时:

# 主流程 A_Main
调用子流程:C01_SearchAndCollect
    输入参数:关键词 = "新疆苹果"
    
调用子流程:C01_SearchAndCollect
    输入参数:关键词 = "山东樱桃"

picture.image

容易踩的坑: 参数类型不匹配。子流程参数定义为“数字”,你传了个“文本”进去会报错。在调用前用“转为数字”指令转换。


三、输出参数:从子流程返回值

子流程执行完后,想把结果(比如采集到的商品列表)传回主流程。

操作步骤

  1. 在子流程的“流程参数”窗口,添加“输出”参数
  2. 输出参数名如采集结果,类型选“列表”
  3. 在子流程内部,用**“设置输出参数”**指令给返回值赋值
  4. 子流程结束时,这个值会传回调用处
# 子流程:C01_SearchAndCollect
# 输入:关键词
# 输出:采集结果(列表)

# 内部逻辑...
设置变量:商品数据列表 = []  # 存放采集到的商品

循环处理每个商品
    商品数据列表.append([标题, 价格])

# 最后设置输出参数

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/a7e2339a7a21415ca42fa0b2f053f476~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781669322&x-signature=5upaaB%2BXRx%2B9YCDJIEEE8vp1z%2B8%3D)
设置输出参数:采集结果 = 商品数据列表

picture.image 在主流程中接收输出参数:

# 主流程
调用子流程: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. 在流程参数窗口,添加输入参数
  2. 在“默认值”列填写内容(如 1"默认关键词"
  3. 调用时可传可不传
# 子流程: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学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论