开源自动化工具链实战:从选型到可试用流程的完整指南
1. 从周刊这个形式说起为什么自动化工具需要一份可试用的清单做自动化这些年我最怕听到的一句话就是这个工具挺好的你可以试试。好在哪、怎么试、试完能解决什么问题一概没有。开源雷达周刊这个项目本质上就是在解决这个信息断层——它不满足于告诉你有哪些开源自动化工具而是把十个工具串成一条可试用的流程让你从看到名字到跑通第一个用例中间不需要再跳出去查十篇文档。这个定位很关键。市面上讲自动化工具的内容大致分两类一类是纯资讯列一堆GitHub链接和star数看完等于没看另一类是纯教程上来就假设你已经选好了工具直接讲API怎么调。开源雷达周刊卡在中间——它先帮你把工具选出来再帮你把试用路径铺好。适合谁看我总结下来是三类人刚接触自动化、面对一堆工具不知道从哪下手的初学者已经会用某个工具、但想看看有没有更轻量替代方案的老手还有一类是做技术选型、需要快速评估多个方案再拍板的团队负责人。关键词里开源、自动化、工具链、流程这四个词其实已经把项目的骨架说清楚了。开源是前提自动化是目标工具链是手段流程是落地方式。很多人做自动化失败不是因为工具不好而是因为把工具当成了终点。工具链的意思是单个工具再强也只是链条上的一环真正产生价值的是工具之间的衔接。而流程则是让这条链能重复跑、稳定跑、别人也能跑的那套约定。我在实际带团队做自动化的过程中踩过最大的坑就是工具孤岛——测试用一套、部署用一套、监控又用一套每套都能跑但互相不通最后维护成本比手工还高。开源雷达周刊把十个工具放在一起讲隐含的价值就是让你在选型阶段就考虑衔接问题而不是等到集成的时候才发现两个工具的数据格式对不上。这一点是单纯看单个工具文档永远学不到的。下面我会把这十个工具按能力层次拆开讲清楚每个工具解决什么问题、为什么在这个位置、试用时最容易卡在哪以及它们之间怎么串成一条真正能跑的流程。不是罗列是拆解。2. 十个工具的能力分层谁负责触发谁负责执行谁负责断言十个工具如果平铺直叙地讲读者记不住也用不上。我习惯按自动化流程的生命周期把它们分成四层触发层、执行层、断言层、报告层。这个分层不是官方定义是我自己带项目时总结的好处是每个工具的位置一目了然缺哪层补哪层。2.1 触发层让流程自己动起来而不是等人点触发层解决的是什么时候开始跑的问题。最原始的方式是人手动执行命令但自动化的第一步就是去掉这个人。这一层里pytest虽然是测试框架但它的pytest.mark和命令行参数机制配合CI的定时任务实际上承担了大量触发职责。你可以用pytest -m smoke只跑冒烟用例也可以用pytest --lf只跑上次失败的用例这种按需触发的能力比写一堆if-else判断要干净得多。另一个常被低估的触发工具是Appium配合的调度脚本。Appium本身是移动端自动化框架但它的desired_capabilities配置里可以指定noReset、fullReset等参数这些参数决定了每次触发时环境是干净重建还是复用。我见过太多人在这上面翻车——本地跑得好好的一上CI就挂原因就是触发时环境状态和本地不一致。提示触发层的工具选型核心看两点——能不能按条件触发时间、事件、代码变更能不能控制触发时的初始状态。这两点决定了你的流程是可重复还是看运气。2.2 执行层Maestro、Appium、影刀各管一段执行层是工具最多的一层也是最容易选错的一层。Maestro和Appium都做移动端UI自动化但定位完全不同。Maestro的YAML声明式写法适合快速验证流程能不能走通学习成本极低一个tapOn: 登录就能点按钮。Appium则适合需要精细控制、需要跨平台、需要和现有Java/Python测试代码集成的场景。我的经验是新项目先用Maestro跑通主流程确认业务逻辑没问题再决定要不要上Appium做深度覆盖。影刀这类RPA工具解决的是另一类问题——没有API、只有界面的老旧系统。它的扩展程序能直接操作浏览器和桌面应用适合财务、运营这类非技术岗位自己搭流程。但要注意影刀的流程一旦涉及多系统数据传递稳定性会明显下降因为界面元素一变整个流程就断。所以我的做法是影刀只用来做最后一公里的界面操作数据准备和校验尽量放在代码层。Windows自动化和iOS自动化这两个方向工具选择差异很大。Windows上可以用pywinauto、AutoHotkeyiOS上则基本绕不开Appium或XCUITest。这里的关键不是工具本身而是元素定位策略——是用坐标、用图像识别、还是用无障碍属性。坐标最脆弱图像识别次之无障碍属性最稳但需要开发配合。选工具前先问自己目标应用能不能加无障碍标签能加就优先用属性定位。2.3 断言层pytest的assert只是起点断言层决定你的自动化是真测试还是假测试。很多人写自动化执行完就完事没有断言或者只有一句assert response.status_code 200。这种自动化跑一万次也发现不了业务逻辑错误。pytest的断言机制其实很强assert语句失败时会自动展开表达式告诉你具体哪个值不对。配合pytest.assume可以做软断言一个用例里多个检查点不会因为第一个失败就中断。但pytest本身不解决断言什么的问题这需要你根据业务定义检查点。我的习惯是每个流程至少三层断言状态断言接口返回码、页面标题、数据断言数据库记录、接口返回字段、副作用断言日志、消息队列、下游系统状态。Java接口自动化测试框架这类工具断言能力通常更结构化比如REST Assured的body(data.id, equalTo(1))链式写法很清晰。但代价是代码量更大适合接口数量多、需要长期维护的项目。小项目用pytest加requests就够了没必要上重框架。2.4 报告层别让自动化跑完就消失报告层是最容易被忽略的一层。自动化跑完结果去哪了如果只是控制台输出那等于没跑。Allure是pytest生态里最常用的报告工具能生成带步骤、截图、附件的HTML报告。Maestro也有自己的报告输出但格式比较简陋通常需要自己解析JSON再转成团队习惯的格式。报告层的核心价值不是好看而是可追溯。一个用例失败了报告里要能看到哪一步失败、当时的截图或日志、前后步骤的执行时间。没有这些排查一个失败用例的时间可能比手工重跑还长。我在项目里强制要求所有自动化流程必须输出结构化报告至少包含用例名、开始时间、结束时间、状态、失败原因、附件路径。这个要求看起来简单但能省下大量沟通成本。3. 把工具串成流程从能跑到可试用的三个关键设计工具选好了接下来是串起来。这一步比选工具难因为工具文档通常只讲自己怎么用不讲怎么和别人配合。开源雷达周刊强调可试用流程我理解这个可试用有三个层次单工具能跑通、工具间能传数据、整个流程能重复跑。下面拆开讲。3.1 环境隔离为什么你的流程在别人机器上跑不起来环境问题是自动化流程最大的杀手。你在本地跑得好好的换台机器就挂九成是环境没隔离。env工具链和musl库交叉编译工具链这类词出现在热词里说明很多人已经在关注环境一致性问题。我的做法是用容器做环境隔离但不是简单跑个Docker就完事。关键是要把工具版本、依赖版本、系统库版本都固定下来。比如pytest要固定版本因为不同版本的fixture行为可能有差异Appium要固定driver版本因为不同版本对同一元素的定位策略可能不同。这些细节不固定流程就不可重复。注意环境隔离不是越重越好。小项目用venv加requirements.txt锁定版本就够了上容器反而增加复杂度。判断标准是你的流程需不需要跨机器、跨系统跑需要就上容器不需要venv足够。3.2 数据传递工具之间怎么对话工具链的核心是数据传递。触发层告诉执行层跑哪个用例执行层把结果传给断言层断言层把结论传给报告层。这个链条里数据格式不统一是最常见的问题。我的经验是定义一个中间数据格式所有工具都往这个格式靠。比如用JSON作为统一载体字段包括case_id、status、message、attachments、timestamp。Maestro的输出解析成这个格式pytest的输出也解析成这个格式报告层只认这个格式。这样换工具时只需要改解析层不用动报告层。HDFS读写流程这类词出现在热词里说明大数据场景下的流程编排也是关注点。但原理是一样的——数据在流程各环节之间怎么流转、格式怎么约定、失败怎么重试。自动化流程设计本质上是数据流设计。3.3 失败重试与幂等让流程敢重复跑可试用流程的最后一个关键设计是失败重试和幂等。自动化跑失败很正常网络抖动、元素加载慢、数据没准备好都会导致失败。如果每次失败都要人工介入那自动化就没意义了。重试策略要分情况瞬时失败网络超时、元素未加载可以自动重试通常重试2-3次逻辑失败断言不通过、数据不对不能重试重试多少次结果都一样应该直接报错。区分这两种失败需要在断言层做标记。幂等是指同一个流程跑多次结果应该一致。比如创建订单这个操作跑两次应该创建两个订单而不是报错或创建重复数据。这要求流程设计时考虑数据清理和状态重置。我的做法是每个用例开始前先清理测试数据结束后再清理一次确保下次跑的时候环境是干净的。4. 实测中最容易翻车的五个点讲完设计讲实操。下面这五个点是我和团队在真实项目里反复踩过的每一个都值得单独拿出来说。4.1 元素定位的最后一公里问题UI自动化最耗时的不是写用例是修定位。今天能定位到的按钮明天开发改了个class名就找不到了。Maestro和Appium都支持多种定位方式但稳定性排序是无障碍ID 文本 相对位置 绝对坐标。我的做法是推动开发在关键元素上加testID或accessibilityLabel这是投入产出比最高的做法。如果推不动退而求其次用文本定位但要注意多语言场景下文本会变。绝对坐标是最后的选择只在其他方式都不可行时用而且要加注释说明为什么用坐标。4.2 等待策略sleep是万恶之源新手写自动化最爱用sleep(5)觉得等5秒总够了吧。实测下来sleep要么等太久拖慢整体速度要么等不够导致随机失败。正确的做法是显式等待——等到某个条件满足就继续超时才失败。pytest里可以用pytest.wait或自己封装轮询函数。Maestro有内置的waitForAnimationToEnd和assertVisibleAppium有WebDriverWait。核心思想都一样不要猜时间要等条件。条件可以是元素可见、接口返回、文件生成总之要有一个明确的信号。4.3 测试数据的独立性多个用例共用一套测试数据是随机失败的常见原因。用例A改了数据用例B读到的就是脏数据。解决办法是每个用例自己准备数据用完自己清理。听起来麻烦但比排查随机失败省时间。数据准备可以用fixturepytest的fixture支持scope参数可以控制数据的作用范围。scopefunction每个用例一份数据最干净但最慢scopesession所有用例共用一份最快但容易互相影响。我的建议是写操作用function级读操作用session级平衡速度和隔离性。4.4 报告里的截图和日志失败时没有截图等于盲人摸象。但截图也不是越多越好全流程截图会让报告体积爆炸。我的策略是失败时自动截图关键步骤手动截图。pytest可以用hook在用例失败时自动截图Maestro可以在关键步骤加takeScreenshot。日志同理要分级。DEBUG级日志只在本地开CI上只记INFO以上。日志里要包含足够的上下文当前步骤、输入参数、耗时。没有上下文的日志排查时等于没有。4.5 CI上的超时和资源限制本地跑得好好的上CI就超时通常是资源限制导致的。CI机器的CPU、内存、网络都比本地差元素加载更慢接口响应更久。解决办法是把超时时间调大但不要无限大。我的经验是本地超时时间乘以2到3倍作为CI的超时时间。另外要注意CI上的并行执行。多个用例并行跑时如果共用资源比如同一个测试账号、同一个数据库会互相干扰。解决办法是每个并行任务用独立的资源或者用锁机制串行化对共享资源的访问。5. 从周刊到落地怎么把这十个工具用在自己的项目里看完工具清单和流程设计最后一步是落地。我见过太多人收藏了一堆工具但项目里一个都没用起来。问题通常出在贪多——想一次把所有工具都用上结果每个都只用了皮毛。5.1 先跑通一个最小闭环我的建议是先从一个工具加一个流程开始。比如你选pytest就先写一个用例打开页面、点一个按钮、断言结果。跑通了再加第二个用例。两个用例能稳定跑一周再考虑加报告、加CI、加其他工具。这个顺序很重要。很多人反过来先搭CI、先配报告结果用例本身还不稳定天天修CI配置本末倒置。用例稳定是1其他都是0没有1后面加再多0也没用。5.2 工具选型的够用原则十个工具不是让你全用是让你知道有哪些选择。实际项目里三到四个工具通常就够了一个测试框架pytest或JUnit、一个UI自动化工具Maestro或Appium、一个报告工具Allure、一个CIJenkins或GitHub Actions。其他的按需加不要为了用而用。选型时问自己三个问题这个工具解决我当前最痛的问题吗团队有人能维护它吗它的社区活跃吗出问题能不能搜到答案三个都是是才值得引入。5.3 流程文档化让下一个人也能跑最后一个容易被忽略的点是文档。你的流程跑通了但只有你能跑那价值就减半。文档不需要多正式一个README就够但要包含环境怎么搭、依赖怎么装、用例怎么跑、报告在哪看、常见问题怎么解。我习惯在README里放一个五分钟跑通的章节让新人能快速看到结果。看到结果才有动力深入。开源文档贡献这个词出现在热词里说明社区已经意识到文档的重要性。自己项目的流程文档就是给自己团队的开源贡献。6. 几个关于自动化流程的常见误解在带新人的过程中我发现有些误解反复出现这里集中澄清一下。误解一自动化能替代手工测试。不能。自动化擅长的是回归验证——确认之前能用的功能现在还能用。探索性测试、用户体验测试、边界场景发现还是得靠人。自动化的价值是把人从重复劳动里解放出来去做人更擅长的事。误解二自动化用例越多越好。不是。维护一百个不稳定用例不如维护十个稳定用例。用例数量不是KPI稳定性和覆盖关键路径才是。我见过团队为了凑数写了几百个用例结果每天花两小时修用例最后整个自动化被废弃。误解三工具越新越好。新工具通常意味着社区小、文档少、坑多。选工具要看成熟度不是看发布时间。一个用了三年、社区活跃的工具比一个刚发布三个月、star数很高的工具更值得投入。误解四自动化是一次性投入。自动化是持续投入。业务在变用例要跟着变环境在变配置要跟着变。没有一劳永逸的自动化只有持续维护的自动化。接受这一点才能把自动化做长久。7. 我在实际项目里沉淀下来的几条经验最后分享几条我个人在多个项目里验证过的经验不一定对所有人适用但至少能帮你少走点弯路。第一条先手动跑三遍再写自动化。一个流程你手动都跑不顺写自动化一定翻车。手动跑三遍把每一步的输入输出、等待条件、异常情况都记下来再翻译成自动化代码成功率会高很多。第二条用例命名要能当文档看。test_login_success_with_valid_credentials比test_001有用得多。失败时看用例名就知道在测什么不用点进去看代码。第三条失败信息要包含足够上下文。AssertionError: expected 200 but got 500不如AssertionError: 登录接口返回500请求参数: {username: test, password: ***}响应体: {...}。多写几个字排查时省几十分钟。第四条定期清理失效用例。业务下线了对应用例要删掉。留着不仅占资源还会在报告里制造噪音让人忽略真正重要的失败。第五条自动化流程要有人负责。没人负责的自动化三个月后一定烂掉。指定一个owner定期看报告、修失败、优化慢用例。这个角色不需要全职但必须有人。这十条工具、四层架构、五个翻车点、五条经验基本覆盖了从选型到落地的完整路径。工具会变流程会变但可试用、可重复、可维护这三个原则不会变。抓住这三个原则具体用什么工具反而是次要的。

