当前位置: 首页 > news >正文

Playwright MCP复用Chrome登录态:AI自动化测试与RPA新范式

1. 项目概述:当AI助手能“接管”你的浏览器

最近在自动化测试和AI智能体圈子里,一个消息炸开了锅:Playwright MCP 现在可以直接复用你电脑上Chrome浏览器的原生登录状态了。这意味着什么?简单来说,你不再需要费劲心思地去写登录脚本、处理验证码、管理Cookie了。你只需要像平时一样,用Chrome登录你的微博、GitHub、电商后台,然后告诉你的AI助手(比如Claude Code、Cursor的AI Agent),让它去帮你完成一系列操作——查看新消息、下载报表、整理订单——AI就能在你已经登录的浏览器窗口里直接干活。

这听起来有点像科幻电影里的场景,但技术已经实现了。核心在于一个名为Model Context Protocol的协议,它正在成为连接AI模型与现实世界工具的“万能插头”。而Playwright,这个微软开源的浏览器自动化利器,通过实现MCP Server,让自己变成了AI的“手”和“眼睛”。这次“史诗级升级”的关键,是官方推出的一个Chrome扩展,它架起了一座桥,让MCP Server能够通过Chrome DevTools Protocol直接与你正在使用的、保持登录态的浏览器实例对话。

对于做自动化测试、RPA(机器人流程自动化)或者数据处理的开发者来说,这几乎是革命性的。以前,我们为了维持一个网站的登录态,得研究登录接口、模拟表单提交、处理动态Token、维护Cookie池,一套流程下来复杂且脆弱。现在,你只需要“授权”一下,AI就能在你熟悉的浏览器环境里直接操作,所有登录信息、本地存储、甚至浏览器插件状态都原封不动。这不仅仅是效率的提升,更是思维范式的转变:自动化从“模拟用户”进化到了“成为用户”。

2. 核心原理深度拆解:MCP协议与CDP连接的化学反应

要理解这次升级为何被称为“史诗级”,我们需要拆解其背后的两大核心技术:MCP协议和CDP连接。它们共同作用,实现了从“模拟”到“接管”的质变。

2.1 MCP:AI模型的“手眼”扩展协议

MCP,全称Model Context Protocol,你可以把它理解为AI模型的“外设驱动协议”。在MCP出现之前,大型语言模型就像一个知识渊博但被困在房间里的学者,它知道很多事情,但无法直接操作电脑上的软件、读取特定文件或查询实时数据库。MCP定义了一套标准,让任何工具(如文件系统、数据库、浏览器)都能以“Server”的形式暴露出一系列“工具”给AI模型调用。

它的工作流程是这样的:

  1. 工具端作为MCP Server启动:比如Playwright MCP,它会启动一个后台服务,声明自己具备“打开网页”、“点击元素”、“获取文本”等一系列工具能力。
  2. AI客户端连接MCP Server:你的AI应用(如Claude Desktop、Cursor)配置并连接上这个Server。
  3. AI模型调用工具:当你向AI提出“帮我看看GitHub上有没有新的Issue”时,AI模型会分析你的意图,决定调用Playwright MCP Server提供的“导航到URL”和“获取页面内容”等工具。
  4. 执行与返回:MCP Server执行操作,并将结果(如网页HTML或操作成功状态)通过协议返回给AI模型,AI再组织语言回复你。

这个过程的关键在于标准化安全性。MCP协议规定了工具如何被描述、如何被调用、数据如何传输,使得AI可以无缝接入无数种工具。而Playwright实现MCP,就等于为AI装上了一双可以精准操控浏览器的手。

2.2 CDP连接:通往“活”浏览器的秘密通道

传统的Playwright脚本启动浏览器时,是创建一个全新的、干净的浏览器实例。这个实例和你日常使用的Chrome是隔离的,没有你的历史记录、没有你的插件、当然也没有你的登录Cookie。

这次升级的核心魔法在于Chrome DevTools Protocol。CDP是Chrome浏览器暴露给开发者的一套调试协议,你可以通过它实时检查DOM、监控网络请求、执行JavaScript,甚至远程控制浏览器。Playwright底层也是基于CDP与浏览器通信的。

