无头浏览器全面对比研究(实测校验版)

研究日期: 2026-05-22 系统环境: Ubuntu 22.04 (Linux 6.8.0), x86_64 实测版本: Playwright Python 1.52.0 (Chromium 136.0.7103.25), Puppeteer 23.11.1, Chrome 134.0.6998.165 校验方法: 多 Agent 并行实测 + 交叉验证


一、五大 Skill 详细介绍

本机共有 5 种无头浏览器 Skill 可用,按能力层级从低到高排列:


Skill 1: Chrome Headless CLI

定位: 零代码、一行命令的页面渲染工具

核心能力:

  • --dump-dom: 输出渲染后的完整 DOM HTML 到 stdout
  • --screenshot: 页面截图 (PNG)
  • --print-to-pdf: 页面导出 PDF
  • --virtual-time-budget: 快进异步 JS (setTimeout/setInterval 立即执行)
  • --remote-debugging-port: 暴露 CDP 协议供其他工具连接

架构: 完整 Chrome 浏览器无窗口运行,每次调用启动新进程,无状态复用。Chrome 134 中旧 headless (--headless=old) 已完全移除。

独特优势:

  • navigator.webdriver = false — 天然不被反爬检测(因为不经过 CDP 自动化协议)
  • 零依赖,系统已安装即可用
  • 无需编写代码

关键限制 (实测确认):

  • 无交互能力(不能点击、填写、导航)
  • 单次只能处理一个 URL
  • --disable-javascript 在 Chrome 134 新 headless 中完全失效
  • data: URL 中含 <script>--dump-dom 可能无输出(需用 file://
  • 无法获取 JS 执行结果、网络响应、Cookie 等

实测性能:

指标数值
启动+渲染+输出~551ms (5次平均)
内存占用~1054 MB / 14 进程
截图 (1280x720)~502ms
PDF 生成~556ms

典型用法:

# DOM 导出 (含异步 JS 等待)
google-chrome --headless --dump-dom --virtual-time-budget=5000 --timeout=10000 URL
 
# 截图
google-chrome --headless --screenshot=/tmp/page.png --window-size=1920,1080 URL
 
# PDF
google-chrome --headless --print-to-pdf=/tmp/page.pdf --no-pdf-header-footer URL
 
# Docker/CI 环境
google-chrome --headless --no-sandbox --disable-gpu --disable-dev-shm-usage \
  --screenshot=/tmp/page.png URL

Skill 2: Puppeteer (Node.js)

定位: Node.js 生态的 Chrome 自动化库,生态最丰富

核心能力:

  • 完整页面交互 (导航、点击、填写、选择、拖拽)
  • 请求拦截与修改 (setRequestInterception)
  • JS/CSS 代码覆盖率分析 (page.coverage)
  • 无障碍树快照 (page.accessibility.snapshot())
  • Chrome DevTools Trace 录制 (page.tracing)
  • 设备/地理/时区/网络模拟
  • Cookie 和 localStorage 管理
  • PDF 生成 (全选项)、截图 (页面/元素级)

架构: 直接通过 WebSocket/Pipe 与 Chrome 进程通信(CDP 协议),无中间服务进程,延迟最低。

选择器系统:

  • CSS: page.$('div.class')
  • XPath: ::-p-xpath(//div)
  • Text: ::-p-text(Submit)
  • ARIA: ::-p-aria([name="Click"][role="button"])
  • Shadow DOM: >>> (深穿透)
  • 自定义: registerCustomQueryHandler()

Headless 模式 (Chrome 134):

模式配置说明
新 Headlessheadless: true默认,完整 Chrome 无窗口
Headless Shellheadless: 'shell'轻量二进制,性能最优
Headfulheadless: false有窗口,调试用

注: Chrome 134 下 headless:trueheadless:'shell' 的 UA 完全相同。

反检测生态 (核心优势):

  • puppeteer-extra-plugin-stealth: 修补 16+ 检测特征(webdriver、plugins、WebGL、UA 等)
  • puppeteer-extra-plugin-recaptcha: 自动解验证码
  • puppeteer-extra-plugin-adblocker: 广告拦截
  • puppeteer-cluster: 并行实例管理

实测性能:

指标数值
完整周期 (launch→page→goto→close)~196ms
内存占用与 Chrome 相同 (~1054 MB)

典型用法:

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch({
        headless: true,
        executablePath: '/usr/bin/google-chrome',
        args: ['--no-sandbox', '--disable-dev-shm-usage']
    });
    const page = await browser.newPage();
    await page.goto('https://example.com');
    
    // 截图
    await page.screenshot({path: '/tmp/page.png', fullPage: true});
    
    // 请求拦截
    await page.setRequestInterception(true);
    page.on('request', req => {
        if (req.resourceType() === 'image') req.abort();
        else req.continue();
    });
    
    // JS 执行
    const title = await page.evaluate(() => document.title);
    
    await browser.close();
})();

Skill 3: Playwright (Python)

定位: 全能型浏览器自动化框架,多浏览器 + 多语言支持

核心能力:

  • 完整交互 (点击、填写、拖拽、上传、下载)
  • 自动等待 (actionability: visible + stable + enabled + receives events)
  • 网络拦截与 mock (page.route())
  • HAR 录制/回放 (内置)
  • Trace 录制与可视化回放 (DOM 快照 + 截图 + 网络)
  • 视频录制 (内置 FFmpeg)
  • PDF / 截图 / 无障碍树
  • WebSocket 路由
  • Clock API (时间控制)
  • 断言自动重试 (expect(locator).to_have_text())

架构:

Python (sync/async API)
    ↓ JSON-over-pipe (4字节小端长度前缀)
Node.js Driver (内嵌于 pip 包, 127 MB)
    ↓ CDP / 自有协议
Browser (Chromium / Firefox / WebKit)

选择器系统 (最丰富):

  • get_by_role("button", name="Submit") — ARIA 角色 (80+ roles)
  • get_by_text("Submit") — 文本
  • get_by_label("Username") — Label 关联
  • get_by_placeholder("Enter email") — Placeholder
  • get_by_test_id("submit-btn") — 可配置测试 ID
  • .filter(has_text=, has=, visible=) — 链式过滤
  • .and_() / .or_() — 布尔组合
  • Shadow DOM 默认穿透

浏览器支持:

浏览器引擎实测版本
ChromiumBlink136.0.7103.25
FirefoxGecko需安装
WebKitWebKit需安装
系统 ChromeBlink134 (via channel='chrome')

Context 隔离 (实测确认):

  • 每个 BrowserContext = 独立无痕会话
  • Cookie、localStorage、IndexedDB 完全隔离
  • storage_state 可保存/恢复登录状态

⚠️ 内置 Chromium vs 系统 Chrome 检测差异 (实测发现):

特征内置 Chromiumchannel='chrome' (系统 Chrome)
window.chromefalsetrue ✅
navigator.plugins05 ✅
navigator.webdrivertruetrue
WebGL vendor”WebKit”正常 ✅
connection.rtt0100 ✅
deviceMemoryNone有值 ✅

重要: 如需反爬,务必使用 channel='chrome' + --disable-blink-features=AutomationControlled

实测性能:

指标数值
完整周期 (playwright→launch→page→goto→close)~346ms
Context 创建~10-50ms
包体积 (Python)131 MB
浏览器二进制618 MB (Chromium full + headless shell)

典型用法:

from playwright.sync_api import sync_playwright
 
with sync_playwright() as p:
    # 使用系统 Chrome (反检测更好)
    browser = p.chromium.launch(
        headless=True,
        channel='chrome',
        args=['--disable-blink-features=AutomationControlled']
    )
    context = browser.new_context(
        viewport={'width': 1920, 'height': 1080},
        user_agent='Mozilla/5.0 ...'  # 自定义 UA
    )
    page = context.new_page()
    
    # 网络拦截
    page.route("**/*.{png,jpg}", lambda route: route.abort())
    
    # 导航 + 交互
    page.goto("https://example.com")
    page.get_by_role("button", name="Accept").click()
    page.get_by_label("Email").fill("user@example.com")
    
    # 截图 + PDF
    page.screenshot(path="/tmp/page.png", full_page=True)
    page.pdf(path="/tmp/page.pdf")
    
    # 无障碍树
    snapshot = page.locator("main").aria_snapshot()
    
    browser.close()

Skill 4: Playwright MCP Server

定位: AI Agent 专用的浏览器自动化接口,通过 MCP 协议暴露结构化工具

版本: @playwright/mcp@0.0.70 (Microsoft 官方维护)

核心设计: 使用无障碍树快照 (Accessibility Snapshot) 而非截图,LLM 读取结构化文本并通过 ref ID 精确引用元素,无需视觉模型。

工具数量 (实测验证):

配置工具数
默认 (无 —caps)21 tools
--caps=vision,pdf,devtools34 tools
--caps=vision,pdf,devtools,storage,network,testing,config61 tools
源码中总定义 (含 hidden)70 tools

工具分组详情:

始终启用 (21 tools):

工具
core (16)browser_close, browser_resize, browser_console_messages, browser_handle_dialog, browser_evaluate, browser_file_upload, browser_fill_form, browser_network_requests, browser_run_code, browser_take_screenshot, browser_snapshot, browser_click, browser_drag, browser_hover, browser_select_option, browser_wait_for
core-input (2)browser_press_key, browser_type
core-navigation (2)browser_navigate, browser_navigate_back
core-tabs (1)browser_tabs

可选启用:

工具数核心工具
vision6mouse_click_xy, mouse_drag_xy, mouse_move_xy, mouse_down/up, mouse_wheel
pdf1browser_pdf_save
devtools6start/stop_tracing, start/stop_video, video_chapter, resume
storage17cookie/localstorage/sessionstorage 各 5 个 CRUD + storage_state 2个
network4network_state_set, route, route_list, unroute
testing5generate_locator, verify_element/text/list/value_visible
config1browser_get_config

配置方式:

  • CLI: 40+ 参数 (--browser, --headless, --caps, --viewport-size, --device 等)
  • JSON 配置文件
  • 环境变量 (PLAYWRIGHT_MCP_*)

安全特性:

  • 域名白名单/黑名单 (--allowed-origins, --blocked-origins)
  • 文件访问限制
  • Secrets 掩码

典型启动:

# AI Agent 基础模式
npx @playwright/mcp --browser chrome --headless
 
# 全功能模式
npx @playwright/mcp --browser chrome --headless \
  --caps vision,pdf,devtools,storage,network,testing,config
 
# 指定设备和视口
npx @playwright/mcp --browser chrome --headless \
  --device "iPhone 15 Pro" --caps vision,storage

Skill 5: Puppeteer MCP Server

定位: 轻量级浏览器 MCP 接口,功能精简

版本: @modelcontextprotocol/server-puppeteer@2025.5.12 (社区参考实现)

工具列表 (仅 7 个):

工具功能参数
puppeteer_navigate导航url
puppeteer_screenshot截图name, selector?, width?, height?
puppeteer_click点击selector
puppeteer_fill填写selector, value
puppeteer_select下拉选择selector, value
puppeteer_hover悬停selector
puppeteer_evaluate执行 JSscript

Resources:

  • console://logs — 浏览器控制台日志
  • screenshot://{name} — 命名截图

交互模式: 截图 + CSS 选择器(需要视觉模型配合)

默认行为: 非 Docker 环境默认 headful (有窗口);Docker 自动切 headless

安全机制: 危险参数 (如 --no-sandbox) 需要 allowDangerous: true

局限: 不支持网络拦截、Cookie 管理、Tab 管理、文件上传、视频录制、PDF、测试断言。高级功能只能通过 puppeteer_evaluate 执行 JS 间接实现。


二、核心对比表

2.1 功能维度

能力Chrome CLIPuppeteerPlaywrightPlaywright MCPPuppeteer MCP
页面导航✅ (单次)
点击/填写
网络拦截✅ (opt-in)
Cookie 管理✅ (opt-in)
截图
PDF✅ (opt-in)
视频录制✅ (opt-in)
DOM 导出✅ (via evaluate)
无障碍树✅ (核心)
代码覆盖率
Trace 录制✅ (Chrome)✅ (全功能)✅ (opt-in)
HAR 录制
多浏览器❌ (仅 Chromium+Firefox)✅ (3种)✅ (3种)
设备模拟✅ (仅视口)✅ (133种)
文件上传
Tab 管理
测试断言✅ (自动重试)✅ (opt-in)
代码生成✅ (7种语言)

2.2 性能维度 (实测数据)

指标Chrome CLIPuppeteerPlaywright
启动→输出完整周期551ms196ms346ms
内存 (单页)~1054 MB~1054 MB~1054 MB
进程数141414 + Node.js driver
包体积0 (已安装)~5 MB + Chrome131 MB + 618 MB

注: Puppeteer 最快是因为直接 pipe 连接,无中间进程;Playwright 有 Node.js driver 层;Chrome CLI 含完整渲染+序列化开销。

2.3 反检测维度 (实测数据)

特征Chrome CLIPuppeteerPlaywright (内置)Playwright (channel=chrome)
navigator.webdriverfalsetrue ❌true ❌true ❌
window.chrometrue ✅true ✅falsetrue ✅
plugins.length5 ✅5 ✅05 ✅
UA 含 HeadlessChrome是 ⚠️是 ⚠️是 ⚠️是 ⚠️
WebGL vendor正常 ✅正常 ✅“WebKit”正常 ✅
connection.rtt100 ✅100 ✅0100 ✅
deviceMemory有值 ✅有值 ✅None有值 ✅

反检测难度排序 (从最易检测到最难):

  1. 🔴 Playwright 内置 Chromium 默认 — 6+ 异常特征
  2. 🟡 Puppeteer 默认 — webdriver=true + HeadlessChrome UA
  3. 🟢 Chrome CLI — 仅 UA 含 HeadlessChrome
  4. 🟢 Puppeteer + stealth 插件 — 全面修补
  5. 🟢 Playwright channel='chrome' + --disable-blink-features=AutomationControlled — 接近完美

轻量修复方案:

# Playwright: 添加此参数即可 webdriver=false
browser = p.chromium.launch(
    channel='chrome',
    args=['--disable-blink-features=AutomationControlled']
)
// Puppeteer: 添加此参数即可 webdriver=false
const browser = await puppeteer.launch({
    args: ['--disable-blink-features=AutomationControlled']
});

2.4 MCP Server 对比

维度Playwright MCPPuppeteer MCP
工具总数21-61 (按配置)7
交互模式无障碍树 (结构化)截图 + CSS 选择器
浏览器支持Chrome/Firefox/WebKit仅 Chrome
网络 Mock
存储管理✅ (17 tools)
视频/Trace
PDF
测试断言
Tab 管理
代码生成
视觉坐标操作
配置丰富度40+ 选项仅 launch options
维护方Microsoft (官方)社区参考实现

三、推荐方案

3.1 场景→Skill 推荐

使用场景推荐 Skill理由
简单截图/PDF/DOM 提取Chrome CLI零代码最快,启动即用
AI Agent 浏览网页Playwright MCP21-61 tools,无障碍树模式最适合 LLM
Python 项目自动化Playwright Pythonsync API 简洁,功能最全,与项目 venv 统一
Node.js 项目自动化Puppeteer延迟最低 (196ms),生态丰富
反爬/绕过检测Puppeteer + stealth16+ evasion 模块,最成熟
跨浏览器兼容测试Playwright Python唯一支持 Chromium + Firefox + WebKit
E2E 测试框架Playwright Python + pytest自动重试断言 + Trace + 并行
轻量级 AI 浏览Puppeteer MCP仅 7 tools,简单场景足够
CI/CD 视觉回归Chrome CLI + diff最轻量,无依赖

3.2 综合推荐

┌─────────────────────────────────────────────────────────────┐
│  首选: Playwright Python + Playwright MCP                    │
│  - Python 脚本用 Playwright Python (sync API)                │
│  - AI Agent 集成用 Playwright MCP                            │
│  - 两者共享同一浏览器引擎和配置体系                            │
├─────────────────────────────────────────────────────────────┤
│  补充: Puppeteer (反检测场景)                                 │
│  - stealth 插件成熟度远超 playwright-stealth                  │
│  - Node.js 生态集成最紧密                                    │
├─────────────────────────────────────────────────────────────┤
│  兜底: Chrome CLI (零依赖简单任务)                            │
│  - 脚本中一行命令搞定截图/PDF                                 │
│  - 天然 webdriver=false                                      │
└─────────────────────────────────────────────────────────────┘

四、每个 Skill 能做什么(能力矩阵)

4.1 Chrome Headless CLI

能做不能做
✅ 渲染页面取 DOM❌ 点击按钮
✅ 截图 (可设窗口大小)❌ 填写表单
✅ 生成 PDF❌ 多步导航
✅ 快进异步 JS❌ 读取 JS 变量值
✅ 设置代理❌ 拦截/修改请求
✅ 覆写 User-Agent❌ 管理 Cookie
✅ 暴露 CDP 给其他工具❌ 等待特定元素
✅ 无头截图+隐藏滚动条❌ 禁用 JavaScript (已失效!)

4.2 Puppeteer

能做不能做
✅ 完整页面交互❌ Safari/WebKit 测试
✅ 请求拦截/mock❌ 内置视频录制
✅ JS/CSS 覆盖率分析❌ HAR 录制
✅ Chrome DevTools Trace❌ 内置测试框架
✅ 反检测 (stealth 插件)❌ 断言自动重试
✅ 无障碍树❌ 代码录制/生成
✅ PDF (全选项)❌ 多浏览器并行
✅ 设备/地理/时区模拟❌ WebSocket 路由
✅ 远程浏览器连接

4.3 Playwright Python

能做不能做
✅ 所有 Puppeteer 能做的❌ JS/CSS 覆盖率 (需 CDP session)
✅ 多浏览器 (Chromium/Firefox/WebKit)❌ 原生 stealth (需第三方)
✅ 内置视频录制❌ 浏览器扩展 (Firefox/WebKit)
✅ HAR 录制/回放
✅ Trace 录制+可视化
✅ 代码录制 (codegen, 7种语言)
✅ WebSocket 路由
✅ 断言自动重试
✅ Clock API 时间控制
✅ Context 完全隔离
✅ 存储状态保存/恢复

4.4 Playwright MCP

能做不能做
✅ AI Agent 结构化浏览❌ 覆盖率分析
✅ 无障碍树驱动交互❌ HAR 录制
✅ 网络 mock (opt-in)❌ 自定义复杂等待条件
✅ Cookie/Storage 管理❌ 多 Context 并行
✅ 视频/Trace (opt-in)❌ Promise.all 并行操作
✅ PDF (opt-in)❌ 组件测试
✅ 坐标级鼠标控制❌ iframe 深度操作
✅ 测试断言 (opt-in)
✅ 代码生成 (TypeScript)
✅ 安全域名控制

4.5 Puppeteer MCP

能做不能做
✅ 基础导航❌ 网络拦截
✅ 截图 (页面/元素)❌ Cookie 管理
✅ 点击/悬停❌ Tab 管理
✅ 填写/选择❌ 文件上传
✅ 执行任意 JS❌ PDF
✅ 控制台日志收集❌ 视频/Trace
❌ 测试断言
❌ 多浏览器

五、生态系统

5.1 Playwright 生态

工具用途状态
pytest-playwrightPython 测试框架集成官方
playwright codegen交互录制→代码内置
playwright show-traceTrace 可视化内置
@playwright/mcpAI Agent MCP官方
playwright-stealth (PyPI)Python 反检测第三方 v2.0.3
playwright-extra (npm)Node.js 插件框架第三方 v4.3.6
trace.playwright.dev在线 Trace 查看器官方

5.2 Puppeteer 生态

工具用途状态
puppeteer-extra插件框架活跃
puppeteer-extra-plugin-stealth反检测 (16+ evasions)最成熟
puppeteer-extra-plugin-recaptcha验证码解决活跃
puppeteer-cluster并行实例管理活跃
puppeteer-screen-recorder视频录制第三方
puppeteer-to-istanbul覆盖率转换活跃
browserlessChrome as a Service商业

5.3 Chrome CLI 生态

无独立生态。作为 Puppeteer/Playwright 的底层运行时,或通过 --remote-debugging-port 暴露 CDP 协议。


六、本机安装状态

组件版本路径
Google Chrome134.0.6998.165/usr/bin/google-chrome
Playwright (Python, venv)1.52.0.venv/lib/python3.10/site-packages/playwright/
Playwright (Python, system)1.58.0/home/zbc/.local/bin/playwright
Playwright Chromium136.0.7103.25~/.cache/ms-playwright/chromium-1169/
Playwright MCP0.0.70$(npm root -g)/@playwright/mcp/
Puppeteer23.11.1MCP Server 内置依赖
Puppeteer MCP2025.5.12$(npm root -g)/@modelcontextprotocol/server-puppeteer/
Node.js22.12.0/home/zbc/local/nodejs/bin/node

七、附录:实测验证方法

本文档所有数据经过以下验证流程:

  1. 多 Agent 并行研究: 4 个 Agent 分别研究各工具的文档和源码
  2. 实测验证: 5 个 Agent 在本机实际执行测试脚本
  3. 交叉对比: 对比各 Agent 结果,发现并修正 10+ 处原始数据错误
  4. 反检测深度测试: 通过 evaluate() 在页面内检测 7+ 自动化特征

已修正的错误

原始声称修正值原因
Playwright 1.58venv 中为 1.52.0system pip 和 venv 版本不同
143 种设备133 种v1.52 设备数
Playwright 启动 500-1000ms~346ms实测更快
Puppeteer 启动 1-3s~196ms严重高估
Chrome CLI 启动 210-300ms~551ms含完整渲染序列化开销
内存 925 MB~1054 MB实测 14 进程
Playwright MCP 45+ tools默认 21, 最大 61取决于 —caps 配置
Playwright window.chrome=true内置 Chromium 为 false需 channel=‘chrome’
—disable-javascript 可用Chrome 134 中失效新 headless 不支持