Skip to content

安装 Playwright 浏览器自动化 ​

在容器内安装 Chromium 并注册 Playwright MCP 服务器后,AI 即可打开网页、点击元素、填写表单、抓取页面内容与截图。

需要 Debian / Ubuntu 容器

Chrome for Testing 的二进制依赖 glibc,内置 Alpine 镜像使用 musl libc,无法运行。请先参照 容器与镜像 导入自定义 Debian 或 Ubuntu 镜像。

环境基线 ​

项值
系统Debian / Ubuntu,容器内默认 root
架构aarch64(arm64)或 x86_64
浏览器Chrome for Testing 153.0.8010.12,安装至 /opt/chrome
MCP 服务@playwright/mcp,由 npx 按需拉取

1. 安装依赖 ​

bash
apt-get update -qq && apt-get install -y -qq unzip fonts-noto-cjk

缺少中文字体时,截图中的中文会显示为方块。

2. 下载并解压 Chromium ​

以 arm64 为例;x86_64 需将 URL 中的 linux-arm64 替换为 linux64,解压目录名替换为 chrome-linux64。

bash
mkdir -p /opt/chrome
curl -L -o /tmp/chrome.zip \
  https://cdn.npmmirror.com/binaries/chrome-for-testing/153.0.8010.12/linux-arm64/chrome-linux-arm64.zip
unzip -q /tmp/chrome.zip -d /opt/chrome
rm /tmp/chrome.zip

/opt/chrome/chrome-linux-arm64/chrome --version
# 输出 Google Chrome for Testing 153.0.8010.12

上面用的是 npmmirror 镜像,也可改用官方源;该版本下架时替换 URL 中的版本号即可:

https://storage.googleapis.com/chrome-for-testing-public/153.0.8010.12/linux-arm64/chrome-linux-arm64.zip

3. 注册 MCP 服务器 ​

进入「设置 → MCP 服务器 → +」,传输类型选择本地 stdio,按下表填写后保存,App 会自动连接。

字段值
名称playwright
启动命令npx
命令参数-y、@playwright/mcp@latest、--headless、--no-sandbox、--executable-path、/opt/chrome/chrome-linux-arm64/chrome(逐项添加)
作用域全局(所有项目共用)或项目(仅当前工作区)

也可直接编辑配置文件,全局为 ~/.aicode/mcp.json,项目级为 <工作区>/.aicode/mcp.json,保存后数秒内自动生效:

json
{
    "mcpServers": {
        "playwright": {
            "command": "npx",
            "args": [
                "-y",
                "@playwright/mcp@latest",
                "--headless",
                "--no-sandbox",
                "--executable-path",
                "/opt/chrome/chrome-linux-arm64/chrome"
            ],
            "enabled": true
        }
    }
}

其中 --no-sandbox 在容器内必须指定,否则浏览器启动即崩溃;--executable-path 指向已安装的 Chromium,避免 Playwright 重复下载。

默认 headless 的 User-Agent 带有 HeadlessChrome 标识,部分站点会据此拦截,可追加 --user-agent 覆盖(界面中作为两个参数项依次添加):

--user-agent
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36

截图等输出文件默认写入运行目录下的 .playwright-mcp/,也就是当前工作区根目录,会在仓库里留下未跟踪文件。追加 --output-dir 可移出工作区:

--output-dir
/root/playwright-output

截图时指定了文件名则例外:相对路径按工作区解析,会绕过 --output-dir,需写绝对路径。

4. 验证 ​

进入「设置 → MCP 服务器」,playwright 一行应显示为已连接并标注工具数量;连接失败时点击右上角的日志按钮排查。

随后新建会话(工具列表在会话开始时确定),令 AI 打开网页并截图,返回图片即表示链路正常。首次连接需等待 npx 下载 @playwright/mcp,实测 3 至 4 分钟。

常见问题 ​

现象原因解决
启动即 Target closed 或崩溃退出缺少 --no-sandbox补充该参数后重新连接
终端直接运行 chrome 报 /dev/shm FATAL容器无 /dev/shm,且 /dev 不可写附加 --disable-dev-shm-usage;由 Playwright 启动的不受影响
chrome: not found 或二进制无法执行容器为 Alpine(musl),或包与架构不符更换 Debian / Ubuntu 镜像,核对 arm64 与 x64 包
截图中文显示为方块缺少中文字体执行 apt-get install -y fonts-noto-cjk
截图为空白页或整张透明无 GPU 环境下渲染偶发失败重试一次,仍为空白时改用 JPEG 格式
首次调用需等待数分钟npx 正在下载 @playwright/mcp等待完成,此后使用本地缓存;也可将 npm registry 换为 https://registry.npmmirror.com
MCP 列表中没有 playwright配置未生效或 JSON 存在语法错误确认 mcp.json 可正常解析,再点击右上角「重新连接」

附:一键安装脚本 ​

以下脚本完成第 1 至 3 步,另含下载源自动切换、压缩包校验、已安装时跳过下载、写入前备份 mcp.json。保存为 /tmp/install-playwright.sh 后执行 bash /tmp/install-playwright.sh:

bash
#!/usr/bin/env bash
set -euo pipefail

VERSION="${CHROME_VERSION:-153.0.8010.12}"
DIR=/opt/chrome
ZIP=/tmp/chrome-$VERSION.zip

case "$(uname -m)" in
  aarch64|arm64) SUB=linux-arm64; NAME=chrome-linux-arm64 ;;
  x86_64)        SUB=linux64;     NAME=chrome-linux64 ;;
  *) echo "不支持的架构: $(uname -m)"; exit 1 ;;
esac
BIN="$DIR/$NAME/chrome"

[ "$(id -u)" = 0 ] || { echo "请以 root 运行"; exit 1; }
command -v python3 >/dev/null || { echo "缺少 python3"; exit 1; }
command -v npx >/dev/null || echo "[警告] 未找到 npx,MCP 服务无法启动"

need=()
command -v unzip >/dev/null || need+=(unzip)
fc-list :lang=zh 2>/dev/null | grep -q . || need+=(fonts-noto-cjk)
if [ ${#need[@]} -gt 0 ]; then
  echo "安装依赖:${need[*]}"
  apt-get update -qq && apt-get install -y -qq "${need[@]}"
fi

if [ -x "$BIN" ]; then
  echo "已安装,跳过下载:$BIN"
else
  for url in \
    "https://cdn.npmmirror.com/binaries/chrome-for-testing/$VERSION/$SUB/$NAME.zip" \
    "https://storage.googleapis.com/chrome-for-testing-public/$VERSION/$SUB/$NAME.zip"
  do
    echo "下载:$url"
    curl -fL --retry 3 --retry-delay 2 -o "$ZIP" "$url" && break
    echo "[警告] 该源不可用,切换下一个"
  done
  [ -s "$ZIP" ] || { echo "全部下载源均失败"; exit 1; }

  mkdir -p "$DIR"
  unzip -tq "$ZIP" && unzip -q "$ZIP" -d "$DIR"
  rm -f "$ZIP"
fi

"$BIN" --version

BIN="$BIN" python3 - <<'PY'
import json, os, shutil
p = os.path.expanduser("~/.aicode/mcp.json")
os.makedirs(os.path.dirname(p), exist_ok=True)
data = {}
if os.path.exists(p):
    shutil.copy(p, p + ".bak")
    with open(p, encoding="utf-8") as f:
        data = json.load(f)   # 存在语法错误时报错退出,不覆盖
data.setdefault("mcpServers", {})["playwright"] = {
    "command": "npx",
    "args": ["-y", "@playwright/mcp@latest", "--headless", "--no-sandbox",
             "--executable-path", os.environ["BIN"]],
    "enabled": True,
}
with open(p, "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4, ensure_ascii=False)
print("已写入 playwright 配置")
PY

echo "安装完成:$BIN"

CHROME_VERSION 可指定其它版本。安装完成后返回第 4 步验证。

基于 GPL-3.0 协议开源