影刀RPA避坑指南流程卡死与超时的防御性编程流程跑着跑着不动了。不报错不退出就卡在那。你第二天一看浏览器还开着进度停在昨晚 11:37。这是最让人头疼的问题——不是功能错了是流程死了。而且你不知道死在哪一步、为什么死。这篇文章讲如何让流程死的时候至少留句话。一、流程卡死的三大元凶元凶1等待元素出现设置了超长超时# 危险等待元素出现(某个可能不存在的元素,300秒)# 5分钟# 安全等待元素出现(某个可能不存在的元素,10秒)判断元素是否存在(某个可能不存在的元素)-找到了吗 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3757e363b69f474bafc17e196d8b8707.png#pic_center)如果 没有 找到了吗:输出日志(元素未出现跳过)继续下一次循环规则等待元素出现超时不要超过 30 秒。如果 30 秒还等不到大概率永远等不到。元凶2死循环没有退出条件店群矩阵自动化突破运营极限# 危险条件循环(True):点击元素(下一页)# 如果最后一页没有下一页按钮会一直报错重试# 安全条件循环(True):判断元素是否存在(下一页按钮)-有下一页 如果 有下一页:点击元素(下一页按钮)等待(1秒)否则:输出日志(翻页结束)跳出循环永远给你的条件循环加一个跳出条件。最简单的做法是加一个最大循环次数计数器循环次数上限200当前次数0条件循环(True):当前次数当前次数1如果 当前次数循环次数上限:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/18d014eab4fc4882a642c49a7d0009f0.png#pic_center)输出日志(循环次数已达上限强制退出)跳出循环 执行正常逻辑()元凶3网络请求没有超时影刀的打开网页、等待元素出现本身有超时但 Python 代码里的 HTTP 请求没有默认超时# 危险importrequests resprequests.get(url)# 没有timeout可能永远等下去# 安全resprequests.get(url,timeout15)# 15秒超时二、全局超时保护——给整个流程上保险影刀没有整个流程的超时设置但可以自己实现# 方案在最外层加一个总超时控制Python代码:importtime 全局开始时间time.time()最大运行时间3600# 1小时单位秒# 在关键节点检查def检查超时(开始时间,最大时间):已运行time.time()-开始时间if已运行最大时间:raiseTimeoutError(f流程运行超时已运行{已运行:.0f}秒超过限制{最大时间}秒)# 在关键节点调用检查超时(全局开始时间,最大运行时间)三、日志系统——死也要留句话流程卡死不可怕可怕的是你不知道卡在哪。3.1 关键节点日志输出日志( 流程开始 )输出日志(f开始时间:{当前时间})输出日志(f关键词数量:{关键词总数})遍历行索引(1,关键词总数):输出日志(f[{当前行}/{关键词总数}] 开始采集:{当前关键词})打开网页(搜索URL)输出日志(f[{当前行}] 页面已打开)输入文本(搜索框,当前关键词)点击元素(搜索按钮)输出日志(f[{当前行}] 搜索已执行)等待元素出现(商品列表,8秒)输出日志(f[{当前行}] 商品列表已加载)# ...采集逻辑...输出日志(f[{当前行}] 采集完成:{已采集}条)输出日志( 流程正常结束 )3.2 错误日志Try:执行可能失败的操作()Catch 异常:Python代码:error_msgf !!! 流程异常 !!! 时间:{当前时间}关键词:{当前关键词}步骤:{当前步骤}异常信息:{异常.message}print(error_msg)# 写入错误日志文件withopen(rD:\日志\error.log,a,encodingutf-8)asf:f.write(error_msg\n*50\n)四、超时重试机制重要的操作不要只试一次# 重试机制模板最大重试次数3重试次数0操作成功False条件循环(重试次数最大重试次数 且 没有 操作成功):重试次数重试次数1Try:打开网页(目标URL)等待元素出现(目标元素,10秒)操作成功True输出日志(f操作成功第{重试次数}次尝试)[video(video-YITpnFak-1781240817273)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]Catch 异常:输出日志(f操作失败第{重试次数}次尝试:{异常.message})如果 重试次数最大重试次数:等待(3秒)# 重试前等待一会刷新页面()如果 没有 操作成功:输出日志(f操作最终失败已重试{最大重试次数}次跳过)# 截图保存现场截图(fD:\日志\失败截图_{时间戳}.png)继续下一次循环五、内存管理——防止偷偷吃满影刀跑了 2 个小时后浏览器越来越卡是因为内存没释放。# 每处理30个商品重启浏览器释放内存遍历列表(商品列表,当前商品,idx):处理商品数据()如果 idx%300且 idx0:输出日志(f已处理{idx}个商品重启浏览器释放内存)关闭浏览器()等待(2秒)打开网页(继续URL)等待元素出现(恢复标识,10秒)或者更简单的把大流程拆成多个独立子流程每个子流程跑完就释放自己。六、环境检查——在开始之前确认一切就绪# 流程启动前的环境检查输出日志( 环境预检 )# 1. 检查网络Python代码:importsockettry:socket.create_connection((www.baidu.com,80),timeout5)print(✅ 网络正常)except:print(❌ 网络异常流程终止)# 2. 检查关键文件是否存在判断文件是否存在(D:\关键词表.xlsx)-文件存在 如果 没有 文件存在:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/205a3bf53b0e41909c5508c3912f880c.png#pic_center)输出日志(❌ 关键词表不存在流程终止)Raise(关键文件缺失)# 3. 检查目标网站是否可访问Try:打开网页(https://目标网站.com)等待元素出现(网站标识,5秒)输出日志(✅ 目标网站可访问)Catch 异常:输出日志(❌ 目标网站不可访问)Raise(目标网站不可达)输出日志( 环境预检通过 )七、防御性编程检查清单#检查项做法1所有while循环有退出条件加最大循环次数或判断跳出2所有等待有超时等待元素出现设不超过30秒3所有HTTP请求有timeoutPython代码里加timeout154关键节点有日志打开网页/搜索/翻页前后打日志5异常有截图Catch里截图保存现场6操作有重试重要操作失败重试2~3次7启动前检查环境网络→文件→目标网站 三项预检8长时间运行有内存释放每N次操作重启浏览器作者林焱本文为《影刀RPA学习手册》系列文章之一内容源于实操经验的整理与分享。