你的编码代理现在可以不执行 JavaScript 地检查网页了
Chrome 2026 年 10 月 DevTools 汇总里最有用的东西不是一个功能,而是一个权限。在 DevTools for agents 那一节里藏着一个开关叫 --no-javascript-evaluation,它让代理在不执行页面脚本的情况下检查页面。Chrome 153 与 154 还加了:可以彻底关闭 JavaScript 执行工具、按需加载 source map、可配置文件系统根目录、按保留大小或属性名直接查询堆快照、专门的 PWA 自动化工具,以及控制台列表里的可选堆栈信息。这些都不会让代理变聪明,它们只是缩小爆炸半径——而这恰恰决定你能不能把代理指向一个网页。
浏览器开发者工具与代码编辑器并排
一、只读开关才是头条
把代理指向线上站点确实有用:控制台报错、请求失败、布局问题,正是编码代理编不出来的那类证据。问题在于,带脚本求值能力的浏览器自动化层也能改变状态——填个表单、提交个订单、把计数器加一。--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 里真正有意思的从来不是模型会不会点按钮,而是你能不能把页面交给它之后,事后仍然精确说出它被允许碰什么。
挂锁与网线,代表受控访问
内存与性能测量图表
📌 常见问题 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 重新发送」以及若干无障碍修复。