影刀RPA 流程调试技巧全攻略:从日志到断点

发布时间:2026/7/20 11:10:30
影刀RPA 流程调试技巧全攻略:从日志到断点 影刀RPA 流程调试技巧全攻略从日志到断点作者林焱写RPA流程开发只占30%的时间剩下70%都在调试——流程跑出错了不知道哪一步出错、数据不对但不知道在哪一步被改错了、网页元素突然定位不到但不知道为什么。这篇文章把影刀RPA里所有调试手段整理成一篇攻略从最基础的日志输出到高级的断点调试帮你快速定位问题。一、什么情况用什么问题类型调试方法说明流程报错了看不懂查看错误日志影刀自带错误信息不知道哪一步出问题单步执行一步一步跑看在哪步出错变量值不对日志输出在关键位置打印变量值网页元素定位失败截图选择器检查看实际页面和选择器是否匹配流程逻辑不对断点调试在指定位置暂停检查状态性能太慢耗时统计每步加计时器数据处理结果不对中间结果检查每步后检查输出间歇性出错详细日志重放记录所有操作重现问题二、怎么做2.1 日志输出最基础的调试影刀的日志指令影刀有【输出调试信息】指令可以在流程执行时输出信息到日志面板。【输出调试信息】→ 内容当前页码: page_num.ToString() 【输出调试信息】→ 内容采集到 data_count.ToString() 条数据 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c3c956b0690e40be9af805a97c65533a.png#pic_center)用Python输出更详细的日志importdatetimedeflog(message,levelINFO):带时间戳和级别的日志timestampdatetime.datetime.now().strftime(%H:%M:%S)print(f[{timestamp}] [{level}]{message})# 使用log(流程开始执行)log(f当前页码:{page_num})log(f采集到{len(data)}条数据,INFO)log(f元素未找到重试第{retry_count}次,WARNING)log(f网络请求失败:{error_message},ERROR)结构化日志记录importjsonimportdatetimeimportosclassFlowLogger:流程日志记录器def__init__(self,flow_name,log_dirrD:\logs):self.flow_nameflow_name self.log_dirlog_dir os.makedirs(log_dir,exist_okTrue)# 当天日志文件todaydatetime.date.today().strftime(%Y%m%d)self.log_fileos.path.join(log_dir,f{flow_name}_{today}.log)self.steps[]# 记录执行步骤deflog(self,step_name,message,dataNone,levelINFO):记录日志entry{timestamp:datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S),level:level,step:step_name,message:message,data:data}self.steps.append(entry)# 输出到控制台print(f[{entry[timestamp]}] [{level}]{step_name}:{message})# 写入文件withopen(self.log_file,a,encodingutf-8)asf:f.write(json.dumps(entry,ensure_asciiFalse)\n)deferror(self,step_name,message,errorNone):记录错误self.log(step_name,message,levelERROR,datastr(error)iferrorelseNone)defsummary(self):输出执行摘要totallen(self.steps)errorssum(1forsinself.stepsifs[level]ERROR)warningssum(1forsinself.stepsifs[level]WARNING)print(f\n{*50})print(f执行摘要:{self.flow_name})print(f总步骤:{total}, 错误:{errors}, 警告:{warnings})print(f日志文件:{self.log_file})print(f{*50})# 使用# logger FlowLogger(商品采集)# logger.log(启动, 流程开始)# logger.log(登录, 登录成功, {user: admin})# logger.error(采集, 第3页超时, TimeoutError)# logger.summary()2.2 单步执行拼多多店群自动化上架方案影刀支持单步执行模式一步一步运行流程操作方式在编辑器中点击「单步执行」按钮或按快捷键流程执行一步就暂停查看当前变量值和状态点击「继续」执行下一步适用场景流程逻辑复杂不确定执行顺序某一步出错了但不知道是哪步变量值在某步之后变了要找到变化点2.3 变量监控在调试时实时监控变量值的变化# 在关键位置插入变量检查点defcheck_variable(var_name,var_value,expectedNone):检查变量值print(f变量{var_name}{var_value}(类型:{type(var_value).__name__}))ifexpectedisnotNone:ifvar_valueexpected:print(f ✅ 符合预期:{expected})else:print(f ❌ 不符合预期期望:{expected}, 实际:{var_value})# 检查常见问题ifvar_valueisNone:print(f ⚠️ 值为None)elifisinstance(var_value,str)andvar_value:print(f ⚠️ 空字符串)elifisinstance(var_value,(list,dict))andlen(var_value)0:print(f ⚠️ 空集合)returnvar_value# 使用# page_num 3# check_variable(page_num, page_num, expected3)## data []# check_variable(data, data) # 会提示空集合2.4 断点调试在关键位置设置断点流程执行到断点时暂停影刀的断点功能在指令上右键 → 设置断点流程执行到该指令时暂停检查当前所有变量值可以手动修改变量值后继续执行用Python实现条件断点# 条件断点满足条件才暂停page_num3total_pages10# 只在第3页时输出详细信息ifpage_num3:print(f 断点第{page_num}页 )print(f已采集数据:{len(all_data)}条)print(f当前URL:{current_url})print(f页面标题:{page_title})# 可以在这里加input()暂停但在影刀中不推荐2.5 截图调试网页自动化出错时截图是最直接的调试方式importpyautoguiimportdatetimeimportosdefdebug_screenshot(namedebug,save_dirrD:\logs\screenshots):调试截图os.makedirs(save_dir,exist_okTrue)timestampdatetime.datetime.now().strftime(%Y%m%d_%H%M%S)filenamef{name}_{timestamp}.pngfilepathos.path.join(save_dir,filename)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ee383c4c8b974d2cae008cb2ca4b9ebf.png#pic_center)pyautogui.screenshot(filepath)print(f截图已保存:{filepath})returnfilepath# 在关键步骤前后截图# debug_screenshot(before_click)# 【点击元素】# debug_screenshot(after_click)网页元素截图用影刀的【截图】指令【截图】→ 截图方式指定元素截图 目标元素xxx 保存路径D:\logs\screenshots\2.6 选择器调试网页元素定位失败时检查选择器是否正确# 用JavaScript检查元素是否存在js_check // 检查元素是否存在 var element document.querySelector(CSS选择器); if (element) { return JSON.stringify({ found: true, tag: element.tagName, text: element.innerText.substring(0, 100), visible: element.offsetParent ! null, rect: element.getBoundingClientRect() }); } return JSON.stringify({found: false}); # 在影刀的【执行JavaScript】节点里运行上面的代码# 根据返回结果判断元素状态选择器调试清单元素定位失败时检查 1. 页面是否完全加载加等待 2. 元素是否在iframe里切换iframe 3. 元素是否需要滚动才能看到滚动到元素 4. 元素是否动态加载等待元素出现 5. 选择器是否因为页面改版而失效重新捕获 6. 是否有多个匹配元素用更精确的选择器2.7 数据流追踪追踪数据在流程中的变化importjsonclassDataTracker:数据流追踪器def__init__(self):self.history[]deftrack(self,step_name,data):记录数据在某步骤的状态# 深拷贝防止引用问题importcopy snapshotcopy.deepcopy(data)self.history.append({step:step_name,data:snapshot,data_type:type(data).__name__,count:len(data)ifhasattr(data,__len__)elseNone})print(f[追踪]{step_name}:{type(data).__name__},end)ifhasattr(data,__len__):print(f (长度:{len(data)}))else:print(f {data})defdiff(self,step1,step2):比较两个步骤的数据差异d1Noned2Noneforhinself.history:ifh[step]step1:d1h[data]ifh[step]step2:d2h[data]ifd1isNoneord2isNone:print(找不到指定步骤)returnifisinstance(d1,list)andisinstance(d2,list):added[xforxind2ifxnotind1]removed[xforxind1ifxnotind2]print(f{step1}→{step2}:)print(f 新增:{len(added)}项)print(f 删除:{len(removed)}项)defreport(self):输出追踪报告print(f\n 数据流追踪报告 )forhinself.history:count_strf (数量:{h[count]})ifh[count]isnotNoneelseprint(f{h[step]}:{h[data_type]}{count_str})# 使用# tracker DataTracker()# tracker.track(初始数据, products)# tracker.track(过滤后, filtered)# tracker.track(排序后, sorted_data)# tracker.track(去重后, unique_data)# tracker.report()2.8 性能分析importtimefromdatetimeimportdatetimeclassPerformanceAnalyzer:性能分析器def__init__(self):self.checkpoints[]defmark(self,name):标记一个性能检查点self.checkpoints.append({name:name,time:time.time(),memory:self._get_memory()})def_get_memory(self):获取当前内存使用try:importpsutilimportos processpsutil.Process(os.getpid())returnprocess.memory_info().rss/1024/1024# MBexcept:return0defreport(self):输出性能报告iflen(self.checkpoints)2:returnprint(f\n 性能分析报告 )print(f{步骤:20}{耗时:12}{累计:12}{内存(MB):12})print(-*56)total_time0foriinrange(len(self.checkpoints)):cpself.checkpoints[i]ifi0:elapsed0else:elapsedcp[time]-self.checkpoints[i-1][time]total_timeelapsed memcp[memory]print(f{cp[name]:20}{elapsed:8.2f}s{total_time:8.2f}s{mem:8.1f})print(-*56)print(f{总耗时:20}{:12}{total_time:8.2f}s)# 找出最慢的步骤max_elapsed0slowest_stepforiinrange(1,len(self.checkpoints)):elapsedself.checkpoints[i][time]-self.checkpoints[i-1][time]ifelapsedmax_elapsed:max_elapsedelapsed slowest_stepself.checkpoints[i][name]print(f最慢步骤:{slowest_step}({max_elapsed:.2f}s))# 使用# pa PerformanceAnalyzer()# pa.mark(流程开始)# # ... 采集数据 ...# pa.mark(采集完成)# # ... 处理数据 ...# pa.mark(处理完成)# # ... 写入Excel ...# pa.mark(写入完成)# pa.report()三、有什么坑坑1日志太多找不到关键信息流程里每一步都打日志跑完后日志几千行找不到出错的那行。解决分级日志——正常步骤用INFO异常用WARNING出错用ERROR。排查时先搜ERROR# 只看错误日志deffilter_error_logs(log_file):withopen(log_file,r,encodingutf-8)asf:forlineinf:[video(video-cKxRFxn7-1784482941834)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]iflevel: ERRORinlineor[ERROR]inline:print(line.strip())坑2调试代码忘记删调试时加的print和临时变量流程上线后还在运行影响性能。解决用一个全局开关控制调试输出DEBUGTrue# 调试时设为True上线前改为Falsedefdebug_print(message):ifDEBUG:print(f[DEBUG]{message})![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5cc4bec998044876895aee699f27e9ec.png#pic_center)# 上线前只需要改一行DEBUGFalse坑3单步执行时网页状态变化单步执行时每步之间间隔几秒网页可能因为超时或动态刷新而变化导致后续步骤失败。解决单步调试用于检查逻辑和数据网页操作建议用完整执行日志的方式调试。坑4截图太多占满磁盘每次出错都截图一天下来截图占几个GB。解决限制截图数量定期清理importosimporttimedefclean_old_screenshots(screenshot_dir,max_age_hours24):清理旧截图ifnotos.path.exists(screenshot_dir):returncurrent_timetime.time()cleaned0forfilenameinos.listdir(screenshot_dir):filepathos.path.join(screenshot_dir,filename)ifos.path.isfile(filepath):file_agecurrent_time-os.path.getmtime(filepath)iffile_agemax_age_hours*3600:os.remove(filepath)cleaned1print(f清理了{cleaned}个旧截图)坑5间歇性错误无法复现有些错误时有时无调试时正常上线后偶尔出错。解决加详细日志记录所有操作出错后重放# 记录每次操作的完整上下文deflog_operation(op_name,**context):记录操作上下文log_entry{operation:op_name,timestamp:datetime.datetime.now().isoformat(),context:context}# 写入日志文件withopen(rD:\logs\operations.jsonl,a,encodingutf-8)asf:f.write(json.dumps(log_entry,ensure_asciiFalse)\n)# 每个关键操作都记录# log_operation(click_element, selectorbtn_submit, page_urlurl, page_titletitle)总结调试的核心方法论先看错误信息——影刀的错误提示通常能直接定位问题加日志定位——在出错位置前后加日志缩小排查范围截图留证据——网页操作出错时截图是最好证据单步查逻辑——逻辑错误用单步执行逐步排查数据流追踪——数据不对时追踪数据在每步的变化性能分析找瓶颈——太慢就加耗时统计找出最慢的步骤调试代码要清理——上线前删掉或关闭调试输出