“复用Chrome登录态”功能的本质,就是Playwright MCP Server不再自己启动一个新浏览器,而是通过CDP去连接一个已经存在并在运行的、你登录了账号的Chrome浏览器实例。那个官方Chrome扩展,就扮演了“CDP连接中介”的角色。安装后,扩展会允许本地MCP Server通过WebSocket连接到你的浏览器Tab页。

技术路径对比:

  • 传统方式(状态持久化)脚本登录 -> 保存Cookie/LocalStorage到文件 -> 新浏览器实例启动 -> 加载文件恢复状态。问题:可能失效(Cookie过期),无法处理复杂的OAuth流程或动态安全令牌,且浏览器环境是“干净的”。
  • 新方式(CDP连接)用户手动在Chrome登录 -> 安装扩展 -> MCP Server通过扩展建立的CDP连接,直接附着到已登录的浏览器Tab。优势:状态是“活的”、实时的,包含所有插件上下文,完全模拟真实用户会话。

注意:这里存在一个关键的安全确认环节。当AI试图通过MCP控制你的浏览器时,Chrome扩展会弹出一个授权提示,明确告知用户“Playwright MCP希望控制此浏览器”,必须由用户手动点击“允许”。这确保了控制权始终在用户手中,避免了恶意脚本的静默控制。

2.3 扩展的工作原理:权限桥梁与上下文隔离

那个需要手动安装的Chrome扩展,其代码核心是建立一个WebSocket服务器,监听来自本地localhost的MCP Server连接请求。同时,它通过Chrome Extensions API申请了相当高的权限,例如<all_urls>的权限以便能注入脚本到任何页面,以及debugger权限以便启用CDP。

当连接建立后,MCP Server发送的CDP命令(如Page.navigate,Input.dispatchMouseEvent)通过扩展中转,最终在浏览器的渲染进程中执行。而浏览器将执行结果(如页面加载完成事件、元素截图数据)通过原路返回。

一个精妙的设计点是上下文隔离。虽然MCP控制了你的浏览器,但它通常是在一个单独的、新建的Tab页中操作,或者在一个固定的“自动化”窗口中。这在一定程度上与你正在主动浏览的页面进行了隔离,避免误操作关闭你正在看的文档。不过,由于共享同一个浏览器进程,理论上它有能力操作任何窗口,因此“授权”这一步至关重要。

3. 完整配置与实操指南

理解了原理,我们来一步步实现它。整个过程可以分为三个部分:安装浏览器扩展、配置MCP Server、在AI客户端中使用。我将以目前比较流行的Claude Desktop和Cursor为例进行说明。

3.1 环境准备与扩展安装

首先,确保你的系统已经安装了Node.js(版本16以上)和Chrome或基于Chromium的浏览器(如Edge)。

第一步:下载Playwright MCP Chrome扩展

  1. 访问Playwright MCP的GitHub发布页面:https://github.com/microsoft/playwright-mcp/releases
  2. 找到最新的发布版本,在“Assets”部分下载名为playwright-mcp-extension.zip的文件(具体名称可能随版本变化,但会包含extension字样)。
  3. 将zip文件解压到一个你记得住的固定目录,例如~/Desktop/playwright-mcp-extension解压后的文件夹路径很重要,后续加载需要。

第二步:将扩展加载到Chrome

  1. 打开Chrome浏览器,在地址栏输入chrome://extensions/并回车。
  2. 打开页面右上角的“开发者模式”开关。
  3. 点击左上角的“加载已解压的扩展程序”按钮。
  4. 在弹出的文件选择器中,导航并选中你刚才解压得到的文件夹(例如~/Desktop/playwright-mcp-extension),然后点击“选择”。
  5. 加载成功后,你会在扩展列表里看到“Playwright MCP Extension”。它的图标可能不明显,这没关系。

实操心得:很多人在这一步出错,是因为选择了zip文件本身或者解压后文件夹内的某个子文件夹。一定要选择包含manifest.json文件的根目录文件夹。加载成功后,建议固定该扩展图标到工具栏,方便后续管理。

3.2 配置MCP Server

MCP Server需要在一个命令行环境中运行。Playwright官方提供了@playwright/mcp这个npm包来快速启动Server。

全局安装并启动Server(方法一):

# 使用npm全局安装 npm install -g @playwright/mcp # 启动MCP Server,并启用扩展连接模式 npx @playwright/mcp --extension

运行后,它会提示“Waiting for browser connection...”,这意味着Server已在运行,等待浏览器扩展连接。

作为项目依赖启动(方法二,推荐):对于需要集成到具体项目中的场景,更推荐本地安装。

# 在你的项目目录下 npm init -y npm install @playwright/mcp # 在package.json中添加一个启动脚本 { "scripts": { "mcp:serve": "playwright-mcp --extension" } } # 运行 npm run mcp:serve

关键参数解析:

  • --extension: 这是本次功能的灵魂参数。加上它,Server才会尝试通过本地WebSocket连接浏览器扩展,而不是启动独立浏览器。
  • --port: 可以指定Server监听的端口,默认通常是某个可用端口。
  • --verbose: 输出更详细的日志,调试时非常有用。

启动后,打开Chrome,你应该能看到之前安装的扩展图标处有变化(比如一个小红点),表示它已检测到本地Server并准备就绪。

3.3 在AI客户端中集成

不同的AI客户端配置MCP Server的方式略有不同,但核心都是修改其配置文件,指向我们刚刚启动的Server。

3.3.1 配置Claude DesktopClaude Desktop的配置文件通常位于:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json
  • Linux:~/.config/Claude/claude_desktop_config.json

编辑这个JSON文件,在mcpServers部分添加Playwright配置:

{ "mcpServers": { "playwright": { "command": "npx", "args": [ "@playwright/mcp@latest", "--extension" ], "env": { // 可选的环境变量,例如设置超时 "PLAYWRIGHT_BROWSER_TIMEOUT": "30000" } } } }

保存文件并完全重启Claude Desktop。重启后,Claude就具备了操作浏览器的能力。

3.3.2 配置Cursor或其它支持MCP的编辑器Cursor的配置更灵活,可以在项目根目录创建.cursor/mcp.json文件进行项目级配置,也可以在全局设置中配置。 创建.cursor/mcp.json

{ "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest", "--extension"], "cwd": "." // 指定命令运行的工作目录 } } }

配置完成后,在Cursor的聊天框中,你就可以直接向AI发出指令了。

3.4 首次使用与授权流程

一切配置就绪后,让我们进行第一次实战。

  1. 启动:确保你的Chrome浏览器是打开的,并且你已经登录了某个网站(比如知乎)。确保MCP Server正在运行(命令行窗口未关闭)。
  2. 发出指令:在Claude或Cursor中,输入指令:“请用Playwright打开知乎,并查看我的通知列表。”
  3. 等待连接:AI会解析指令,调用Playwright MCP工具。此时,你的Chrome浏览器可能会自动新建一个Tab页,或者弹出一个授权窗口。
  4. 关键授权你一定会看到一个浏览器内的弹窗,询问是否允许Playwright MCP控制此浏览器。你必须手动点击“允许”或“授权”。这是核心安全屏障。
  5. 执行观察:授权后,你会看到浏览器开始自动操作:导航到知乎,页面加载完成后,可能自动滚动、点击“消息”图标。所有操作都发生在你已登录的会话中。
  6. 获取结果:AI会读取页面内容,分析DOM,然后将“通知列表”中的信息总结成文字回复给你。

注意事项:第一次连接或长时间未操作后重新连接,都可能需要重新授权。授权是针对“本次MCP Server会话”的,关闭Server后再启动,通常需要重新点击授权。确保你的浏览器没有屏蔽弹窗,否则可能看不到授权提示导致连接失败。

4. 核心应用场景与实战脚本解析

这个能力解锁了哪些以前难以实现或非常繁琐的场景?我们来看几个具体的例子。

4.1 场景一:日常信息聚合与摘要

痛点:每天需要登录多个平台(GitHub、Jira、公司内网、行业资讯站)查看状态,重复且耗时。AI自动化方案: 你可以给AI一个这样的指令:“每天早上9点,帮我检查一下GitHub上我负责的Repo有没有新的PR需要Review,Jira上有没有分配给我的高优先级Ticket,然后汇总成一个简短的工作简报发给我。”

背后的技术实现

  1. AI调用Playwright导航至github.com。由于浏览器已登录,直接进入已登录状态。
  2. 通过选择器定位“Pull requests”标签,点击。然后可能使用page.locator(‘[data-filter=“review-requested”]’)来筛选出需要你Review的PR。
  3. 使用page.locator(‘.js-issue-row’).all()获取所有PR元素,再通过.innerText()提取标题、作者等信息。
  4. 同理操作Jira。AI需要理解网站结构,可能通过点击“Filters” -> “Assigned to me”,再按优先级排序。
  5. 最后,AI将收集到的信息组织成一段清晰的Markdown格式简报。

脚本逻辑片段(AI内部调用MCP工具的逻辑模拟):

// 这不是用户写的代码,是AI在背后可能组合执行的MCP工具调用序列 const tools = mcpServer.getTools(); // 工具1: 导航 await tools.navigate({ url: ‘https://github.com‘ }); // 工具2: 等待元素出现(确保页面加载) await tools.waitForSelector({ selector: ‘header’ }); // 工具3: 点击‘Pull requests’链接 await tools.click({ selector: ‘a[href=“/pulls”]‘ }); // 工具4: 获取页面文本内容进行分析 const pageContent = await tools.getContent(); // AI分析pageContent,决定下一步点击哪个筛选器...

4.2 场景二:复杂工作流的数据抓取与录入

痛点:需要从A网站(如公开数据平台)抓取一些数据,经过简单清洗后,录入到B网站(如内部CRM系统)。传统方式需要写两个爬虫和一套模拟登录。AI自动化方案: 指令:“去这个公开招标网站列表页,把最近一周‘软件开发’类别的标书标题、链接和截止日期抓取下来,整理成Excel,然后登录我们的内部项目管理系统,在‘潜在商机’模块里为每一条创建一个新卡片。”

技术挑战与解决

  1. 动态加载:招标网站可能是无限滚动或分页。AI需要执行滚动操作 (tools.scroll),或识别并点击“下一页”按钮。
  2. 数据提取:需要从结构化的HTML中通过CSS选择器精准定位标题、链接等元素。AI可以借助Playwright的evaluate工具注入JavaScript,直接在浏览器环境中执行复杂的DOM查询和数据处理。
  3. 格式转换:AI可以将抓取的数据在内存中构造成数组对象,然后调用另一个MCP Server(比如处理文件的filesystemServer)生成CSV文件。
  4. 跨系统操作:导航至内部系统,由于复用登录态,直接进入。AI需要理解“潜在商机”模块的UI,找到“新建”按钮,并在弹出的表单中填充抓取到的字段。这里可能涉及iframe、富文本编辑器等复杂控件,Playwright的强大选择器和输入API可以应对。

实操心得:对于这类多步骤复杂任务,建议采用“分步指令”或“链式思考”。先让AI完成第一步(抓取数据)并展示给你看,确认无误后,再指令它进行第二步(录入系统)。避免一次性发出过于复杂的指令导致AI动作混乱。你可以说:“第一步,先抓取招标网站第一页的数据给我看看。” 确认后再说:“很好,现在请把所有页面的数据都抓取下来,然后进行第二步...”。

4.3 场景三:自动化测试与巡检

痛点:作为开发者,每次发布前端新版本后,需要手动走查核心业务流程(登录、下单、支付),枯燥且容易遗漏。AI自动化方案: 指令:“对我正在开发的前端应用(localhost:3000)做一次核心用户流程巡检:用测试账号登录,浏览商品列表,将第一个商品加入购物车,进入购物车结算,确认订单信息(不要真正支付)。每一步都截图,并检查页面有没有明显的JavaScript错误(检查控制台)。”

进阶能力展示

  1. 本地开发环境:直接操作localhost,无需部署。
  2. 自动登录:测试账号密码可以预先保存在环境变量或一个简单的配置文件中,AI通过MCP读取后填充到登录表单。
  3. 断言与检查:Playwright MCP工具集可能包含“断言”类工具,或者AI可以通过获取页面文本和截图进行视觉和逻辑判断。检查JS错误则需要调用CDP的LogRuntime域接口,这要求MCP Server暴露了相应工具。
  4. 生成报告:AI可以将每一步的截图、检查结果、可能的错误信息汇总成一份测试报告。

这个场景将AI从“脚本执行者”提升为“测试分析员”。它不仅能执行固定步骤,还能根据页面反馈做出简单判断(比如“加入购物车成功”的提示框是否出现),并记录异常。

5. 高级技巧、安全边界与性能优化

掌握了基本操作,我们来看看如何用得更好、更稳、更安全。

5.1 提升AI指令的精准度

AI的表现很大程度上取决于你如何下达指令。模糊的指令会导致低效或错误的操作。

  • 使用明确的选择器提示:虽然AI能自己分析DOM,但你可以帮它更快更准。例如,不要说“点击登录按钮”,而说“点击页面上id为‘submit-login’或者class包含‘login-btn’的按钮”。你可以事先用浏览器的开发者工具查看元素属性。
  • 分阶段确认:对于关键操作(如提交表单、删除数据),可以指令AI“在点击提交按钮前,先高亮该按钮并等待我的确认”。虽然目前MCP工具可能没有直接的“高亮并等待”功能,但你可以通过分步指令实现:“第一步,滚动到提交按钮附近并截图给我看。第二步,在我回复‘确认’后,再点击它。”
  • 提供上下文和示例:如果操作的是一个AI不熟悉的内部系统,可以先带它“走”一遍。你可以手动操作一遍,同时告诉AI:“记住,我们系统的订单查询结果在div.results-table这个容器里,每一行用tr.data-row表示。”

5.2 安全与隐私的绝对红线

能力越强,责任越大。复用登录态意味着AI拥有和你手动操作完全相同的权限。

  1. 授权可控:每次MCP Server启动后初次连接浏览器,都必须经过你的手动授权。不要安装来源不明的扩展,也不要授权给不信任的MCP Server。
  2. 会话隔离建议:为自动化任务专门创建一个浏览器用户配置文件(Chrome的“多用户”功能)。在这个配置文件里登录相关工作账号,然后只允许MCP连接这个配置文件。这样可以将自动化活动与你的个人浏览(银行、社交账号)完全隔离。
  3. 最小权限原则:在给AI下指令时,遵循最小权限原则。例如,如果只是需要读取公开信息,就不要让它进入包含敏感信息的后台管理系统。
  4. 法律与道德合规这是不可逾越的底线。该技术绝不能用于:
    • 绕过网站反爬虫机制,进行大规模数据盗取。
    • 模拟用户进行刷单、刷量、恶意投票等行为。
    • 在未经授权的情况下访问他人账户或非公开信息。
    • 对目标网站进行过频的请求,造成服务器压力。

技术是中立的,但使用技术的人必须为其后果负责。请务必遵守目标网站的robots.txt协议和服务条款。

5.3 稳定性与性能优化

  • 网络等待与超时设置:在指令中明确网络条件。例如,“等待页面完全加载,直到网络空闲(networkidle)”,这比简单的固定等待几秒更可靠。可以在启动MCP Server时通过环境变量设置全局超时:PLAYWRIGHT_NAVIGATION_TIMEOUT=60000
  • 处理动态内容与SPA:对于单页应用(如React、Vue构建),页面内容动态变化。指令AI“等待某个特定元素出现”比“等待3秒”更稳定。例如:“点击搜索按钮后,请等待class为‘search-results’的div元素出现后再继续。”
  • 错误处理与重试:AI执行长链条任务时,某一步网络波动可能导致失败。目前的AI可能不具备自动重试的复杂逻辑。因此,对于重要任务,建议将其拆分为多个可独立重试的短任务,或者由你在关键节点进行人工检查。
  • 资源清理:长时间运行后,浏览器可能会积累大量缓存和标签页。可以定期指令AI关闭不再需要的标签页,或者在任务结束时指令它执行一个清理操作。更好的做法是定期重启浏览器和MCP Server会话。

6. 常见问题与故障排查实录

在实际操作中,你肯定会遇到各种问题。这里记录了一些典型问题和解决方法。

6.1 连接类问题

问题:MCP Server启动后,AI客户端提示“无法连接到Playwright服务器”或一直超时。

  • 检查Server是否运行:首先确认你运行npx @playwright/mcp --extension的终端窗口没有报错,并且显示“Waiting for browser connection...”。
  • 检查端口冲突:尝试指定另一个端口启动:npx @playwright/mcp --extension --port=8081,并在AI客户端配置中同步修改连接地址(如果配置支持指定端口)。
  • 检查防火墙/安全软件:确保本地回环地址(127.0.0.1localhost)的指定端口没有被防火墙或安全软件阻止。

问题:浏览器扩展已安装,但MCP Server日志显示无法连接浏览器。

  • 确认浏览器进程存在:确保Chrome或Edge浏览器正在运行。
  • 检查扩展是否启用:前往chrome://extensions/,确认“Playwright MCP Extension”是启用状态(开关为蓝色)。
  • 重新加载扩展:在扩展管理页面,点击该扩展下的“刷新”图标或关闭再打开开关。
  • 查看扩展后台页:Chrome扩展通常有后台页面。可以尝试在地址栏输入chrome://extensions/?id=<扩展ID>查看是否有错误日志。获取扩展ID可以在扩展管理页面开启“开发者模式”后看到。

6.2 授权与执行类问题

问题:执行指令时,没有弹出授权提示,AI报错说需要授权。

  • 浏览器弹窗被拦截:检查浏览器地址栏右侧是否有被拦截的弹窗图标,点击并允许该站点的弹窗。最好将localhost添加到浏览器的弹窗允许列表。
  • 扩展权限不足:极少数情况下,扩展可能因为权限问题无法创建授权弹窗。尝试移除扩展,重新下载最新版并加载。
  • 在正确的浏览器实例中操作:如果你有多个Chrome用户配置文件,确保MCP Server连接的是你安装扩展的那个配置文件。最稳妥的方式是关闭所有Chrome窗口,然后只打开用于自动化的那个用户配置文件。

问题:AI执行点击或输入操作失败,提示“元素未找到”或“操作超时”。

  • 页面加载状态:AI可能动作太快,在元素出现前就尝试操作。在关键操作前加入等待指令,如“请等待页面加载完成”。
  • 选择器问题:页面的DOM结构可能动态变化,AI推断的选择器可能不准。提供更稳定、更唯一的选择器提示,如使用>
http://www.jsqmd.com/news/1123808/

相关文章:

  • Gemma 2深度实测:开源小模型中文实战选型指南
  • 网工笔记20260702
  • 架构评审数据化:别让评审会只剩观点碰撞
  • NVIDIA Profile Inspector:解锁显卡隐藏性能,让你的游戏体验飞起来
  • 华硕笔记本轻量级控制中心:释放硬件潜力的终极解决方案
  • 自己写一个《英雄无敌3》战斗AI
  • 免费分享最新IDEA安装及授权教程(附带文件)
  • 在Web应用中嵌入专业数学公式编辑:MathLive的技术实践
  • 49. OrCAD封装库中应该怎么删除Pin Group属性?I Cadence Allegro 电子设计 快问快答
  • 【私房菜集 HarmonyOS ArkTS 实战系列 01】从 0 到 1:单机菜谱应用的工程骨架
  • ORIN NX 16G + ubuntu22.04 环境安装及模型部署
  • 终极指南:40+经典DSGE模型库如何加速你的宏观经济研究
  • FigmaCN:5分钟快速汉化Figma界面,中文设计师的完整解决方案
  • Nutstore Sync 和 WebDAV 有什么区别?Obsidian 坚果云同步新旧方案完整对比
  • 角谷猜想的弗洛伊德算法的同构映射:数论映射图论 Version6.6
  • HoRain云--Java Applet
  • 独立开发实战:学生管理+考试防作弊机制设计
  • laserMapping.cpp 中的 sync_packages() 详细讲解
  • 如何永久保存微信聊天记录:简单三步实现数据自主管理终极指南
  • 掌握专业级Windows Defender控制:高效系统安全防护管理实战指南
  • 彻底掌控你的Windows“此电脑“:MyComputerManager让顽固图标消失无踪
  • 深耕低代码5年,终于遇见打破行业桎梏的AI原生平台
  • 不受待见的钻石又火了?新娘不要英伟达为啥抢着要?
  • Obsidian插件汉化终极指南:3种模式快速实现英文插件中文化
  • GTA5终极修改器YimMenu:10分钟快速上手指南
  • 50. 怎么给OrCAD封装库添加新的属性?I Cadence Allegro 电子设计 快问快答
  • Shell的基础知识和常用命令
  • OpenClaw:AI智能体开发的高效跨平台解决方案
  • CUE: Concept-Aware Multi-Label Expansion to Mitigate Concept Confusion in Long-Tailed Learning
  • PIC32与25CSM04 SPI EEPROM高速数据检索实现