你的编码代理现在可以不执行 JavaScript 地检查网页了

·阅读约10分钟·Evergreen Tools Team

Chrome 2026 年 10 月 DevTools 汇总里最有用的东西不是一个功能,而是一个权限。在 DevTools for agents 那一节里藏着一个开关叫 --no-javascript-evaluation,它让代理在不执行页面脚本的情况下检查页面。Chrome 153 与 154 还加了:可以彻底关闭 JavaScript 执行工具、按需加载 source map、可配置文件系统根目录、按保留大小或属性名直接查询堆快照、专门的 PWA 自动化工具,以及控制台列表里的可选堆栈信息。这些都不会让代理变聪明,它们只是缩小爆炸半径——而这恰恰决定你能不能把代理指向一个网页。

你的编码代理现在可以不执行 JavaScript 地检查网页了

浏览器开发者工具与代码编辑器并排

一、只读开关才是头条

把代理指向线上站点确实有用:控制台报错、请求失败、布局问题,正是编码代理编不出来的那类证据。问题在于,带脚本求值能力的浏览器自动化层也能改变状态——填个表单、提交个订单、把计数器加一。--no-javascript-evaluation 把这个口子关了,而且按汇总的说法,这个控制跨越导航与初始化脚本,不只是第一个文档。你还可以直接把 JavaScript 执行工具关掉。对任何非本地构建的页面,这应该是默认值;要打开它,必须是针对某一项任务、明确且被记录的决定。

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        "--no-javascript-evaluation",
        "--isolated"
      ],
      "env": {
        "CHROME_DEVTOOLS_MCP_ALLOWED_ROOTS": "${workspaceFolder}"
      }
    }
  }
}

// Read this block as "read a page, do not run it".
// --no-javascript-evaluation keeps page scripts from executing while the agent
// inspects, and the recap notes the control extends across navigations and
// initialization scripts, not just the first document.

二、内存才是代理静默翻车的地方

如果你的代理是在调试而不只是阅读,有两项新增很关键:按需 source map,避免大站点在代理接入时把内存打爆;以及堆快照相关能力——按保留大小或属性名直接查询对象、按最小保留大小过滤边、以及报告被 V8 执行上下文保活的内存。凡是看过代理开着 4GB 快照去追「内存泄漏」的人,都知道这有多要紧。诚实的流程是:先拿稳定基线,按保留大小排序,用属性名查可疑对象,最后才读代码。工具现在已经支持这个顺序了,代理仍然会试图跳到第三步。

# Two ways to keep an agent read-only, picked by environment.

# Local build: full authority, it is your own code.
npx chrome-devtools-mcp@latest \
  --browser-url http://127.0.0.1:9222 \
  --allowed-root "$PWD"

# Anything that is not a local build: no evaluation, no unrestricted paths.
npx chrome-devtools-mcp@latest \
  --no-javascript-evaluation \
  --allowed-root /tmp/agent-run/$(date +%s)

# The recap also notes a --allow-unrestricted-paths behaviour in the CLI and
# configurable file system roots. Treat "unrestricted" as a local-dev-only flag:
# an agent that can read the whole disk can read .env, SSH keys and browser
# profiles, which is a data-exfiltration path far cheaper than a prompt injection.

三、用 URL 决定开关,而不是用提示词

我见过最常见的翻车方式,是把策略写在提示词里:系统消息写着「你是只读的」,旁边是一个拥有完整求值能力的代理。把决策写进代码,按 URL 判定。本地构建给完整权限;第三方页面给审计档——关闭求值、限定临时根目录;不归你所有的页面,除了只读审计以外的任何用途,直接拒绝。最后那个分支才是让你不出现在事故报告里的分支,而它只有三行。

# browser-policy.py — decide the flags from the URL, not from the prompt
from urllib.parse import urlparse

LOCAL = {"localhost", "127.0.0.1", "::1", "0.0.0.0"}

def decide(url: str, purpose: str) -> dict:
    host = (urlparse(url).hostname or "").lower()
    is_local = host in LOCAL or host.endswith(".local") or host.endswith(".test")

    if is_local:
        return {"flags": [], "js_evaluation": True,
                "reason": "local build, agent may drive and mutate"}

    if purpose == "audit":
        return {"flags": ["--no-javascript-evaluation"], "js_evaluation": False,
                "reason": "third-party page, read-only audit"}

    raise PermissionError(
        "refusing to attach an agent to %s for purpose=%r; "
        "use a recorded HAR or a staging copy instead" % (host, purpose))

# The failure this prevents is not exotic: a checkout page where an agent
# "tests the flow" and a script changes state. Read-only by default, write
# access only where you own the machine.

四、先圈住文件系统,再圈一遍

可配置文件系统根目录加上 CLI 的路径开关,听起来像内务整理,直到你想到一个浏览代理在开发者笔记本上能读到什么:.env、SSH 私钥、浏览器配置目录、shell 历史。一个拥有不受限根目录、又能通过页面外传数据的代理,是一条成本远低于精巧提示注入的数据泄露路径。给代理一个每次运行独立的临时目录,别挂别的;把「不受限路径」当成一个只在你本地调试那两分钟存在的开关。下面的审计脚本之所以创建带时间戳的输出目录,就是这个原因。

#!/usr/bin/env bash
# browse-audit.sh — one page, read-only, artifacts on disk.
set -euo pipefail
URL="$1"; OUT="audit/$(echo "$URL" | tr '/:' '__')"; mkdir -p "$OUT"

npx -y chrome-devtools-mcp@latest \
  --no-javascript-evaluation \
  --allowed-root "$OUT" \
  --once --url "$URL" --out "$OUT" || true

# What you actually want out of an audit:
#   1. console errors (with stack traces, the recap added them to list_console_messages)
#   2. failed network requests
#   3. layout issues you can see in the screenshot
#   4. memory, only if the question is about memory
ls -la "$OUT"

五、把「看着没问题」变成断言

汇总给 list_console_messages 加了可选堆栈信息,这让控制台输出从「扫一眼」变成「可断言」。用它。把控制台日志落成文件,断言在很短的忽略列表之外没有任何 error 级消息,并且要求所有进入基线的错误都带堆栈——没有堆栈的错误,就是你决定不去理解的错误。断言放在部署之前跑,不是之后。这是被代理改过的 Web 应用最便宜的一种回归测试,而且它抓的正是全绿的单元测试乐于忽略的那类 bug。

# assert-console.py — turn "looks fine" into a check that can fail CI
import json, sys

def load(path):
    with open(path) as f:
        return json.load(f)

def failing(messages, ignore=("favicon.ico", "third-party-cookie")):
    bad = []
    for m in messages:
        text = (m.get("text") or "")
        if any(i in text for i in ignore):
            continue
        if m.get("level") in ("error", "assert"):
            bad.append((m.get("level"), text[:120], bool(m.get("stackTrace"))))
    return bad

if __name__ == "__main__":
    msgs = load(sys.argv[1])
    bad = failing(msgs)
    for level, text, has_stack in bad:
        print(f"[{level}] {text}  stack={has_stack}")
    sys.exit(1 if bad else 0)

# Two habits worth keeping:
#   - assert on console errors before a deploy, not after
#   - require a stack trace for every error you accept into a baseline

六、今天我就会发的配置

只记一件事的话:给你的浏览代理两套配置,不是一套。本地档开启求值、限定临时根目录、生命周期很短;审计档关闭求值、输出到带时间戳的目录、配一个能在控制台报错时让 CI 挂掉的断言脚本。然后用代码根据 URL 决定跑哪一档,并把决定和运行一起记日志。Agentic browsing 里真正有意思的从来不是模型会不会点按钮,而是你能不能把页面交给它之后,事后仍然精确说出它被允许碰什么。

你的编码代理现在可以不执行 JavaScript 地检查网页了

挂锁与网线,代表受控访问

你的编码代理现在可以不执行 JavaScript 地检查网页了

内存与性能测量图表

📌 常见问题 FAQ

--no-javascript-evaluation 到底做什么?

它让编码代理在不执行页面脚本的前提下检查页面。按 Chrome 2026 年 10 月 DevTools 汇总的说法,这个控制跨越导航与初始化脚本,你也可以直接关闭 JavaScript 执行工具。

这些改动是在哪些 Chrome 版本落地的?

Chrome 153 与 Chrome 154,汇总于 2026 年 10 月的 New in DevTools 文章。Chrome 现在每月发布两次,所以这个系列改成了月度汇总。

内存方面加了什么?

按需 source map,避免开启 source map 时在大站点上占用过高内存;按最小保留大小过滤堆快照的边;按保留大小或属性名直接查询对象;报告 V8 执行上下文保活的聚合内存;以及快照文件损坏时给出清晰报错而不是卡住。

query_heapsnapshot 是什么?

一个 DevTools for agents 的工具,可以按保留大小阈值或属性名直接查询堆快照中的对象,从而缩短内存泄漏排查。

10 月汇总里还有什么?

Application 面板的广告脚本追踪、Performance 的完整软导航支持与 CPU 性能档覆盖、Elements 的失效样式支持与键盘可访问装饰器、现代化设备预设、Network 的「以 fetch 重新发送」以及若干无障碍修复。