告别Browser already in use:Playwright MCP 多实例的正确打开方式

业界良新

如果要问我哪个MCP使用最频繁,Playwright MCP一定榜上有名。但是在使用过程中,经常会遇到一个让人头疼的问题——多实例并发时的各种报错。本文将深入分析问题根源,并给出一劳永逸的解决方案。



一、Playwright MCP为什么这么香?


Playwright MCP将Playwright浏览器引擎包装成可被外部调用的服务,让AI Agent、IDE、自动化平台能够统一调用浏览器进行各种操作:


•页面导航:自动打开网页、跳转链接


•交互操作:点击按钮、填写表单、上传文件


•数据采集:截图、提取内容、监控变化


•自动化测试:端到端测试、回归测试


相比传统的Selenium或Puppeteer硬编码方式,MCP的优势非常明显:


1.多客户端连接:多人、多脚本可以共享浏览器实例


2.灵活并发:适合分布式任务、CI/CD并行测试


3.低门槛高复用:配置一次,到处使用


我平时用Claude Code开发完新功能或修复Bug后,都会调用Playwright MCP进行全面的端到端测试,提前发现潜在问题。为此还专门创建了SKILL来指导AI如何测试、如何发现问题。



二、那些让人崩溃的报错


正因为使用频繁,加上经常需要多任务并发,问题也随之暴露——特别是当开发者不注意隔离时,以下报错你一定不陌生:


1."Browser already in use"错误


这是最常见的报错:


Error:Browser is already in use for...
use--isolated to run multiple instances of the same browser


更离谱的是,有时在一个 全新环境 (新容器、新机器)中首次执行,就立刻失败——根本不存在"之前打开的浏览器实例"。


问题的本质是: Playwright MCP默认把所有实例都指向同一个浏览器缓存目录 。当MCP启动时会尝试"锁定"这个目录,如果另一个实例也试图启动,就触发冲突,报错退出。


有时候你会陷入这样的死循环:反复打开新窗口→失败→再打开→再失败……无论删缓存、重启VS Code、杀进程,错误依旧。


2.不断开新窗口的异常行为


即使没有报"already in use"错误,MCP在多次调用时,有时会:


•不断打开新页面、新Tab、新窗口


•旧的页面没有被正确关闭


•浏览器资源泄漏,性能急剧下降


•最终内存耗尽或句柄用完


这在做自动化测试、批量爬取、大规模操作时尤其明显。


3.Headless模式无响应


有时表现为headless模式启动后"什么都没发生"——脚本显示运行成功,但实际上浏览器根本没动作。这种"运行成功↔实际没起作用"的不一致,让调试变得极其痛苦。



三、问题根源:共享Profile的锁机制


要理解这些问题,得先懂Playwright启动浏览器的机制:


当Playwright(或通过MCP)启动浏览器时,默认会创建一个 用户数据目录(user-data-dir) ,用来存储:


•Cookies和Session


•LocalStorage数据


•浏览器扩展


•缓存文件


关键问题在于 :MCP默认使用一个 统一的共享数据目录


这意味着所有通过MCP启动的浏览器实例,都会尝试读写同一个目录。在并发或多实例调用时:


•锁冲突:多个进程争抢同一个profile→"already in use"


•状态污染:Cookie、Session被覆盖→行为异常


•资源泄漏:窗口没有正确关闭→内存耗尽


一句话总结:问题的根本是"共享profile+并发调用"的冲突。



四、终极解决方案:--isolated参数


基于上述分析,最稳健、简洁、一劳永逸的方式是:


1.用户级配置:将Playwright MCP配置为全局(user-scope),而不是每个项目单独配置


2.启用隔离模式:添加--isolated参数,让每次启动都使用独立的profile



本内容来源于网络 原文链接,观点仅代表作者本人,不代表虎嗅立场。如涉及版权问题请联系 hezuo@huxiu.com,我们将及时核实并处理。