影刀RPA实操指南:流程参数实战——子流程之间如何传递数据

上篇文章讲了怎么拆分子流程,拆完之后马上遇到新问题:子流程A采集到的数据,怎么传给子流程B?
子流程B处理完的结果,怎么返回给主流程?

核心答案:用流程参数(输入参数和输出参数)。
我一开始以为全局变量就能搞定,后来发现多个子流程同时运行时数据会串——流程参数才是最规范的方式。


一、参数类型:输入、输出、输入输出

picture.image

影道的流程参数分三种:

picture.image

picture.image | 类型 | 作用 | 方向 | 典型场景 |

picture.image |------|------|------|----------| | 输入参数 | 主流程传数据给子流程 | 单向(进) | 传入URL、关键词、账号密码 | | 输出参数 | 子流程返回数据给主流程 | 单向(出) | 返回采集到的标题、价格 | | 输入输出参数 | 同一个参数既传入又传出 | 双向 | 计数器、累计数据 |

picture.image 日常开发中,90%用输入+输出分开,极少用输入输出。


二、输入参数:主流程传给子流程

场景

子流程 C_采集商品详情 需要一个URL才能工作。
这个URL由主流程(或上一个子流程)提供。

操作步骤

  1. 打开子流程,点顶部“流程参数”按钮

  2. 添加输入参数

picture.image

  • 参数名:商品链接(用中文或英文,建议中文易懂)

picture.image

  • 参数类型:文本(也可选数字、布尔、列表、字典)
  • 默认值:可留空

picture.image 3. 在子流程里使用这个参数

picture.image 直接写 {{商品链接}},就像用普通变量一样。

# 子流程 C_采集商品详情 内部
打开网页({{商品链接}})
等待元素出现(标题元素, 5秒)
标题 = 获取元素文本(标题元素)
  1. 在主流程调用时,传入实际值
调用子流程(C_采集商品详情, 输入={商品链接: "https://item.taobao.com/123"})

传入变量

如果主流程里有变量 当前商品URL,这样传:

调用子流程(C_采集商品详情, 输入={商品链接: 当前商品URL})

注意: 参数名 商品链接 必须和子流程里定义的一致,变量名 当前商品URL 可以任意。

picture.image


三、输出参数:子流程返回给主流程

场景

子流程采集到标题、价格,要拿回主流程汇总。

操作步骤

  1. 在子流程的“流程参数”里添加输出参数

    • 参数名:标题价格
    • 参数类型:文本
  2. 在子流程内部,用“设置输出参数”指令赋值
    这个指令在“流程控制”类别里。

# 子流程内部
标题 = 获取元素文本(标题元素)
设置输出参数(标题, 标题)   # 第一个是参数名,第二个是值

价格 = 获取元素文本(价格元素)
设置输出参数(价格, 价格)
  1. 在主流程调用时,用变量接收
调用子流程(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"},主流程可以直接用 结果字典["标题"] 取值。


六、输入输出参数:双向传递计数器

场景

子流程里需要修改主流程传入的计数器,并返回新值。

操作

  1. 在子流程参数里添加参数 累计数量,类型选择“输入输出”
  2. 主流程调用时,既在输入里传,也在输出里收
  3. 子流程里可以读取和修改这个变量

示例:
主流程:累计 = 0
子流程:累计 = 累计 + 本页数量
主流程调用后:累计 被更新。

注意: 输入输出参数用不好容易乱,新手建议用“输入参数+输出参数”分开代替。


七、参数类型选择参考

数据类型使用场景示例
文本URL、用户名、商品标题"https://..."
数字页码、价格、数量100
布尔成功/失败标志TrueFalse
列表多条数据、商品卡片列表[["a",10], ["b",20]]
字典单个商品多个属性{"标题":"手机","价格":1999}

影刀限制: 不支持直接传“元素对象”作为参数(因为元素对象只在当前流程有效)。
如果需要在子流程里操作同一个元素,要在子流程内部重新捕获。


常见问题速查

问题原因解决方法
子流程收不到输入参数主流程调用时参数名写错检查参数名是否完全一致(包括大小写)
输出参数返回空子流程里没写“设置输出参数”在子流程结束前必须设置所有输出参数
传入列表后子流程里取不到值参数类型选成了“文本”在流程参数里把类型改为“列表”
主流程调用时报错“参数类型不匹配”传了文本给数字类型的参数用“转换为数字”指令先转换
修改了子流程参数,主流程调用不变影刀缓存删除主流程的调用指令,重新拖入

推荐资源

  • 影刀官方学院: “流程设计——参数传递详解”(视频里演示了输入输出的完整案例)
  • 我的文章联动:
    • 上一篇:[子流程拆分原则——ABCD编号法与模块化设计(选题池13号)]
    • 下一篇预告:[影刀RPA避坑指南:try-catch-finally异常处理完整用法与常见误区](选题池15号)
  • 调试技巧: 在子流程开头用“输出日志”打印接收到的输入参数,确认传进来了

作者:林焱

本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。

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