相关新闻

从RAG到Agent:联网搜索与工具调用式搜索的工程实践

从RAG到Agent:联网搜索与工具调用式搜索的工程实践

1. 从搜索框到 Agent 的演进逻辑 1.1 为什么传统搜索框模式走到了瓶颈 做过 Chatbot 的人都有一个共同体会:用户问“今天有什么值得关注的科技新闻”,如果机器人只能从训练数据里翻答案,那它给出的内容大概率是几个月前的旧闻。这就是纯生成…

2026/10/8 21:10:42 阅读更多 →
多模态情感分析大作业实战:从Jupyter到可复现模型全流程

多模态情感分析大作业实战:从Jupyter到可复现模型全流程

简介:本资源为基于Jupyter与Python实现的多模态情感分析模型完整项目包,面向计算机、人工智能、自动化等专业的学生与教师,可用于期末课程设计、课程大作业或毕业设计,也适合希望入门多模态学习的开发者参考。压缩包共约2000个文件…

2026/10/8 21:10:41 阅读更多 →
基于机器学习的Web日志异常检测工具:配置、实战与避坑指南

基于机器学习的Web日志异常检测工具:配置、实战与避坑指南

简介:这是一套面向安全运维与日志分析学习者的命令行Web日志审计工具,基于Python实现,将日志统计、终端可视化与机器学习恶意请求识别整合在一起,适合具备Python基础、希望上手日志审计与异常检测实战的开发者。资源包共63个文件&…

2026/10/8 21:10:41 阅读更多 →

最新新闻

iris.c的VAE编解码实现解析:32通道潜空间与16倍压缩如何让扩散模型提速

iris.c的VAE编解码实现解析:32通道潜空间与16倍压缩如何让扩散模型提速

iris.c的VAE编解码实现解析:32通道潜空间与16倍压缩如何让扩散模型提速 【免费下载链接】iris.c Flux 2 image generation model pure C inference 项目地址: https://gitcode.com/gh_mirrors/fl/iris.c iris.c 是一个纯 C 实现 Flux 2 图像生成模型的推理管…

2026/10/8 21:47:45 阅读更多 →
text-to-cad实战:用自然语言生成可编辑CAD模型的AI辅助设计

text-to-cad实战:用自然语言生成可编辑CAD模型的AI辅助设计

1. 这个方向为什么突然火了先说结论:text-to-cad解决的核心问题,是“把脑海里的三维结构,直接变成可编辑、可制造的CAD模型”。不管是给你自己做个手机支架,还是给公司设计一个非标零件,以前都得老老实实打开SolidWork…

2026/10/8 21:47:44 阅读更多 →
从提示词到岗位专家:Skills如何重塑大模型能力边界与实战指南

从提示词到岗位专家:Skills如何重塑大模型能力边界与实战指南

