基于TestRail API与Python实现自动化测试结果同步的工程实践
1. 项目概述为什么我们需要自动化测试结果同步在软件研发的日常里测试团队和开发团队之间总有一道无形的“墙”。开发同学跑完自动化测试结果可能躺在本地日志、Jenkins构建产物或者某个Excel表格里。测试同学则需要手动登录TestRail这样的测试管理系统一个个用例地去更新状态、填写备注、上传附件。这个过程枯燥、易错而且严重滞后。当自动化测试用例数以千计时手动同步一次结果可能就是半天的工作量所谓的“持续反馈”和“质量左移”就成了空谈。我经历过太多这样的场景凌晨的自动化回归套件跑完了发现了几十个失败用例。第二天一早测试负责人需要花一两个小时整理报告才能把清晰的问题清单同步给开发。这中间的时间差就是风险滋生的温床。TestRail API Python 自动同步这个方案瞄准的就是这个痛点。它的核心目标不是取代TestRail或自动化测试框架而是在它们之间架起一座自动化、高可靠的“数据桥梁”实现从测试执行到结果反馈的无人值守闭环。简单来说它要做的事情就是当你的自动化测试脚本无论是基于Selenium、Playwright、Pytest还是Robot Framework执行完毕后用一个Python脚本自动解析测试结果文件如JUnit XML、Allure JSON、Pytest JSON Report等然后通过TestRail官方提供的API将每条用例的通过、失败、阻塞等状态连同错误信息、截图、日志等附件精准地回写到TestRail对应的测试运行Test Run中。这样一来测试团队在TestRail上看到的就是实时、准确、附带丰富上下文的测试报告决策和跟进效率能提升一个数量级。这个方案特别适合测试左移做得比较深入、自动化测试覆盖率较高的团队。它让自动化测试的价值不仅停留在“发现缺陷”更延伸到了“高效管理测试资产和过程”是构建真正敏捷、可度量的研发质量体系的关键一环。2. 方案核心设计与技术选型考量2.1 整体架构与数据流设计整个自动同步系统的核心数据流是一个清晰的单向管道从自动化测试执行引擎到TestRail。其架构可以抽象为以下三个核心模块结果生成模块这是上游由你的自动化测试框架负责。你需要配置框架使其在执行完成后输出一份结构化的结果文件。目前业界最通用、支持最广的格式是JUnit XML。几乎所有主流的测试框架Pytest, JUnit, TestNG, Robot Framework都支持生成此格式。它包含了testsuite,testcase,status,failure message,system-out等标准元素信息足够丰富。结果解析与转换模块这是我们的Python脚本的核心职责。它需要读取JUnit XML文件将其中的每个测试用例映射到TestRail中的具体用例Case。这里的关键是用例ID的映射。通常我们会在自动化测试用例的方法名、类名或装饰器中嵌入TestRail的用例ID如C12345。解析器需要提取这个ID并构建一个数据结构包含case_id,status_id对应TestRail的状态通过、失败、重试、阻塞等comment错误堆栈或自定义备注elapsed执行耗时等。API通信与回写模块这个模块使用Python的requests库调用TestRail API将上一步转换好的结果数据批量或逐个提交到指定的TestRail测试运行中。TestRail API提供了add_result_for_case端点来为单个用例添加结果也提供了add_results_for_cases来批量提交后者效率高得多。为什么选择Python作为粘合剂首先TestRail官方提供了Python的API客户端库testrail-api虽然我们可能不完全用它但它说明了官方的倾向。其次Python在测试领域是绝对的主流无论是编写测试脚本还是运维脚本团队技术栈统一能降低维护成本。Python丰富的库如xml.etree.ElementTree解析XMLrequests处理HTTP让开发这类集成工具非常高效。最后它的脚本特性非常适合作为CI/CD流水线中的一个环节来调度。2.2 TestRail API关键端点梳理要实现同步我们需要和TestRail的几个核心API端点打交道认证所有API请求都需要在HTTP头中使用Basic Auth即你的邮箱和API密钥在TestRail用户设置中生成。get_cases获取某个项目或测试套件下的所有用例。通常用于前期建立映射关系或验证用例ID是否存在。get_runs/get_run获取项目下的测试运行或特定运行的详细信息。我们需要知道目标测试运行的run_id。add_result_for_case为测试运行中的某个特定用例添加结果。这是最基础的接口。add_results_for_cases批量添加结果。这是性能关键它接受一个包含多个结果对象的列表一次请求即可更新大量用例状态。add_attachment_to_result为某个已提交的结果添加附件如失败截图、日志文件。这通常需要在提交结果后根据返回的result_id进行第二次调用。注意TestRail的API有速率限制。免费版和云托管版限制较严格。批量接口add_results_for_cases不仅能提升性能还能有效减少请求次数避免触发限流。2.3 状态映射策略从测试框架到TestRail不同测试框架的状态定义可能略有不同但通常都包含passed,failed,skipped。TestRail的状态则更丰富常见的有1- 通过5- 失败2- 阻塞4- 重试6- 尚未完成自定义状态我们需要定义一个清晰的映射字典STATUS_MAPPING { “passed”: 1, # 通过 “failed”: 5, # 失败 “skipped”: 2, # 我们将“跳过”映射为“阻塞”或者根据原因映射为其他自定义状态 “error”: 5, # 错误通常也视为失败 }对于skipped需要仔细处理。如果是由于前置条件不满足而主动跳过映射为阻塞是合理的。如果是因为代码中pytest.mark.skip装饰的暂时不测的用例你可能希望映射为一个如“未执行”的自定义状态这需要在TestRail中预先配置好。3. 核心实现Python脚本的构建与细节3.1 环境准备与依赖安装首先你需要一个Python环境3.6。项目依赖很简单主要就是requests用于HTTP通信以及可选的xmltodict如果你觉得它比标准库的xml.etree更易用。创建一个新的项目目录并初始化虚拟环境是个好习惯mkdir testrail-result-sync cd testrail-result-sync python -m venv venv # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate然后安装核心依赖pip install requests # 可选用于更友好地解析XML pip install xmltodict接下来创建一个配置文件如config.ini或config.yaml用于存放敏感信息和可变参数。绝对不要将API密钥硬编码在脚本里。config.ini示例[testrail] base_url https://yourcompany.testrail.io user_email your.emailcompany.com api_key YOUR_API_KEY_HERE project_id 1 run_id 100 [paths] junit_xml_path ./test-results/junit.xml attachment_dir ./test-results/screenshots/3.2 解析JUnit XML结果文件假设你的Pytest运行后生成了junit.xml。我们需要解析它提取每个测试用例的信息。import xml.etree.ElementTree as ET from typing import List, Dict def parse_junit_xml(xml_path: str) - List[Dict]: 解析JUnit XML文件提取用例名、状态、错误信息等。 约定测试用例的name或classname字段中包含TestRail用例ID格式如 test_login[C12345] tree ET.parse(xml_path) root tree.getroot() test_cases [] # JUnit XML结构通常是 testsuites - testsuite - testcase for testsuite in root.findall(‘testsuite’): for testcase in testsuite.findall(‘testcase’): case_info {} case_name testcase.get(‘name’, ‘’) class_name testcase.get(‘classname’, ‘’) # 关键从用例标识中提取TestRail Case ID # 这里假设用例ID在方括号内例如test_login_success[C12345] import re match re.search(r‘\[(C\d)\]’, case_name) if not match: # 也可能在classname里或者有其他约定格式 match re.search(r‘\[(C\d)\]’, f“{class_name}.{case_name}”) if not match: print(f“警告: 未在用例 ‘{case_name}’ 中找到TestRail用例ID已跳过”) continue case_info[‘case_id’] match.group(1) # 例如 ‘C12345’ case_info[‘name’] case_name # 判断状态如果有failure或error子元素则是失败否则是通过 if testcase.find(‘failure’) is not None or testcase.find(‘error’) is not None: status “failed” # 提取错误信息 failure_elem testcase.find(‘failure’) or testcase.find(‘error’) comment failure_elem.get(‘message’, ‘’) if failure_elem.text: comment “\n” failure_elem.text.strip()[:500] # 限制长度 else: status “passed” comment “” case_info[‘status’] status case_info[‘comment’] comment # 提取执行时间秒 case_info[‘elapsed’] int(float(testcase.get(‘time’, 0))) test_cases.append(case_info) return test_cases实操心得用例ID的提取是整个流程中最容易出错的一环。务必和编写自动化测试用例的同事约定好统一的标识格式并在脚本中做好健壮性处理比如找不到ID时的日志记录和跳过机制。我推荐使用[Cxxx]的格式内嵌在测试名中这样既清晰又便于正则匹配。3.3 封装TestRail API客户端我们将对TestRail API的常用操作进行简单封装重点是处理认证和构建请求。import requests from requests.auth import HTTPBasicAuth import configparser import os class TestRailClient: def __init__(self, base_url, email, api_key): self.base_url base_url.rstrip(‘/’) self.auth HTTPBasicAuth(email, api_key) self.headers {‘Content-Type’: ‘application/json’} def _send_request(self, method, endpoint, dataNone): url f“{self.base_url}/index.php?/api/v2/{endpoint}” response requests.request(method, url, authself.auth, headersself.headers, jsondata) response.raise_for_status() # 如果状态码不是200抛出异常 return response.json() def get_run(self, run_id): 获取特定测试运行的详细信息 return self._send_request(‘GET’, f‘get_run/{run_id}’) def add_results_for_cases(self, run_id, results): 批量添加结果到测试运行 :param run_id: TestRail中的运行ID :param results: 列表每个元素是 {‘case_id’: xx, ‘status_id’: xx, ‘comment’: xx, ‘elapsed’: xx} data {‘results’: results} return self._send_request(‘POST’, f‘add_results_for_cases/{run_id}’, data) def add_attachment_to_result(self, result_id, attachment_path): 为某个结果添加附件 url f“{self.base_url}/index.php?/api/v2/add_attachment_to_result/{result_id}” with open(attachment_path, ‘rb’) as f: files {‘attachment’: f} # 注意上传附件时headers不同 response requests.post(url, authself.auth, filesfiles) response.raise_for_status() return response.json()3.4 组装主流程从解析到提交现在我们把所有部分串联起来。主脚本sync_results.py的逻辑如下import sys from pathlib import Path def main(): # 1. 加载配置 config configparser.ConfigParser() config.read(‘config.ini’) base_url config.get(‘testrail’, ‘base_url’) email config.get(‘testrail’, ‘user_email’) api_key config.get(‘testrail’, ‘api_key’) run_id config.getint(‘testrail’, ‘run_id’) junit_path config.get(‘paths’, ‘junit_xml_path’) attachment_dir config.get(‘paths’, ‘attachment_dir’, fallbackNone) # 2. 初始化客户端 client TestRailClient(base_url, email, api_key) # 3. 解析结果 print(f“正在解析结果文件: {junit_path}”) try: cases_from_xml parse_junit_xml(junit_path) except FileNotFoundError: print(f“错误: 未找到结果文件 {junit_path}”) sys.exit(1) if not cases_from_xml: print(“警告: 未从结果文件中解析到任何有效的测试用例。”) sys.exit(0) print(f“成功解析到 {len(cases_from_xml)} 个用例结果。”) # 4. 构建提交给TestRail的数据 results_to_submit [] for case in cases_from_xml: status_id STATUS_MAPPING.get(case[‘status’], 5) # 默认失败 result { ‘case_id’: int(case[‘case_id’].replace(‘C’, ‘’)), # API需要整数ID ‘status_id’: status_id, ‘comment’: case.get(‘comment’, ‘’), ‘elapsed’: f“{case[‘elapsed’]}s” if case[‘elapsed’] else None, } # 可以在这里根据用例名或ID关联本地附件路径 case_attachment_path None if attachment_dir and case[‘status’] ‘failed’: # 假设附件命名规则为 {case_id}.png 或 {test_name}.png potential_path Path(attachment_dir) / f“{case[‘case_id’]}.png” if potential_path.exists(): case_attachment_path potential_path result[‘_attachment’] str(case_attachment_path) # 自定义字段暂存路径 results_to_submit.append(result) # 5. 批量提交结果 print(f“正在向TestRail运行 {run_id} 提交 {len(results_to_submit)} 个结果...”) try: response client.add_results_for_cases(run_id, results_to_submit) print(f“提交成功本次更新了 {len(response)} 个结果。”) except requests.exceptions.RequestException as e: print(f“提交失败: {e}”) if hasattr(e, ‘response’) and e.response is not None: print(f“响应内容: {e.response.text}”) sys.exit(1) # 6. 可选处理附件上传 # 注意TestRail API限制附件需要在结果提交后使用返回的result_id单独上传。 # 批量提交结果的响应里包含每个用例提交后生成的result_id。 # 这部分逻辑更复杂通常建议1. 在结果comment里附上本地文件路径链接如果CI环境可访问2. 或运行一个后续脚本专门上传附件。 # 此处省略详细的附件上传循环代码。 if __name__ “__main__”: main()4. 集成到CI/CD流水线与生产级优化4.1 与Jenkins/GitLab CI的集成脚本写好了下一步是让它自动运行。以Jenkins Pipeline为例你可以在构建后步骤Post-build Actions中调用这个脚本。Jenkinsfile示例片段pipeline { agent any stages { stage(‘Test’) { steps { sh ‘pytest --junitxmltest-results/junit.xml tests/’ // 假设测试失败时会自动截图到 test-results/screenshots/ } } } post { always { // 无论测试成功与否都尝试同步结果到TestRail script { if (fileExists(‘test-results/junit.xml’)) { sh “python ${env.WORKSPACE}/testrail-sync/sync_results.py” } else { echo ‘未找到测试结果文件跳过TestRail同步’ } } // 归档测试结果 junit ‘test-results/junit.xml’ } } }在GitLab CI中原理类似在.gitlab-ci.yml的after_script或单独的job中执行Python脚本。关键点确保CI运行环境通常是Docker容器或虚拟机中安装了Python和必要的依赖requests并且能访问TestRail的URL网络连通性。4.2 错误处理与日志增强生产环境脚本必须健壮。我们需要增强错误处理和日志记录。重试机制对于网络请求尤其是add_results_for_cases可以添加指数退避的重试逻辑以应对TestRail API的瞬时故障。from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def add_results_with_retry(client, run_id, results): return client.add_results_for_cases(run_id, results)详细日志使用Python的logging模块替代print将不同级别的信息INFO, WARNING, ERROR输出到文件和控制台便于排查问题。结果校验提交后可以调用get_results_for_runAPI获取刚提交的结果与本地解析的结果进行比对确保数据一致性。4.3 性能优化处理大规模测试集当你有上万个用例时一次性构建巨大的results列表并提交可能会遇到内存或API限制问题。可以采取分块chunk提交的策略def submit_results_in_chunks(client, run_id, all_results, chunk_size500): 将结果列表分块提交每块chunk_size个用例 for i in range(0, len(all_results), chunk_size): chunk all_results[i:i chunk_size] print(f“提交块 {i//chunk_size 1}/{(len(all_results)-1)//chunk_size 1} (大小: {len(chunk)})”) try: client.add_results_for_cases(run_id, chunk) except Exception as e: print(f“提交块 {i//chunk_size 1} 时失败: {e}”) # 可以选择记录失败的块稍后重试或直接退出 raise5. 常见问题排查与实战经验在实际部署和运行中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的排查清单。5.1 用例ID映射失败现象脚本运行后TestRail中大量用例状态未更新日志显示“未找到TestRail用例ID”。排查检查正则表达式确认你的正则模式r‘\[(C\d)\]’是否能匹配你自动化代码中的标识。比如有些团队用TR-1234格式那就需要调整正则。检查测试报告生成确保测试框架正确输出了包含完整测试名含ID的JUnit XML。有时测试名会被截断或格式化。手动验证从生成的junit.xml中挑一个用例用文本编辑器打开查看其name和classname属性是否包含预期ID。解决方案统一标识规范并在脚本解析部分增加更灵活的匹配逻辑如同时尝试多种模式并记录下所有无法匹配的用例名供后续排查。5.2 API调用返回403或401错误现象脚本报错HTTP 401 Unauthorized或403 Forbidden。排查API密钥错误确认config.ini中的api_key是最新生成的且未过期。TestRail的API密钥在用户设置中生成如果用户密码更改旧密钥可能失效。基础URL错误确认base_url是正确的。对于云托管版通常是https://yourcompany.testrail.io对于私有部署版格式可能不同。权限问题确认该API密钥对应的用户对目标project_id和run_id拥有“添加测试结果”的权限。解决方案在TestRail界面用该用户登录手动创建一个测试结果确认权限无误。使用curl命令测试API连通性curl -u “email:api_key” “https://yourcompany.testrail.io/index.php?/api/v2/get_projects”。5.3 批量提交速度慢或超时现象提交几千个用例时脚本运行时间很长甚至超时。排查网络延迟CI服务器到TestRail服务器的网络可能较慢。API速率限制触发了TestRail的API限流。单次请求数据量过大虽然add_results_for_cases是批量接口但一次发送数万个结果可能导致请求体过大处理时间长。解决方案使用分块提交如上文所述将大批量数据分成每批500-1000个的小块。在请求间增加短暂休眠如time.sleep(0.5)避免触发速率限制。检查TestRail服务器的性能状态如果是私有部署。5.4 附件上传失败或混乱现象截图上传失败或者传错了图片。排查附件路径问题CI环境中测试生成的截图路径可能与脚本中配置的attachment_dir不一致。命名规则不匹配脚本中查找附件的逻辑如按case_id查找与测试框架实际保存截图时的命名规则不符。API调用顺序必须先提交测试结果获得result_id后才能为该result_id上传附件。如果并发提交可能导致附件关联到错误的结果上。解决方案标准化附件命名在自动化测试框架中强制规定截图以{testrail_case_id}.png格式保存。在结果评论中嵌入链接如果附件管理复杂一个更简单的替代方案是将截图保存在CI构建产物的公共目录下然后在提交到TestRail的comment字段中直接写入该截图的URL链接大多数CI系统都提供构建产物的访问URL。这样无需调用额外的上传API。串行处理附件如果必须上传确保在批量提交结果之后再遍历结果列表根据case_id和result_id的对应关系逐个上传附件并做好错误处理。5.5 测试运行Run的管理策略问题每次自动化执行是更新同一个Test Run还是创建新的经验这取决于你的流程。更新现有Run适用于针对同一版本、同一特性的持续回归。你需要脚本能获取到上次创建的run_id。可以将run_id作为环境变量或从某个配置文件/数据库中读取。创建新Run适用于每次构建都想有独立报告的场景。这需要脚本先调用add_runAPI创建一个新的测试运行获取其run_id然后再提交结果。创建Run时需要指定suite_id,milestone_id等参数逻辑更复杂但报告更清晰。我的常用策略在CI流水线中我会结合两者。每日定时任务更新一个“每日回归”的长期Run。而每次代码合并Merge Request触发构建时则创建一个以合并请求ID命名的临时Run用于评审。生命周期结束后如合并后3天可以通过API自动关闭或删除这些临时Run。

相关新闻

WinCC用户管理:三层权限模型与工业安全实战指南

WinCC用户管理:三层权限模型与工业安全实战指南

1. 项目概述:为什么WinCC用户管理是工业项目的“守门人”在工业自动化项目里,尤其是涉及SCADA(数据采集与监控系统)的现场,西门子WinCC软件几乎是绕不开的名字。很多工程师朋友把大量精力花在了画面组态、变量连接和脚…

2026/9/29 15:18:33 阅读更多 →
Python subprocess模块实战:高效调用命令行工具并解析JSON输出

Python subprocess模块实战:高效调用命令行工具并解析JSON输出

1. 项目缘起:为什么我们总在命令行和程序之间“反复横跳”?做开发或者运维的朋友,估计都经历过这种场景:你写了一个Python脚本,需要调用一个系统命令,比如用ffmpeg转码一个视频,或者用curl获取一…

2026/10/12 8:27:20 阅读更多 →
杭州萧然医院手术怎么样?

杭州萧然医院手术怎么样?

在萧山待久了都知道,这边不管是开厂做老板的女创业者,还是做电商运营、上班顾家两头转的普通女工,常年连轴转熬大夜,很多人查出来子宫肌瘤、卵巢囊肿、HPV阳性甚至私密相关的问题,不到疼得直不起腰根本不肯去医院&…

2026/10/10 13:28:29 阅读更多 →

最新新闻

artcraft:用工程化流程实现可复现的艺术创作

artcraft:用工程化流程实现可复现的艺术创作

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是“艺术”加“手艺”,听起来像是个做创意工具的项目。但真正让我感兴趣的,是它背后隐含的那层意思——把“art”这…

2026/10/12 8:28:03 阅读更多 →
概率方向论文投稿PEIS期刊全流程实战经验分享

概率方向论文投稿PEIS期刊全流程实战经验分享

1. 选刊与评估:为什么投Probability in the Engineering and Informational Sciences先说结论:如果你手头有一篇偏应用概率、随机模型或排队论方向的文章,又不想投那些动不动等一年多的“大刊”,那么这个期刊值得认真考虑。我第一…

2026/10/12 8:28:03 阅读更多 →
数据埋点如何发现用户非预期路径?从行为序列到产品优化实战

数据埋点如何发现用户非预期路径?从行为序列到产品优化实战

前阵子团队在做月度数据分析复盘,产品经理翻着埋点报表突然来了一句:“你看这里,为什么有三分之一的用户注册完之后,没有去完善资料,反而先去逛商城了?我们的新手引导明明写的是先完善资料再领权益啊。”这…

2026/10/12 8:28:03 阅读更多 →
AI辅助开题报告写作:8类工具拆解与选择指南

AI辅助开题报告写作:8类工具拆解与选择指南

你有没有发现,现在写开题报告的第一动作已经变了?过去大家默认的流程是:先沉下心看几十篇文献,再去找导师聊上好几轮,最后硬憋出一份选题说明。现在呢?我见过太多人的打开方式,是先在搜索框里输…

2026/10/12 8:28:03 阅读更多 →
基于RapidOCR的Python OCR源码:识别并返回HTML结构

基于RapidOCR的Python OCR源码:识别并返回HTML结构

简介:这是一套基于 rapidOCR 改造的完整 OCR 图片识别源码,面向需要将图片文字提取并结构化输出的 Python 开发者与项目集成者。它解决了传统 OCR 只返回纯文本、难以直接嵌入页面的问题,通过内置 /engine/ocr 接口接收 http 链接、本地文件或…

2026/10/12 8:28:03 阅读更多 →
8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

第一次在8G显存的卡上把MiniMax H3本地版跑起来的时候,我自己都有点没缓过劲。最初印象里,视频生成模型想本地部署怎么也得16G显存起步,结果在量化方案的加持下不仅能跑,还能连续产出多条可用的漫剧分镜。这篇就把我从环境搭建、模…

2026/10/12 8:27:02 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →