浏览器自动化工具横评

11 min read,created at 2026-07-28
浏览器自动化chromeplaywrightpuppeteerego browserbrowser use

浏览器自动化工具横评

主要对比以下工具的功能差异,和用途用法介绍。

  • chrome devtools mcp
  • playwright
  • ego lite
  • browser use
  • codex chrome插件/内置浏览器

首先从原理上来讲,这些工具都基于CDP (chrome debug protocol)提供的接口,实现了对浏览器的控制,所以核心能力上不会有太大的区别。

CDP就是chrome最高权限debug权限,右键检查打开的就是devtools的面板,在这里你可以执行任意脚本、修改css、查看网络、查看cookie、模拟设备网络等等。这是人能访问的途径,而CDP代码访问的渠道主要有3种,分别是

进程管道chrome插件远程调试(老)远程调试(新)
交互协议管道自行设计,如codex使用的native messageHttp+WebsocketWebsocket
复用自己profile不可不可
典型代表playwright, chromemcp, codex内置浏览器等codex chrome插件,playwright chrome插件chromemcpchromemcp,browser use
headed
headless一般不可
警告提示有横幅提示每次需手动确认,且有横幅提示

ego lite这种比较特殊,他是基于chromium内核自己写的浏览器,协议是自己的原生定义的事件消息,缺点是要更换浏览器,且目前没有windows。

chrome devtools mcp

这是chrome官方推出的mcp工具,简称chromemcp吧,他支持进程管道远程调试两种方式启动,自动化调试用进程管道方式这也是默认的配置方式,而如果要复用自己当前的profile,可以使用远程调试方式。

配置方式:

# 最简单配置,进程管道 + 有头
npx -y chrome-devtools-mcp

# 进程管道 + 无头
npx -y chrome-devtools-mcp --headless

# 远程调试 老 有头 (需要先用remote模型启动进程)
npx -y chrome-devtools-mcp --browser-url=http://127.0.0.1:9222

# 远程调试 新(自动连接9222,需要你打开这个配置,否则方法报错) 有头
npx -y chrome-devtools-mcp --autoConnect

另外一些常见的会开启的feature flag

npx -y chrome-devtools-mcp \
    --experimentalVision # 开启视觉检测,开启后可以调用click_at方法

这里说一下为什么新老版本的都是9222端口,这是本质上就只有老版本,他是将进程通信的调试能力通过9222端口开放,以便于远程调试,而这个协议下需要先访问/json/version的http接口,来获取websocket的调试地址。

image

这里介绍下新老版本的前置配置方式,老版本需要用chrome启动一个新的进程,带上如下启动指令remote-debugging-port

& 'C:\Program Files\Google\Chrome\Application\chrome.exe' `
  --remote-debugging-port=9223 `
  --user-data-dir="$env:TEMP\chrome-debug-profile"

然后mcp中配置npx -y chrome-devtools-mcp --browser-url=http://127.0.0.1:9223即可连到这个浏览器上了,这里额外说一下老版本的远程连接的方式和进程管道的方式,在各方面能力和限制是一样的,而进程管道还不占用端口,所以旧版的远程方式的使用场景较少,主要是真的部署了远程托管的浏览器这种场景会用到,进程管道要更实用一些。

而新版本其实主要是允许浏览器启动的时候,不添加remote-debugging-port的启动指令,在设置页面中手动开启,并且新版本手动开启后,并不提供/json/version的endpoint,而是chromemcp通过--autoConnect参数,自己去发现chrome进程,进而找到对应的ws端口和browserid,自己拼出来上图中的websocket url,后续还是走的原来的标准cdp调用的协议交互规范。

新版本的最核心的作用就是不用在启动的时候指定参数,进而使得我们自己用户的profile打开的浏览器也可以在chrome://inspect#remote-debugging中远程调试,这样chromemcp就可以使用用户当前的浏览器进行操作,这应该是新版本远程调试协议的最大用途。

接下来我们来介绍,mcp中的工具列表和功能(chromemcp的返回结构都是纯文本的,可能觉得json太冗余):

类别工具用途
页面list_pages列出可操作页面 (自增数字id + title + url + [selected])
select_page选择页面(用的是上面的自增id,click等操作都是针对选中标签的)
new_page / close_page新开、关闭标签
navigate_page打开 URL、前进后退、刷新
resize_page改页面尺寸
handle_dialog接受/取消 alertconfirmprompt
get_tab_id取得 Chrome 原生 tab id (插件中一般用这个id)
截图take_screenshotviewport 或完整页面截图;可存入 MCP roots 允许的路径
take_snapshot返回可访问性树及稳定 uid (形式:uid=1_3 button "Pages")可根据text确认功能,然后用uid触发click等
DOM/等待wait_for等文字出现或等待指定时间
输入click按 snapshot 的 uid 点击元素
hover悬停指定元素
fill清空后填写单个输入框
type_text在焦点元素输入文字
drag按两个元素的 uid 拖拽
fill_form一次填写多个表单字段
upload_file给文件输入框上传 workspace 内文件
press_key按键或组合键,如 CTRL+AENTER
JavaScriptevaluate_script在页面执行 JavaScript 函数,返回值必须 JSON 可序列化
Consolelist_console_messages获取本次导航以来的 console 日志,可过滤类型、分页
get_console_message按日志 id 获取完整消息
Networklist_network_requests列网络请求,支持过滤和分页
get_network_request查看某请求的完整 headers、body、响应等
性能performance_start_trace开始录制 trace
performance_stop_trace停止并分析 trace,返回性能洞察
performance_analyze_insight查看某一条性能洞察的详细证据和建议
Lighthouselighthouse_audit运行 Lighthouse,返回性能、可访问性、SEO 等审计结果
模拟emulate设备/视口、DPR、UA、地理位置、网络及主题等模拟

feature flags开启的功能:

开关新增工具用途与限制
--experimentalVisionclick_at用 CSS viewport 坐标点击。截图像素与 DPR 不一致时要换算,正是你之前遇到的缩放偏差来源。
--memoryDebuggingtake_heapsnapshot 及 10 个分析工具堆快照摘要、详情、类实例、引用边、retainers、保留路径、dominator、重复字符串、两份快照 diff、关闭已加载快照。用于查内存泄漏。
--experimentalScreencastscreencast_start / screencast_stop录制页面操作视频;需要 ffmpeg 在 MCP 的 PATH,或传 --experimentalFfmpegPath
--categoryExperimentalThirdPartylist_3p_developer_tools / execute_3p_developer_tool调用被测页面通过 window.__dtmcp 暴露的第三方开发者工具。页面自己必须实现它。
--categoryExperimentalWebmcplist_webmcp_tools / execute_webmcp_tool调用页面暴露的 WebMCP 工具;Chrome 149+ 并要带 WebMCP,DevToolsWebMCPSupport feature flags。
--categoryExtensionslist_extensionsinstall_extensionuninstall_extensionreload_extensiontrigger_extension_action管理/调试扩展。1.6.0 的说明中该能力要求 MCP 自己用 pipe 启动 Chrome,不能与 --autoConnect--browser-url--wsEndpoint 合用。

例如一套基本的操作流程,通常会包括:

  • new page url 打开测试的页面
  • wait_for 等待页面完成
  • take_snapshot 获取元素文本和uid
  • fillclick+press_key uid 输入表单
  • click uid 点击提交按钮

对于有些复杂一点的页面,比如按钮上没有明显的提交字样,而是画了个svg,这种snapshot得到的信息就很难推断出这个按钮是提交的作用,这种只能用兜底方案take_screenshot截图,然后大模型识图,找到提交的按钮的坐标,通过click_at进行点击。当然这需要--experimentalVision开启。

此外要说一点的是,截图这个功能在有头模式下,有系统缩放的坑,例如你是windows,你的屏幕分辨率太高,所以你开了缩放125%,那么这个截图大小如果是1250x1250的窗口,那么实际窗口其实是1000x1000css scale大小。

image

这会导致,如果右下角有一个按钮,大模型识图之后给你点击的位置是1240,1240,但是实际是按照css取的坐标来触发点击的,1240已经在页面之外了,页面最多就到1000,而这个坑,在无头模式下是没有问题的,无头的截图就是1000x1000,只有有头模式会有问题。那如何避免呢?前面介绍了emulate这个函数,他可以传viewPort参数,来重设当前page的viewport,参数是1000x1000x1这个形式,最后的x1是设备缩放比例,通过这个参数可以把比例调回1,然后再截图,得到的就是1000x1000的了。

playwright