最近社区里“skills”这个词出现频率高得离谱,从“前端开发skills”到“安卓脱壳skills”,再到各类“agent skills测试”“skills下载平台”,几乎每隔几天就能看到新的热词冒出来。我自己的第一反应是:这不就是给大模型塞一堆提示…

2026/10/8 21:47:42 阅读更多 →
Oracle 19c 单机到单机 Active Data Guard 搭建与巡检操作手册

Oracle 19c 单机到单机 Active Data Guard 搭建与巡检操作手册

1. 适用场景本文适用于 Oracle 19c 单实例数据库搭建单实例 Physical Standby / Active Data Guard 场景。环境前提:项目主库备库Oracle版本19.25.0.0.019.25.0.0.0架构单实例单实例部署方式OracleShellInstallOracleShellInstall当前状态Oracle 数据库已完整部署并…

2026/10/8 21:47:40 阅读更多 →
openrig:开源模块化模拟器座舱DIY搭建全攻略

openrig:开源模块化模拟器座舱DIY搭建全攻略

1. 项目全景:openrig 到底在解决什么问题先说结论:openrig 是一个面向模拟器玩家的开放模块化座舱方案。简单点说,它就是一套你可以自己攒出来的赛车或飞行模拟支架,所有设计图纸、切割尺寸、零件清单都开源,你想怎么改…

2026/10/8 21:47:29 阅读更多 →
ponytail插件与技能模块化:轻量聚合设计思路与实操指南

ponytail插件与技能模块化:轻量聚合设计思路与实操指南

1. 从“ponytail”这个标题说起:它到底是什么 第一次看到“ponytail”这个词,很多人脑子里蹦出来的画面是扎在脑后的那束马尾辫。但在技术圈和工具圈里,这个词最近被赋予了完全不同的含义——它指的是一类以“轻量、聚合、收束”为核心思路的…

2026/10/8 21:46:20 阅读更多 →

日新闻

抖音用户主页视频数据爬虫详解:点赞、收藏、分享字段抓取与 TaoToken 统一 Key 配置

抖音用户主页视频数据爬虫详解:点赞、收藏、分享字段抓取与 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/8 0:00:03 阅读更多 →
AI 编程 Trae 国内版与国际版一篇讲透:TaoToken 统一 Key 接入实测

AI 编程 Trae 国内版与国际版一篇讲透: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/8 0:00:06 阅读更多 →
Claude Desktop 配置第三方推理接口教程:用 TaoToken 统一 Key 打通 API 调用

Claude Desktop 配置第三方推理接口教程:用 TaoToken 统一 Key 打通 API 调用

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

2026/10/8 0:00:07 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →