不知不觉,这个系列已经写了30多篇。从元素捕获到XPath、从循环判断到异常处理、从Excel操作到数据库、从定时任务到AI结合……如果你一路跟下来,应该已经能独立搭建一个完整的自动化流程了。
但“能跑”和“跑得好”之间,还有一段距离。
这篇文章是这个系列的阶段性总结——不讲具体指令,不讲某个平台的操作技巧,而是从“流程设计”的视角,把前面30多篇的技能串起来,形成一个完整的流程优化思维框架。
优化三要素:稳定性、速度、可维护性
一个“跑得好”的流程,需要同时满足三个条件:
| 维度 | 问自己 | 合格标准 |
|---|---|---|
| 稳定性 | 流程能持续跑多久不报错? | 连续运行7天不出错 |
| 速度 | 流程跑完一轮要多久? | 不超过社区版30分钟限制 |
| 可维护性 | 别人接手你的流程要多久看懂? | 半小时内能定位到问题模块 |
三个维度缺一不可。只追求稳定性不优化速度,流程跑不完;只追求速度不做异常处理,流程经常崩;只追求可维护性不关心效率,成本下不来。
维度一:稳定性——让流程“免疫”意外
稳定性是所有优化的前提。一个跑两步就崩的流程,再快也没用。
1. 三层异常防御体系
不是所有异常都用同一种方式处理。我把异常处理分成三层:
| 层级 | 处理方法 | 适用场景 | 影响范围 |
|---|---|---|---|
| 第一层:元素级容错 | 加等待、重试、备选定位 | 元素偶尔加载慢、弹窗随机出现 | 单条指令失败不影响后续 |
| 第二层:模块级容错 | Try-Catch包住子流程 | 登录、采集、写入等独立模块 | 模块失败不影响主流程 | | 第三层:流程级容错 | 全局监控、看门狗、超时保护 | 整个流程卡死或无限循环 | 防止30分钟额度被耗尽 |
实际应用:采集模块报错了,只影响这一轮的采集数据,Catch块里记日志、截图、发告警,主流程继续走(或者优雅退出)。不要让“采集失败了”导致“整个流程崩溃了”。
2. 元素定位的“冗余策略”
元素定位是流程稳定性的最大变量。页面改版、动态ID、网络延迟——任何一个因素都可能让元素“消失”。
稳定性的核心策略:不要只依赖一种定位方式。
# 元素定位的“三层保险”
Try:
# 第一层:XPath定位(最快)
点击元素("//button[text()='确认']")
Catch:
# 第一层失败,尝试第二层:图像识别
Try:
点击图像("确认按钮.png", 匹配精度=0.8)
Catch:
# 第二层也失败,尝试第三层:OCR文字定位
Try:
点击文本(OCR, "确认")
Catch:
# 三层都失败,记录日志并告警
输出日志("确认按钮定位失败,已跳过")
调用子流程("发送告警通知")
End
End
End
3. 看门狗与超时保护
这是最容易被忽略的稳定性措施。流程卡死比报错更可怕——至少报错会让你知道出了问题。
看门狗机制:在循环里加计数器,超过阈值强制跳出。
$循环计数器 = 0

无限循环开始:
# 执行操作
$循环计数器 = $循环计数器 + 1
如果 $循环计数器 > 50:
输出日志("超过最大循环次数50,强制退出")
跳出循环
结束
结束
超时保护:每个可能卡住的操作都设超时。
# 任何“等待元素出现”都要设超时
等待元素出现("加载完成标志", 超时=10秒)
# 任何HTTP请求都要设超时
HTTP请求(超时=30秒)
维度二:速度——榨干每一分钟的额度
社区版每天只有30分钟,创业版虽然不限时但时间就是成本。流程速度直接决定你能处理多少业务。
1. 减少不必要的等待
这是新手最容易犯的错误——到处加固定等待。
# ❌ 错误:到处写死等待
等待(3000) # 等3秒
点击元素()
等待(2000) # 再等2秒
获取元素文本()
等待(1000) # 再等1秒
# ✅ 正确:用条件等待替代固定等待
等待元素出现("目标元素", 超时=10秒) # 出现就立即继续,不会多等
点击元素()
获取元素文本()
固定等待 vs 条件等待:
- 固定等待:不管页面什么状态,傻等N秒——快了浪费、慢了报错
- 条件等待:等到预期条件满足就继续——效率高、稳定
把流程里所有的固定等待都检查一遍,能换成条件等待的就换掉。一个流程往往能省下30%-50%的时间。
2. 批量操作替代循环操作
单个操作和批量操作的速度差距,随着数据量增加呈指数级放大。
| 操作方式 | 100条数据 | 1000条数据 | 10000条数据 |
|---|---|---|---|
| 逐条写入Excel | 约5秒 | 约50秒 | 约8分钟 |
| 批量写入Excel | 约0.5秒 | 约2秒 | 约10秒 |
核心原则:能用“批量”就别用“循环”。
# ❌ 错误:循环逐条写入
ForEach $数据 in $列表:
写入行数据($数据)
结束
# ✅ 正确:一次性批量写入
写入表格数据(起始行=2, 数据=$二维数组)
3. 子流程并发执行
影刀支持“并发调用子流程”——同时启动多个子流程,并行执行互不干扰的任务。
适用场景:
- 同时采集多个店铺的数据(每个店铺独立一个子流程)
- 同时下载多张图片
- 同时调用多个API获取数据
# 同时采集5个店铺的数据
并发调用子流程("采集店铺数据", 店铺列表=$店铺列表, 并发数=5)
注意:并发数不是越大越好。每个子流程都会占用系统资源(CPU、内存、网络),建议根据电脑配置调整,一般3-5个并发比较稳定。
4. 缩短每一步的耗时
如果每一步都快一点,整个流程能快很多:
| 操作 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 输入文本 | 模拟输入(逐个字符) | 输入文本(整体粘贴) | 快5-10倍 |
| 数据清洗 | 影刀指令逐行处理 | Python Pandas批处理 | 快10-50倍 |
| 元素点击 | 模拟鼠标轨迹 | 直接点击元素 | 快2-3倍 |
| 页面跳转 | 固定等待5秒 | 等待元素出现 | 平均快2-3秒 |
维度三:可维护性——让未来的你和同事能看懂
一个流程跑一年不坏当然好,但业务需求总是在变的——平台改版、采集字段调整、新增功能需求。改流程的时间,往往比写新流程还长。
1. 主流程只做“目录”
主流程里不写任何具体操作的指令,只放“调用子流程”。
# ✅ 好的主流程:像一本书的目录
主流程:
调用子流程("A01_登录")
调用子流程("B01_采集商品列表")
调用子流程("C01_解析商品详情")
调用子流程("D01_数据清洗")
调用子流程("E01_写入数据库")
调用子流程("F01_发送通知")
# ❌ 差的主流程:所有指令堆在一起
主流程:
打开网页()
输入账号()
输入密码()
点击登录()
获取相似元素列表()
ForEach ...
# 200行指令
标准:打开主流程,5秒内能看懂整个流程在做什么。至于每一步怎么实现的,点进子流程看。
2. 子流程遵循“单一职责”
一个子流程只做一件事。
# ✅ 好的拆分
A01_登录拼多多 # 只做登录
B01_翻页采集 # 只做翻页+采集
C01_清洗价格 # 只做价格清洗
D01_写入Excel # 只做写入
# ❌ 差的拆分(一个子流程做了太多事)
A01_登录并采集并清洗并写入 # 名字本身就不应该出现"并"
判断标准:子流程名称里如果出现“并”、“且”、“与”之类的连接词,说明该拆了。
3. 注释写到“为什么”而不是“是什么”
# ❌ 没用的注释(重复代码本身)
设置变量 $页码 = 1 # 设置页码为1
# ✅ 有用的注释(说明意图)
设置变量 $页码 = 1 # 从第一页开始采集,后续循环中自动累加
# ❌ 没用的注释
点击元素("下一页") # 点击下一页
# ✅ 有用的注释
点击元素("下一页") # 翻页到下一页,如果已经是最后一页,该元素不存在
注释原则:解释“为什么要这样做”,而不是“做了什么”。
4. 命名规范统一
| 类型 | 格式 | 示例 |
|---|---|---|
| 子流程 | [前缀][两位数字]_[功能] | A01_登录拼多多 |
| 变量 | [类型前缀]_[用途] | $lst_商品列表、$num_当前页码 |
| 元素 | [页面]_[功能]_[类型] | 首页_搜索框_输入框 |
| 应用 | [平台]_[业务]_[版本] | 拼多多_价格监控_V2.3 |
命名规范的价值:不看代码内容,光看名字就知道是什么、在哪用。
5. 参数传递代替变量共享
子流程之间通过参数传递数据,不要直接读取全局变量。
# ❌ 错误:子流程直接读全局变量
# 主流程
设置变量 $账号 = "user001"
调用子流程("登录")
# 子流程里直接使用 $账号
# ✅ 正确:通过参数传递
# 主流程
设置变量 $账号 = "user001"
调用子流程("登录", 输入参数={账号: $账号})
# 子流程通过输入参数接收 $账号
参数传递的好处:子流程和主流程解耦,换个项目改个参数就能复用。
流程优化的顺序建议
不要一上来就想把流程做到完美。建议按这个顺序逐步优化:
- 第一轮:让它能跑 —— 把功能实现出来,不考虑优化
- 第二轮:让它稳定 —— 加异常处理、等待、重试
- 第三轮:让它快起来 —— 去固定等待、改批量操作、加并发
- 第四轮:让它好维护 —— 拆子流程、加注释、统一命名
每轮优化后,重新跑一轮测试,确保优化没有破坏原有功能。
五个“优化过度”的警告
优化不是越多越好。以下情况说明你可能“优化过度”了:
- 为了追求极致速度,牺牲了稳定性——比如把等待时间设得太短,导致偶尔因网络波动而失败
- 为了追求代码简洁,牺牲了可读性——把十行逻辑压缩成一行,后来自己都看不懂
- 加了太多异常处理,主流程反而更复杂——每个指令外面都包Try-Catch,代码膨胀了3倍
- 做了大量优化,但流程每天只跑一次——为了省1分钟,花了3天时间优化,得不偿失
- 追求完美架构,结果一个流程都没交付——先跑起来再优化,不要一开始就过度设计
优化的黄金法则:先让它能跑,再让它跑得好。
推荐资源
- 影刀官方帮助文档搜索“流程优化”或“开发规范”
- 影刀社区搜索“流程设计”或“优化经验”
- 本文是《影刀RPA学习手册》系列的阶段性总结,后续文章将继续深入具体场景
#影刀RPA #RPA自动化 #流程优化 #稳定性 #开发规范 #电商自动化
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。如果这篇文章对你有帮助,欢迎点赞收藏,下一篇我们将进入“影刀RPA学习手册系列:从入门到独立的完整复盘”。
