ChromeDriver下载安装与自动化管理全攻略
1. 从“驱动”说起为什么你需要ChromeDriver如果你正在用Python的Selenium库写自动化脚本或者用其他语言做浏览器自动化测试大概率会遇到一个报错“This version of ChromeDriver only supports Chrome version xxx”。这个瞬间就是你与ChromeDriver打交道的开始。它不是一个独立的浏览器也不是一个普通的软件而是连接你的自动化代码和谷歌Chrome浏览器的“桥梁”或“翻译官”。简单来说ChromeDriver是一个独立的服务程序。你的代码比如Selenium通过WebDriver协议向ChromeDriver发送指令比如“打开百度”、“点击搜索框”、“输入关键词”。ChromeDriver接收这些指令并将其翻译成Chrome浏览器能理解的操作驱动真实的Chrome浏览器去执行。执行完毕后ChromeDriver再将结果比如页面元素的状态、截图数据翻译回WebDriver协议返回给你的代码。没有它你的自动化脚本就像没有司机的汽车无法操控浏览器。很多人第一次接触时最容易混淆的概念就是版本匹配。Chrome浏览器更新频繁ChromeDriver也必须随之更新两者的大版本号必须严格一致或高度兼容。例如你的Chrome是125.0.6422.113那么你就需要寻找版本号为125.x.x.x的ChromeDriver。版本不匹配是绝大多数“无法启动浏览器”错误的根源。因此掌握如何快速、准确地获取与安装正确版本的ChromeDriver是自动化测试和爬虫开发中的一项基础且关键的技能。2. 官方源与镜像站如何找到正确的下载地址获取ChromeDriver首推官方渠道因为它能保证文件的完整性和安全性并且版本更新最及时。然而对于国内开发者来说直接访问Google的服务器可能会遇到网络缓慢甚至无法连接的问题。因此了解官方地址和可靠的镜像站同样重要。2.1 官方下载主站Chromium项目页ChromeDriver的官方发布地址是托管在Google Chromium项目下的。其基础URL结构相对固定但直接记住一个“官网”链接可能不准确因为Google有时会调整页面结构。最可靠的方式是通过搜索“ChromeDriver”进入其官方项目页面。通常官方下载页会列出所有历史版本和最新版本。页面设计非常简洁主要就是一个版本列表表格。你需要找到与你的Chrome浏览器大版本号匹配的ChromeDriver版本。例如列表里会显示“ChromeDriver 125.0.6422.91”、“ChromeDriver 124.0.6367.91”等。点击对应版本会进入该版本的详情页里面提供了针对不同操作系统Windows、macOS、Linux的压缩包下载链接。一个关键细节官方下载的压缩包对于Windows系统是chromedriver_win32.zip注意是win32但这并不意味着它只支持32位系统。实际上这个包在64位Windows系统上同样可以完美运行这是一个历史命名习惯不必纠结。2.2 应对网络问题的备选方案国内镜像与托管站由于网络原因直接从官方源下载可能速度极慢或失败。这时可以考虑以下备选方案淘宝NPM镜像这是一个非常知名的国内镜像源。它镜像了包括ChromeDriver在内的许多常用二进制文件。你可以通过构造特定的URL来下载。例如对于某个特定版本其下载链接模式可能是https://npm.taobao.org/mirrors/chromedriver/。这个源更新速度较快通常是国内开发者的首选替代方案。华为云镜像华为云也提供了开源镜像服务其中包含Chromium相关资源。其地址类似于https://mirrors.huaweicloud.com/chromedriver/。稳定性通常很好。GitHub Releases虽然官方发布不在GitHub上但有一些开源项目或个人会及时地将最新版的ChromeDriver上传到GitHub Releases方便下载。你可以搜索“chromedriver mirror”或“chromedriver releases”来寻找。但需要注意文件来源的安全性。注意使用任何非官方镜像时务必从可信的、知名的渠道获取。对于安全要求极高的生产环境建议尽可能通过官方渠道下载或在下载后校验文件的哈希值如果官方提供了的话。2.3 确定你的Chrome浏览器版本在下载之前你必须知道本地Chrome的确切版本号。方法很简单打开Chrome浏览器。点击右上角的三个点菜单 - “帮助” - “关于Google Chrome”。弹出的页面会直接显示版本号例如“版本 125.0.6422.113正式版本 64 位”。记住开头的“125”这个大版本号。3. 手动下载与安装的详细步骤手动部署是最基础、最可控的方式适合所有场景尤其是需要定制化路径或对环境有严格管理要求的情况。3.1 Windows系统下的部署流程在Windows上安装的本质就是将chromedriver.exe这个可执行文件放到一个位置并让系统或你的Python环境能找到它。步骤一下载与解压根据你的Chrome版本从官方或镜像站下载对应的chromedriver_win32.zip文件。将ZIP文件解压你会得到一个名为chromedriver.exe的单独文件。步骤二放置与配置三种常用方法这是核心步骤有三种主流方案各有优劣方案A放入Python脚本目录最简单临时使用将chromedriver.exe直接复制到你的Python项目文件夹里。然后在代码中初始化WebDriver时指定这个路径from selenium import webdriver driver webdriver.Chrome(executable_path./chromedriver.exe) # 相对路径优点无需修改系统环境项目自包含拷贝到其他机器时驱动一起走。缺点每个项目都要放一份如果浏览器升级了每个项目的驱动都要单独更新。方案B放入Python安装目录的Scripts文件夹推荐个人开发找到你的Python安装路径下的Scripts文件夹例如C:\Users\YourName\AppData\Local\Programs\Python\Python39\Scripts。将chromedriver.exe复制进去。 因为Scripts文件夹通常已经被添加到系统的PATH环境变量中如果你在安装Python时勾选了“Add Python to PATH”所以现在你可以在命令行任何位置直接运行chromedriver命令。在代码中也可以简化from selenium import webdriver driver webdriver.Chrome() # 无需指定路径Selenium会自动在PATH中查找优点一劳永逸所有项目共用同一个驱动代码简洁。缺点当Chrome升级后你需要手动替换这个文件。方案C添加到系统PATH环境变量最通用你可以将chromedriver.exe放在任何一个你喜欢的固定位置比如D:\Tools\WebDriver。然后把这个目录路径添加到系统的PATH环境变量中。右键点击“此电脑” - “属性” - “高级系统设置” - “环境变量”。在“系统变量”或“用户变量”中找到Path变量点击“编辑”。点击“新建”将你的驱动存放目录路径如D:\Tools\WebDriver添加进去。一路点击“确定”保存。 完成此操作后无论是在命令行还是Python代码中都可以像方案B一样直接使用webdriver.Chrome()而不指定路径。优点位置自由管理清晰可以被任何语言Java, C#等的Selenium绑定调用。缺点配置稍显复杂同样需要手动更新。3.2 macOS与Linux系统下的部署在macOS和Linux上流程类似但文件格式和放置位置有区别。macOS:下载chromedriver_mac64.zip对于Apple Silicon芯片是mac_arm64。解压得到chromedriver文件无后缀。打开终端将其移动到/usr/local/bin目录这是一个常见的可执行文件存放目录已在PATH中sudo mv ~/Downloads/chromedriver /usr/local/bin/由于macOS的安全机制Gatekeeper首次运行时可能会提示“无法打开因为来自不受信任的开发者”。你需要前往“系统偏好设置”-“安全性与隐私”-“通用”点击“仍要打开”。或者直接在终端先执行一次sudo xattr -d com.apple.quarantine /usr/local/bin/chromedriverLinux:下载对应架构的版本如chromedriver_linux64.zip。解压得到chromedriver文件。将其移动到系统PATH包含的目录例如/usr/local/binsudo mv chromedriver /usr/local/bin/可能需要赋予执行权限sudo chmod x /usr/local/bin/chromedriver3.4 验证安装是否成功完成放置和PATH配置后打开命令行Windows的CMD/PowerShellmacOS/Linux的Terminal输入以下命令chromedriver --version如果正确输出版本信息如ChromeDriver 125.0.6422.91 (...)则说明安装和PATH配置成功。此时你的Python Selenium代码使用webdriver.Chrome()应该就能正常启动浏览器了。4. 自动化管理方案告别手动更新的烦恼手动管理驱动版本在长期项目中会成为一个维护负担。以下两种自动化方案可以极大地提升效率。4.1 使用Python的webdriver-manager库这是目前Python生态中最主流、最推荐的自动化方案。webdriver-manager库可以自动检测你本地已安装的浏览器版本并下载匹配的驱动无需你关心下载地址和路径。安装pip install webdriver-manager使用from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service # 自动下载、缓存并返回驱动路径 service Service(ChromeDriverManager().install()) driver webdriver.Chrome(serviceservice)第一次运行时它会下载对应的驱动并缓存到用户目录下如~/.wdm。下次再运行如果检测到版本匹配就会直接使用缓存的驱动无需重复下载。当你的Chrome浏览器升级后再次运行脚本它会自动检测到版本变化并下载新的驱动。优点完全自动化开发者无需关心版本号和下载。跨平台Windows、macOS、Linux都支持。缓存机制避免重复下载节省时间。注意事项需要网络连接以下载驱动。在严格的内网环境或网络受限的服务器上可能无法使用。确保你的pip源或网络能正常访问驱动文件的下载地址它默认会尝试多个源包括官方和镜像。4.2 使用Node.js的chromedriverNPM包如果你主要使用Node.js进行Web自动化例如使用selenium-webdriver或puppeteer的配套驱动可以通过NPM来管理。安装作为项目依赖npm install chromedriver --save-dev或者全局安装npm install -g chromedriver在代码中使用const {Builder} require(selenium-webdriver); const chrome require(selenium-webdriver/chrome); const chromedriver require(chromedriver); // 引入包 // 将chromedriver路径添加到Chrome服务的启动参数中 let service new chrome.ServiceBuilder(chromedriver.path).build(); let driver await new Builder().forBrowser(chrome).setChromeService(service).build();NPM包会在安装时根据你的操作系统自动获取合适的ChromeDriver版本通常是最新的稳定版。你也可以通过指定版本号来安装特定版本npm install chromedriver125.0.0。优点与Node.js项目集成度好版本管理通过package.json控制。缺点仅限于Node.js生态。5. 进阶场景与疑难排错即使正确安装了驱动在实际项目中仍可能遇到各种问题。下面是一些常见进阶场景和解决方案。5.1 多版本Chrome共存环境下的驱动管理有些开发者的机器上可能同时安装了Chrome稳定版(Stable)、测试版(Beta)和开发版(Dev)。webdriver-manager默认会检测并使用默认的Chrome稳定版。如果你想指定使用某个特定版本的Chrome可以这样做手动指定浏览器路径from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() options.binary_location rC:\Path\To\Your\Specific\Chrome\Application\chrome.exe # 指定Chrome可执行文件路径 driver webdriver.Chrome(optionsoptions)此时你需要手动确保chromedriver的版本与你指定的这个Chrome版本匹配。webdriver-manager在这种情况下可能无法自动匹配需要你手动管理驱动版本。使用webdriver-manager指定版本你也可以强制webdriver-manager安装特定版本的驱动但这要求你已知浏览器版本。from webdriver_manager.chrome import ChromeDriverManager ChromeDriverManager(version125.0.6422.91).install()5.2 常见错误与解决方案错误session not created: This version of ChromeDriver only supports Chrome version XX原因驱动与浏览器版本不匹配。解决这是最经典的错误。检查Chrome版本下载或更新对应版本的ChromeDriver。使用webdriver-manager可以自动解决。错误‘chromedriver’ executable needs to be in PATH原因系统找不到chromedriver可执行文件。解决确认chromedriver文件已放在某个目录下。确认该目录已添加到系统的PATH环境变量中。或者在代码中通过executable_path参数指定绝对路径。错误executable may have wrong permissions(Linux/macOS)原因驱动文件没有执行权限。解决在终端中进入驱动文件所在目录执行chmod x chromedriver。错误浏览器闪退或无法启动原因可能性较多。解决检查版本匹配再次确认。关闭所有Chrome进程在任务管理器Windows或活动监视器macOS中结束所有chrome.exe或Google Chrome进程特别是那些后台运行的。尝试无头模式在代码中启用无头模式看是否是GUI相关的问题。options Options() options.add_argument(--headless) # 启用无头模式 driver webdriver.Chrome(optionsoptions)查看详细日志在初始化WebDriver时启用日志可能会输出更具体的错误信息。from selenium.webdriver.chrome.service import Service service Service(log_path./chromedriver.log) # 指定日志文件 driver webdriver.Chrome(serviceservice)5.3 在无图形界面的服务器Headless Server上运行在Linux服务器上做自动化测试或爬虫通常没有图形界面。你需要确保以下几点安装Chrome浏览器服务器上也需要安装Chrome或Chromium。可以通过包管理器安装例如在Ubuntu上sudo apt update sudo apt install -y chromium-browser安装ChromeDriver同样通过上述方法手动或webdriver-manager安装对应版本的驱动。使用无头模式在代码中必须添加无头模式参数。可能需要的额外参数在服务器环境下有时需要禁用沙箱和/dev/shm使用限制。from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) options.add_argument(--no-sandbox) # 绕过OS安全模型在容器中常需要 options.add_argument(--disable-dev-shm-usage) # 解决共享内存问题 options.add_argument(--disable-gpu) # 早期无头模式需要现在可选 driver webdriver.Chrome(optionsoptions)5.4 驱动进程的管理与清理一个常见的隐患是ChromeDriver进程没有随着脚本结束而关闭。如果脚本异常退出可能会导致chromedriver.exe进程残留在后台占用端口导致下次运行时报“地址已在使用”的错误。好的实践是在代码中始终使用try...finally或上下文管理器来确保驱动退出from selenium import webdriver driver webdriver.Chrome() try: # 你的自动化操作代码 driver.get(https://www.baidu.com) # ... finally: driver.quit() # 使用 quit() 而不是 close()quit()会关闭所有窗口并终止驱动进程如果已经发生了端口占用可以在命令行中查找并杀死进程Windows: 打开任务管理器找到chromedriver.exe进程并结束它。或在CMD中使用taskkill /f /im chromedriver.exe。macOS/Linux: 在终端中使用ps aux | grep chromedriver找到进程ID然后用kill -9 进程ID结束它。6. 版本策略与长期维护建议对于团队项目或长期维护的自动化工程制定清晰的ChromeDriver管理策略至关重要。1. 锁定版本策略在项目的开始阶段记录下当时使用的Chrome浏览器稳定版本号例如Chrome 125和对应的ChromeDriver版本。将对应版本的chromedriver二进制文件放入项目仓库的tools/drivers/目录下并在代码中显式指定该路径。这样无论团队成员本地的Chrome如何升级项目始终使用一个已知稳定的驱动版本保证了环境的一致性。缺点是当浏览器有重大安全更新或你需要使用新浏览器特性时需要手动升级项目内的驱动。2. 自动管理策略使用webdriver-manager等工具并确保CI/CD流水线如Jenkins、GitHub Actions和所有开发、测试机器都能访问互联网以下载驱动。在项目文档中明确说明使用此工具这样新成员搭建环境时只需pip install即可无需手动操作。这是目前最推荐用于新项目的策略它能最大程度减少维护成本。3. 容器化策略使用Docker将你的自动化测试环境容器化。在Dockerfile中固定Chrome和ChromeDriver的版本进行安装。例如FROM python:3.9-slim RUN apt-get update apt-get install -y wget unzip chromium RUN wget -q -O /tmp/chromedriver.zip https://storage.googleapis.com/chromedriver/125.0.6422.91/chromedriver_linux64.zip \ unzip /tmp/chromedriver.zip -d /usr/local/bin/ \ chmod x /usr/local/bin/chromedriver这样整个运行环境包括浏览器和驱动都被封装在镜像中在任何地方运行都完全一致彻底解决了环境差异问题。我个人在实际项目中的体会是对于中小型项目或快速原型直接使用webdriver-manager是最省心的选择。而对于大型、长期的企业级自动化测试套件我会倾向于容器化方案因为它提供了最高的可重现性和环境隔离性虽然前期搭建稍复杂但后期维护和扩展的优势非常明显。无论哪种策略清晰的项目文档和团队共识都是避免“在我机器上是好的”这类问题的关键。

相关新闻

动态最优传输并行计算:Certified Parallel-in-Time Sinkhorn算法原理与实践

动态最优传输并行计算:Certified Parallel-in-Time Sinkhorn算法原理与实践

1. 先搞清楚“并行时间Sinkhorn”到底解决了什么计算难题如果你在处理动态最优传输问题时,被海量时间步下的高维计算成本卡住,那么这个“Certified Parallel-in-Time Sinkhorn”方法值得你花时间研究。它不是一个全新的理论,而是针对动态熵正…

2026/10/17 3:19:42 阅读更多 →
揭秘乐度网上购物网站建设方案如何从零起步打造高转化率电商平台的实战经验分享

揭秘乐度网上购物网站建设方案如何从零起步打造高转化率电商平台的实战经验分享

说实话,最近接到好几个朋友的咨询,问起做电商这件事,大家都显得很焦虑,但焦虑的背后其实是渴望。他们问我,现在这个时间点,入局晚不晚?我的回答从来都很直接:只要产品好,只要运营对,什么时候都不晚。但是,第一步,也是最关键的一步,就是你的网站,或者说你的那个“…

2026/10/17 7:41:09 阅读更多 →
从入学到毕业:高校学工管理系统功能解析

从入学到毕业:高校学工管理系统功能解析

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/10/16 11:37:46 阅读更多 →

最新新闻

【信息科学与工程学】【通信工程】第二百四十四篇 通信网络中的流量类型01

【信息科学与工程学】【通信工程】第二百四十四篇 通信网络中的流量类型01

行业分类统一参照 GB/T 4754-2017(门类+大类2位+中类3位+小类4位);TC3 并非全局唯一定义,需在每行中按场景注明其具体含义(RDMA QoS / 运营商流量等级 / 设备厂商 TC 映射均可能不同)。 编号 类型 行业大类(GB/T 4754) 行业中类 行业小类 智算中心/企业网/数据中心…

2026/10/18 7:33:04 阅读更多 →
LangChain异步化实战:ainvoke/astream与asyncio提升服务吞吐量的关键细节

LangChain异步化实战:ainvoke/astream与asyncio提升服务吞吐量的关键细节

第一次把一个 LangChain 链塞进异步服务里时,我的第一反应是:把 invoke 换成 ainvoke,把 stream 换成 astream,不就完事了吗?实测下来,事情确实就这么简单,但所有坑也都藏在“只改方法名”的背后…

2026/10/18 7:33:04 阅读更多 →
ArtCraft是什么?解析多领域中的艺术与技术融合实践

ArtCraft是什么?解析多领域中的艺术与技术融合实践

我理解您的要求,但需要坦诚说明:当前输入内容中,项目标题“artcraft”未提供任何有效上下文——既无项目正文描述、无关键词列表、无摘要描述,也未给出任何可识别的领域指向(如是AI绘画工具、手工DIY平台、3D建模插件、…

2026/10/18 7:33:04 阅读更多 →
UGUI中Polygon Collider 2D的非物理点击判定与坐标映射

UGUI中Polygon Collider 2D的非物理点击判定与坐标映射

1. 为什么UGUI里硬塞Polygon Collider 2D是个“反直觉操作”刚看到这个标题时,我下意识皱了下眉——不是因为难,而是因为太违和。Unity的UGUI系统从设计之初就走的是“矩形优先”路线:Canvas是分层渲染的矩形画布,Image、Text、Bu…

2026/10/18 7:33:04 阅读更多 →
思维链CoT:仅靠提示词激活大模型推理能力的里程碑论文

思维链CoT:仅靠提示词激活大模型推理能力的里程碑论文

做AI应用的人,大概都经历过这种画面:模型能把论文摘要写得比不少研究生还像样,你让它算“小明有5个苹果,小红又给了他2袋,每袋3个苹果,问小明现在有几个苹果”,它一本正经地输出一个错的答案。这…

2026/10/18 7:33:04 阅读更多 →
AI智能体赋能Cypress E2E测试:四种落地路径与高效工作流

AI智能体赋能Cypress E2E测试:四种落地路径与高效工作流

在自动化测试这个领域摸爬滚打几年,我越来越清楚一件事:前端E2E测试的瓶颈,从来不在“能不能驱动浏览器”,而在于“用例有没有人写、坏了有没有人修”。Cypress已经把驱动浏览器这件事做得非常舒服了,断言自动重试、网…

2026/10/18 7:32:04 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →