UI Recorder 实战:基于录制回放的低门槛Web自动化测试方案

1. 项目概述:UI Recorder 到底解决了什么问题

做Web端测试的同学应该都有过这种经历:手工测试点来点去,一天下来眼睛花了、手腕酸了,回归用例还有一大堆没跑完。想上自动化,又绕不开那套学习曲线陡峭的框架——写定位器、处理等待、维护用例,光是环境搭建就能劝退一半的人。

UI Recorder 的出现,本质上就是把"自动化测试"的门槛从"会写代码"降到了"会点浏览器"。它的核心思路非常简单直接:你在浏览器里的每一次操作,它都帮你记录下来,自动翻译成测试脚本。脚本不是那种只能自己看的临时品,而是结构清晰、可以直接交给团队维护的正式代码。我第一次看到生成的用例时,第一反应是:这比我手写的整洁多了。

它的解决方案一句话总结:用录制的低成本换取脚本的可维护性,再用脚本的可复用性抵消录制带来的脆弱性。适合谁?刚接触自动化的新人,想快速给项目补上回归测试的团队,以及对脚本维护成本敏感的技术负责人。不需要太深的编程基础,但如果你懂一点JavaScript,后面玩断言、玩数据驱动的时候会顺手很多。

从我实际使用的体感来说,UI Recorder 最打动我的不是"录制"本身,而是它生成的代码质量。很多录制工具的问题是"能跑但没法看",代码冗余一堆,UI Recorder 在这一点的处理上明显用了心。它生成的脚本结构合理,变量命名清楚,注释也到位,新人和老人接手都不难受。

2. 核心设计思路拆解:为什么录制回放这条路能走通

2.1 录制回放和手写脚本的差别在哪

传统自动化测试为什么要学起来痛苦?因为你要同时掌握三件事:定位器语法(比如 XPath 和 CSS)、等待策略、测试框架本身的API。对于一个只负责功能验收的测试人员来说,这三座大山没一座好翻。

UI Recorder 的思路是:把"我懂技术"这个问题先放到一边,让工具替你做技术活。它通过浏览器插件或者远程调试协议去监听你的操作,鼠标点击、键盘输入、页面跳转、滚动、甚至文件上传,全部捕获,然后自动映射成对应的Selenium或者WebDriver API调用。

但这里有个关键点:录制不是"录完就完事"。你录制的是一次操作路径,但这个路径要能稳定回放,靠的是脚本里的定位策略和等待机制。UI Recorder 在这部分的处理方式,是尽量给每个操作元素生成稳定的定位表达式,配合内置的智能等待,把最容易翻车的两个环节提前做了兜底。

2.2 和市面上的录制工具横向比,区别在哪

我早期用过一些"录制回放"工具,说实话体验并不理想。有的录完没法改,UI一变化整条用例报废;有的生成的是私有格式,离开了工具就跑不了。UI Recorder 聪明的地方在于,它绑定的是 Selenium 生态,生成的脚本就是标准的 Selenium 脚本,你完全可以脱离录制器,用原生方式去改、去跑、去集成到测试平台里。

打个比方,有些录制工具给你的是一张地图,但地图是加密的,必须用它的浏览器才能看。UI Recorder 给你的是一张普通地图,你用任何一辆车都能按着地图跑。这种"不绑架用户"的设计,其实是很高的产品理念。

另外它的多浏览器支持也不错。Chrome 肯定是亲儿子,Firefox 也能跑,还有 Electron 应用也能测。对于现在很多前端项目用 Electron 打包桌面应用的团队来说,这一个点就足够了。

3. 环境准备与安装:从零开始搭建可用的录制环境

3.1 需要准备哪些基础工具

动手之前,先把基础环境捋清楚。UI Recorder 本身是 Node.js 生态里的工具,所以 Node 环境是第一步。建议直接装 Node 的 LTS 版本,不要追新,稳定压倒一切。装完之后,npm 就跟着一起有了。

第二个是 Chrome 浏览器。虽然 Firefox 也能用,但我在实际项目里绝大部分场景都是 Chrome,因为 Chrome DevTools 协议的兼容性最好,录制和回放的稳定性都比 Firefox 高一个档次。Electron 应用的话,需要额外处理一下启动参数,后面细说。

第三个是 Java 环境。这个很多新手会在意为什么录个脚本还要装 Java?因为 Selenium Server 是用 Java 写的,UI Recorder 的回放引擎需要依赖它启动浏览器。装上 JDK 8 以上的版本就行,不用太纠结版本,我用的是 JDK 11,跑得很稳。

3.2 一步步装好环境

安装步骤不复杂,但每一步都有坑,我踩过,所以帮你标出来。

第一步,安装 Node.js。到官网下载安装包,一路下一步,没什么好说的。装完验证一下:

node -v npm -v

能看到版本号就说明这一步过了。如果提示"node 不是内部或外部命令",那是环境变量没配好,Windows 用户去系统设置里把 Node 的安装目录加到 PATH 里。

第二步,初始化项目目录。建议不要一股脑装在全局,给每个项目单独建一个目录,依赖隔离,后面维护不头疼。

mkdir uirecorder-demo cd uirecorder-demo npm init -y

第三步,安装 UI Recorder 和相关依赖。

npm install uirecorder mocha -g npm install uirecorder

这里有个细节,我建议-g全局装一份,让uirecorder命令可以直接在终端里调用,同时在项目本地也装一份,保证回放时的依赖版本一致。

第四步,安装 Selenium Standalone。UI Recorder 有内置的安装命令:

uirecorder --install

这个命令会自动下载 Selenium Server 和对应版本的浏览器驱动。注意要保证网络通畅,它需要从仓库拉文件。下载过程可能有点慢,耐心等就好。

装完检查一下:

uirecorder --version

能显示版本号就说明核心环境已经通了。

3.3 一个容易忽略的细节:Chrome 和驱动的版本匹配

这里专门提醒一下,Chrome 的版本和驱动版本必须匹配,否则回放的时候浏览器起不来,或者启动起来就报错。UI Recorder 的--install命令会自动处理这个匹配,但如果你的 Chrome 后来升级了,驱动没跟上,就会出问题。

我遇到过一次,Chrome 自动更新之后,回放脚本时浏览器闪退,控制台报ChromeDriver only supports Chrome version XX。查了半天,最后删掉驱动重新执行uirecorder --install解决的。

提示:如果你所在团队统一管控浏览器版本,建议固定 Chrome 的自动更新策略,否则每隔一阵子就要重新匹配一次驱动。

4. 核心实操:录出第一条可维护的测试用例

4.1 从启动录制器开始

环境就绪后,我们就可以正式开始录。在项目目录下执行:

uirecorder --start

它会启动一个录制配置页面,让你填写一些基础选项,包括项目名称、是否覆盖本次录制等。填完确认后,会自动拉起一个 Chrome 窗口,这个窗口就是你的"录制现场"。你在里面做的每一次操作,都会被记录下来。

这里有一个新手最容易疑惑的点:那个配置页面的"项目名称"到底有什么作用?它实际上是用来组织测试用例文件的,比如你在页面上填了 "user_login" ,那么录制完生成的测试文件就会归到和登录相关的用例组里。命名的时候建议带上模块名,比如module_login、module_register,方便后面按模块跑测试。

启动录制后你会看到 Chrome 窗口右上角有一个录制面板,记录着当前录制的操作数。这时候先不要急着乱点,心里过一遍你的测试场景,比如:"输入账号、输入密码、点击登录、断言页面跳转"。操作顺序越接近真实用户,脚本的可读性越高。

4.2 录制操作时的注意事项

之前提到,UI Recorder 会为每个操作元素生成定位表达式,但如果我们录制的时候不小心,录出来的定位器可能不够稳定。根据我的经验,下面几条很关键:

第一,给元素加上稳定标识再录。如果被测系统是你们自己团队的,最好给关键表单元素加上id或者>uirecorder --run

它会读取配置,启动浏览器,把录制的操作按顺序重放一遍。第一次回放如果有失败,大多数情况就是定位或者等待问题。UI Recorder 会输出详细的执行日志,哪一步失败了,失败原因是什么,一目了然。

别急着烦躁,这是最正常的环节。我在第一次回放时遇到的典型问题:页面上有个弹窗动画,实际弹窗延迟了 1 秒,回放时断言执行太早,结果失败。这种问题通过给用例加step延时或者调整等待策略就能解决。UI Recorder 支持在录制时主动插入延时步骤:右键加上"等待元素出现"的操作,效果比固定 sleep 高到不知道哪里去了。

这个点要特别强调一下:固定 sleep 是最笨的等待方式。我们在实际编写脚本时,尽量使用"条件等待"——等某个元素出现、等某段文字变化、等某个按钮可点击。UI Recorder 内置的智能等待能覆盖大部分场景,个别特殊场景可以手动插入waitFor类型的步骤。

5. 进阶玩法:把用例做得更符合工程化要求

5.1 参数化:一条用例跑多组数据

录制脚本的优势是入门快,但如果你想做数据驱动,直接改生成的代码比重新录制要高效得多。UI Recorder 生成的脚本是标准 JavaScript,所以参数化处理完全自由。

举个例子,登录用例假如录制时用的是账号 "testuser",现在想用 "user1"、"user2"、"user3" 分别跑一遍,直接把用例体里的input那行的值抽出来变成变量即可,加一层循环或者用 Mocha 的动态生成用例方式,都可以实现数据驱动。

有一点要注意:改了代码之后,最好先单条跑一遍,再放量跑。因为录制时的操作顺序可能对特定数据有依赖,比如账号 "user1" 注册过、账号 "user2" 没注册过,场景预期就不一样了。参数化之前,把数据的分支逻辑想清楚。

5.2 多浏览器并行:从单浏览器到矩阵测试

UI Recorder 本身支持多浏览器的配置,可以同时跑 Chrome 和 Firefox 的用例矩阵。这在做跨浏览器兼容性回归的时候特别有用,比手工去一个个浏览器点一遍靠谱多了。

配置上,在项目配置文件里把desktop那段的browserName列表里加上chrome和firefox就行。跑起来之后,它会给每个浏览器单独拉起一个会话。要注意的是,并行跑测试时本机的 CPU 和内存占用会明显上升,如果你的机器配置一般,建议要么减少并行数,要么直接上 CI 分布式执行。

并行执行最常见的坑是资源竞争。比如两条用例同时在同一个测试环境里操作,A 用例删除了某条数据,B 用例恰好在等那条数据出现,双双超时失败。这种问题不是脚本问题,是数据隔离问题。解决办法是在用例的beforeEach里做好前置数据的准备,保证每条用例都有独立的初始状态。

5.3 与 CI 集成:让用例定时无人值守地跑

如果你已经跑到这个阶段,说明你不满足于本地手动跑用例了。把 UI Recorder 的用例集成到 CI 流水线里,思路和普通 Node.js 项目的 CI 集成没什么区别。

核心命令是:

npm run test

前提是在package.json里配好脚本:

{ "scripts": { "test": "uirecorder --run" } }

CI 上跑 UI Recorder 有几个环境准备步骤,有些同学会在这一步卡住。首先是 Linux 环境下需要有显示服务。CI 机器一般没有显示器,但浏览器要渲染就必须有。解决办法是用xvfb或者 headless 模式。UI Recorder 对 headless 模式的支持不错,Chrome 的 headless 模式下照样可以录和跑。

然后是浏览器驱动的问题。CI 机器上最好也执行一次uirecorder --install,保证驱动和浏览器版本匹配。有些团队直接把驱动放到制品库统一分发,减少每次执行时的下载时长。

5.4 移动端:如果是 App 的 H5 页面怎么办

有些场景是测 App 内嵌的 H5 页面。这里的思路比较特殊:UI Recorder 录的是浏览器操作,而 App 内嵌的 WebView 本质上还是基于 WebKit 渲染的页面。实操上,一般会先在桌面浏览器里把 H5 页面的用例录好,然后在移动端的 WebView 里做兼容验证。需要注意的是,移动端 WebView 的 touch 事件和桌面 click 事件有细微差异,回放的成功率取决于页面对事件的绑定方式。

如果要真正自动化测 App 原生控件,UI Recorder 就不太适合了,它有自己清晰的边界——专注 Web UI 自动化。这个定位其实是件好事,正因为足够聚焦,它才能在 Web 领域做得很透。

6. 常见问题速查:我实际踩过的坑,都在这了

6.1 回放时找不到元素,怎么办

这是 UI Recorder 使用途中最高频的问题,没有之一。Element Not Found或者NoSuchElement的报错,90% 的原因就是:定位器写死了,但页面元素发生了变化。处理思路是分层的。

首先是定位策略的问题。生成的脚本里,定位器可能是 CSS 选择器,也可能是 XPath。如果页面结构没有变,那可以去检查一下是不是有 iframe。iframe 里的元素需要先切换进入,否则无论如何都定位不到。UI Recorder 对 iframe 的处理有时候不够自动,需要在脚本里手动加一步切入 iframe 的操作。

其次是动态元素的问题。比如列表项在刷新前后 ID 会变化,这种场景就不适合用绝对 ID 定位,而应该找一个稳定的父级容器,通过层级关系去定位。改脚本的时候,优先用语义化的 CSS 选择器,减少对 XPath 的依赖,维护性会好一些。

还有就是隐式等待和显式等待的配置。在 UI Recorder 生成的脚本里,默认已经加了智能等待机制,但如果页面加载特别慢,可以适当增大等待时间。切换等待时间的话,一般优先调单条用例的配置,不要一上来把全局配置拉满,不然失败一条用例要等十几秒才报错,排查效率更低。

6.2 回放时浏览器总是闪退

这个问题我遇到过的场景是,Chrome 自动更新之后和驱动版本不匹配。解决办法很简单:重跑uirecorder --install,让它重新下载匹配的驱动。还有一个常见诱因是系统内存不足,并行跑用例的时候特别容易出现。如果浏览器打开后直接崩溃,留意一下任务管理器里的内存占用,关掉不相关的大程序再跑。

6.3 录制时操作被漏记

有时点击某个按钮后,录制面板上的操作数没有增加。这种情况多数是因为那个按钮不是标准 HTML 元素,或者监听的鼠标事件用的是mousedown而不是click。处理办法是录制时用键盘操作代替鼠标点击,比如用Tab键聚焦按钮然后回车触发,UI Recorder 对键盘事件的捕获通常更稳定。

6.4 生成的脚本在别的电脑上跑不了

这就是典型的"在我机器上好好的"问题。差在哪里?大概率是依赖版本不一致。你在本地装上了一个版本的 chromedriver,同事机器上是另一个,就会出现环境差异。规避方法是:在项目的package.json里锁定所有依赖的版本号,用npm shrinkwrap或者直接提交 lock 文件。另外,在团队内部统一 Node 版本和 Chrome 版本,能省下很多环境排障的时间。

6.5 断言失败但页面看起来是对的

这个情况比较隐蔽。页面是对的,但断言失败,大概率是断言的目标选错了。比如你要断言用户名字段显示为"张三",但页面上有多个元素包含了"张三"文字,字段旁边有一个隐藏的<span>里也藏着"张三",可能导致选择器选中了隐藏元素。这时候把定位器写得更精确,比如限制:visible,或者用文本定位器去匹配可见元素。

7. 抛砖引玉:UI Recorder 后续怎么玩

玩顺了基本的录制回放,UI Recorder 对你来说就不是一个"玩具工具"了,而是一个能真正支撑业务回归的自动化测试底座。你可以基于它做更多延伸:比如配合代码覆盖率工具分析测试盲区,或者把脚本回归到每个发布前自动触发,甚至做成一个简易的测试平台,让非技术同事也能通过录制来补充用例。

我个人的体会是,自动化测试工具的价值不在于工具本身多强大,而在于它能不能把团队里"非技术成员"的能力上限拉高。UI Recorder 在这件事上做得很好,录制带来的低门槛、Selenium 脚本带来的生态、加上 Node.js 带来的工程化基础设施,这条链路相当顺。

最后再分享一个小技巧:在录制脚本时,请务必保证被测页面是你精心准备的、干净的初始状态。曾经我偷懒没清浏览器缓存直接开录,录完发现脚本里多了一堆无用操作,后面整整花了一个小时删冗余步骤。录制前花半分钟清一下数据、关掉无关弹窗,后面能省半天时间。

相关新闻

从回调地狱到响应式数据流:RxJava核心机制与工程落地

从回调地狱到响应式数据流:RxJava核心机制与工程落地

前段时间我重构了一个老旧的数据采集模块&#xff0c;事情不大但特别典型&#xff1a;十几路传感器、一路串口、一路网络推送&#xff0c;全都往同一个界面汇聚。重构之前代码里全是回调嵌套&#xff0c;想改一个过滤条件得顺着调用链翻半天&#xff1b;重构之后整体逻辑变成一…

2026/10/20 18:15:49 阅读更多 →
refin-bin-0.14.tar 文本后处理工具包:日志清洗与规则部署实战

refin-bin-0.14.tar 文本后处理工具包:日志清洗与规则部署实战

简介&#xff1a;rEFInd 是一款面向 UEFI 固件环境的开源启动管理器&#xff0c;常用于 Linux、macOS 与 Windows 多系统共存的引导切换&#xff0c;可展示图形化启动菜单&#xff0c;支持自定义超时、默认系统与图标&#xff0c;适合具备一定 UEFI 基础的桌面用户、双系统爱好…

2026/10/20 18:15:49 阅读更多 →
证书打不开?从ASN.1编码到openssl排查全指南

证书打不开?从ASN.1编码到openssl排查全指南

不废话&#xff0c;直接进入正题。1. 先搞清楚报错的本质&#xff1a;ASN.1与证书编码是怎么回事大多数人在“打开证书”这件事上报错&#xff0c;第一反应是“证书坏掉了”&#xff0c;第二反应是“解析工具有问题”。实际从业时间久了你会发现&#xff0c;八成以上的情况是编…

2026/10/20 18:15:49 阅读更多 →

最新新闻

MSA存储入门指南:从SAN协议到选型场景的全面解析

MSA存储入门指南:从SAN协议到选型场景的全面解析

简介&#xff1a;这份文档面向备考H3C认证工程师-MSA存储&#xff08;H3CNE-MSA&#xff09;的技术人员与H3C代理服务工程师&#xff0c;聚焦MSA存储设备基础配置与维护知识&#xff0c;帮助读者在有限时间内系统梳理考点、检验掌握程度。资源为1个docx文件&#xff0c;压缩包约…

2026/10/20 19:39:14 阅读更多 →
C语言大作业高分实践:工程结构、内存安全与评分对齐

C语言大作业高分实践:工程结构、内存安全与评分对齐

简介&#xff1a;这是一份面向高校C语言初学者与课程设计学生的高分期末大作业实战项目&#xff0c;完整实现了一个具备学生端与管理员双角色的学生成绩管理系统。资源包含可直接编译运行的C/Qt源码&#xff08;含18个.h头文件与18个.cpp实现文件&#xff09;、图形界面.ui文件…

2026/10/20 19:39:14 阅读更多 →
Redis Java客户端选型与实战:Jedis、Lettuce、Redisson对比

Redis Java客户端选型与实战:Jedis、Lettuce、Redisson对比

1. 先搞清楚需求&#xff0c;再选客户端写Java应用连Redis&#xff0c;第一步不是去翻依赖、复制代码&#xff0c;而是先想清楚&#xff1a;你的业务到底需要Redis做什么&#xff0c;以及你的应用是什么形态。这话可能听起来像废话&#xff0c;但我在实际项目里见过太多人一上来…

2026/10/20 19:39:14 阅读更多 →
轻量级AI助手ZeroClaw实战:有限算力下的部署与Agent落地

轻量级AI助手ZeroClaw实战:有限算力下的部署与Agent落地

1. 项目定位&#xff1a;为什么轻量级AI助手反而更实用去年年底我拿到一台配置平平的旧工作站&#xff0c;8GB内存、无独显、CPU还是几年前的型号&#xff0c;跑几个容器就喘。当时手头正好有个工具自动化需求&#xff1a;定时抓取内部系统数据&#xff0c;做简单清洗&#xff…

2026/10/20 19:39:14 阅读更多 →
单相桥式半控整流电路原理与Matlab/Simulink仿真建模分析

单相桥式半控整流电路原理与Matlab/Simulink仿真建模分析

单相桥式半控整流电路&#xff0c;这个名字在电力电子课程里出现的频率极高。很多电气工程专业的朋友第一次接触晶闸管整流&#xff0c;就是从它开始的。最近正好有人在问Matlab仿真的思路&#xff0c;我把自己做这个仿真报告的全过程梳理了一遍&#xff0c;从拓扑结构分析到模…

2026/10/20 19:39:14 阅读更多 →
Java动漫链接生成器:批量整理番剧资源链接的轻量工具

Java动漫链接生成器:批量整理番剧资源链接的轻量工具

简介&#xff1a;这是一款面向动漫资源采集与二次元工具开发者的轻量级命令行程序&#xff0c;基于Java实现&#xff0c;可根据指定标签批量生成动漫图片链接&#xff0c;适合需要批量获取Danbooru图源、做数据采集或练手Java命令行项目的开发者。资源包共17个文件&#xff0c;…

2026/10/20 19:38:12 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →