
影刀RPA 流程的暂停与恢复手动确认与延时等待作者林焱不是所有流程都需要从头跑到尾不停歇。有些场景需要流程暂停等待人工确认、有些需要等待某个条件满足后继续、有些需要在关键步骤前给用户一个检查的机会。但很多新手不知道怎么正确实现暂停要么用死循环疯狂轮询占满CPU要么暂停后就恢复不了了。这篇文章把流程暂停与恢复的几种方案讲全。一、延时等待1.1 固定延时最简单的暂停方式等待固定时间后继续【延时等待】 等待时间5秒Python中importtime time.sleep(5)# 暂停5秒time.sleep(0.5)# 暂停500毫秒1.2 随机延时模拟人类操作节奏避免被检测为机器人importtimeimportrandom# 随机等待1-3秒delayrandom.uniform(1,3)time.sleep(delay)# 随机等待带偏好delayrandom.choice([1,2,2,3,3,3,5])# 更倾向于2-3秒time.sleep(delay)1.3 延时的适用场景页面加载后等待渲染完成操作之间避免太快触发频率限制模拟人类操作节奏店群矩阵自动化突破运营极限等待动画/过渡效果完成坑用延时代替等待元素# 不推荐固定等3秒可能不够也可能浪费time.sleep(3)click_element(#button)# 推荐等待元素出现wait_for_element(#button,timeout10)click_element(#button)固定延时是最低效的等待方式。能用【等待元素】就用【等待元素】。二、条件等待2.1 轮询等待等待某个条件满足后继续执行importtimedefwait_for_condition(check_func,timeout60,interval2):等待条件满足starttime.time()whiletime.time()-starttimeout:ifcheck_func():returnTruetime.sleep(interval)returnFalse# 超时# 使用等待文件出现deffile_exists():importosreturnos.path.exists(D:\\data\\ready.flag)ifwait_for_condition(file_exists,timeout300,interval5):print(文件已出现继续执行)else:print(等待超时文件未出现)2.2 等待文件出现场景等待另一个流程生成数据文件后继续处理。importosimporttimefromdatetimeimportdatetimedefwait_for_file(filepath,timeout600,interval5):等待文件出现print(f等待文件{filepath})starttime.time()whiletime.time()-starttimeout:ifos.path.exists(filepath):# 检查文件是否写入完成大小稳定size1os.path.getsize(filepath)time.sleep(1)size2os.path.getsize(filepath)ifsize1size2andsize10:print(f文件已就绪{filepath}{size1}字节)returnTruetime.sleep(interval)print(f等待超时{filepath})returnFalse# 使用ifwait_for_file(D:\\data\\export.xlsx,timeout300):# 处理文件process_file(D:\\data\\export.xlsx)else:print(文件未出现跳过处理)2.3 等待网页加载importtimedefwait_for_page_load(web_handle,timeout30):等待网页加载完成starttime.time()whiletime.time()-starttimeout:# 检查document.readyStatestateexecute_js(web_handle,return document.readyState)ifstatecomplete:returnTruetime.sleep(0.5)returnFalse三、人工确认暂停3.1 弹窗确认在关键步骤前暂停弹窗让用户确认importctypesimportsysdefask_user_confirm(message):弹窗让用户确认resultctypes.windll.user32.MessageBoxW(0,message,RPA流程确认,4# 4 MB_YESNO)returnresult6# 6 IDYES# 使用ifask_user_confirm(即将提交订单确认继续):print(用户确认继续执行)# 提交订单else:print(用户取消停止执行)sys.exit(0)3.2 文件信号确认场景流程暂停等待用户在指定位置创建一个文件来确认继续。importosimporttimedefwait_for_user_confirmation(signal_file,timeout3600,message):等待用户确认创建信号文件# 清除旧的信号文件ifos.path.exists(signal_file):os.remove(signal_file)print(f\n{*50})print(f流程已暂停等待人工确认)print(f说明{message})print(f确认方式创建文件{signal_file})print(f超时时间{timeout}秒)print(f{*50}\n)starttime.time()whiletime.time()-starttimeout:ifos.path.exists(signal_file):print(收到确认信号继续执行)os.remove(signal_file)# 清理信号文件returnTruetime.sleep(2)print(等待超时流程终止)returnFalse# 使用ifwait_for_user_confirmation(D:\\confirm.flag,timeout600,message请检查采集数据是否正确确认后创建此文件继续):# 继续执行pass3.3 输入框暂停场景流程需要人工输入验证码或补充信息。importtkinterastkfromtkinterimportsimpledialogdefget_user_input(prompt,title请输入):弹窗让用户输入roottk.Tk()root.withdraw()# 隐藏主窗口user_inputsimpledialog.askstring(title,prompt)root.destroy()returnuser_input# 使用让用户输入验证码captchaget_user_input(请输入验证码)ifcaptcha:# 填写验证码并提交fill_input(#captcha,captcha)else:print(用户取消输入)四、暂停恢复的设计模式4.1 断点续跑模式流程记录当前执行到哪一步暂停后可以从断点恢复importjsonimportosclassFlowCheckpoint:流程断点管理def__init__(self,checkpoint_file):self.filecheckpoint_file self.stateself._load()def_load(self):ifos.path.exists(self.file):withopen(self.file,r)asf:returnjson.load(f)return{completed_steps:[],current_step:None,data:{}}defsave_step(self,step_name):记录完成的步骤ifstep_namenotinself.state[completed_steps]:self.state[completed_steps].append(step_name)self.state[current_step]step_name self._save()defis_step_done(self,step_name):检查步骤是否已完成returnstep_nameinself.state[completed_steps]defsave_data(self,key,value):保存数据self.state[data][key]value self._save()defget_data(self,key,defaultNone):获取数据returnself.state[data].get(key,default)defclear(self):清除断点self.state{completed_steps:[],current_step:None,data:{}}self._save()def_save(self):withopen(self.file,w)asf:json.dump(self.state,f,ensure_asciiFalse,indent2)# 使用checkpointFlowCheckpoint(D:\\checkpoint.json)# 每个步骤前检查是否已完成ifnotcheckpoint.is_step_done(login):login()checkpoint.save_step(login)ifnotcheckpoint.is_step_done(collect_page1):datacollect_page(1)checkpoint.save_data(page1_data,data)checkpoint.save_step(collect_page1)ifnotcheckpoint.is_step_done(process_data):datacheckpoint.get_data(page1_data)resultprocess(data)checkpoint.save_data(result,result)checkpoint.save_step(process_data)# 全部完成后清除断点checkpoint.clear()4.2 暂停标志模式流程定期检查暂停标志发现暂停就等待恢复importosimporttimedefcheck_pause():检查是否需要暂停pause_fileD:\\pause.flagreturnos.path.exists(pause_file)defwait_if_paused():如果暂停了就等待恢复whilecheck_pause():[video(video-i53zDdgW-1784482874853)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]print(流程已暂停等待恢复...)time.sleep(5)print(流程恢复)# 在关键位置调用foriteminitems:wait_if_paused()# 检查暂停process(item)用户创建D:\pause.flag文件暂停流程删除文件恢复流程。五、实战场景5.1 采集前人工确认# 1. 自动采集第一页数据preview_datacollect_page(1)# 2. 保存预览数据importpandasaspd dfpd.DataFrame(preview_data)df.to_excel(D:\\preview.xlsx,indexFalse)# 3. 暂停等待确认ifwait_for_user_confirmation(D:\\confirm.flag,timeout300,message请检查 D:\\preview.xlsx 中的数据格式是否正确):# 4. 确认后继续采集所有页all_datapreview_data page2whilehas_next_page():all_data.extend(collect_page(page))page1print(f共采集{len(all_data)}条)else:print(用户未确认流程终止)5.2 等待数据就绪# 流程A导出数据另一个系统在做# 流程B等待导出完成后处理# 等待导出文件出现export_fileD:\\exports\\daily_report.xlsxifwait_for_file(export_file,timeout1800,interval10):# 文件就绪开始处理dfpd.read_excel(export_file)process(df)else:# 超时send_notification(导出文件未就绪流程超时终止)5.3 定时等待fromdatetimeimportdatetimeimporttimedefwait_until(target_time_str):等待到指定时间nowdatetime.now()targetdatetime.strptime(f{now.strftime(%Y-%m-%d)}{target_time_str},%Y-%m-%d %H:%M:%S)# 如果目标时间已过等到明天iftargetnow:fromdatetimeimporttimedelta targettimedelta(days1)wait_seconds(target-now).total_seconds()print(f等待{wait_seconds:.0f}秒到{target.strftime(%H:%M:%S)})time.sleep(wait_seconds)# 等到9点再开始wait_until(09:00:00)print(开始执行)六、避坑清单坑1轮询间隔太短# 错误每0.1秒检查一次CPU占用高whilenotcondition():time.sleep(0.1)# 推荐根据场景设置合理间隔whilenotcondition():time.sleep(2)# 文件检查2-5秒# 网络检查可以更频繁坑2暂停后忘记恢复用户创建了暂停文件但忘记删除流程一直暂停。设置超时机制。坑3暂停时资源未释放流程暂停时浏览器一直开着占用资源。长时间暂停考虑关闭浏览器恢复时重新打开。坑4断点文件丢失断点文件存在系统盘系统崩溃后丢失。断点文件存在安全的位置或者同步到云端。坑5弹窗阻塞流程Windows弹窗是阻塞的弹窗期间流程完全停止。如果需要非阻塞的通知用文件信号或日志写入。