在 Chrome 136+ 用 browser-use 打开「带登录态」浏览器的完整攻略
适用场景:Python + Playwright ⬄ browser-use ≥ 0.1.42
目标:无需重复登录,稳定复用本机 Chrome Profile
一、背景
| 版本 | 说明 | |
|---|---|---|
| Chrome ≤135 | 允许默认 Profile 开启调试端口 | 无特殊限制 |
| Chrome ≥136 | 强制要求 **--user-data-dir** 若进程携带 --remote-debugging-port/pipe,必须 同时提供 非默认 --user-data-dir。默认 Profile 会屏蔽调试端口 |
默认 Profile 禁用调试端口 |
**browser-use≤0.1.40** |
连接默认 Profile 时触发 **ECONNREFUSED** |
无法适配新安全策略 错误:ECONNREFUSED ::1:9222 |
**browser-use≥0.1.42** |
自动创建临时 Profile(**/tmp/browseruse-***) |
登录态丢失但可正常连接 |
1. Chrome 136 升级日志文档
- Custom data directory required for remote debugging
Remote debugging via a TCP port or a pipe is no longer possible in Google Chrome with the default data directory on Windows, Linux, and macOS. A custom data directory must be specified to remotely debug Google Chrome using the --user-data-dir switch, when using the --remote-debugging-pipe or --remote-debugging-port switches.
We've made this change because these remote debugging switches are being abused by infostealers and malware to extract data from Google Chrome. A custom user data directory uses a different encryption key and so it prevents malware stealing encrypted data such as cookies.
This change does not affect Chrome for Testing and Chromium.
- Chrome 136 on Linux, macOS, Windows
2. Python 代码报错文案
ERROR [browser] ❌ Failed to start a new Chrome instance: BrowserType.connect_over_cdp: connect ECONNREFUSED ::1:9222
Call log:
retrieving websocket url from http://localhost:9222
ERROR [browser] Failed to initialize Playwright browser: To start chrome in Debug mode, you need to close all existing Chrome instances and try again otherwise we can not connect to the instance.
ERROR [browser] ❌ Failed to create new browser session: To start chrome in Debug mode, you need to close all existing Chrome instances and try again otherwise we can not connect to the instance. (did the browser process quit?)
WARNING [browser] ⚠️ Page load failed, continuing...
二、核心思路
- 使用 shell 脚本复制一份现有 Profile(包含 cookie 等)到专用目录
- Python 代码里显式设置 --user-data-dir=<专用目录>
- 可选:多实例/并行→每份 Profile 用独立端口
三、Shell 脚本
1. Shell 脚本
bash
#!/usr/bin/env bash
set -e
PROFILE_DIR="${HOME}/.chrome-profiles/agent" # 可以改成自己需要放在的位置
CHROME_DEFAULT="${HOME}/Library/Application Support/Google/Chrome/Default"
echo "▶ 准备持久化 profile:$PROFILE_DIR"
if [ -d "$PROFILE_DIR" ]; then
echo " 目录已存在,跳过复制(如果要重新复制,请先删掉)"
else
mkdir -p "$PROFILE_DIR"
echo " 复制现有登录态...(可能稍慢,取决于文件大小)"
cp -R "$CHROME_DEFAULT" "$PROFILE_DIR/Default"
echo " ✔ 完成"
fi
echo "ℹ️ 以后在 Python 里把 --user-data-dir 指向:$PROFILE_DIR"
2. 执行
plain
chmod +x prepare_chrome_profile.sh
./prepare_chrome_profile.sh
四、Python 示例(browser-use ≥ 0.1.42)
python
from browser_use import Browser, BrowserConfig, Agent
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
import os, asyncio
llm = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
model="deepseek-chat",
api_key=SecretStr("sk-...")
)
PROFILE_DIR = os.path.expanduser("~/chrome-profiles/agent")
browser = Browser(
config=BrowserConfig(
browser_binary_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
extra_browser_args=[
f"--user-data-dir={PROFILE_DIR}",
"--profile-directory=Default",
],
chrome_remote_debugging_port=9223,
headless=False,
keep_alive=True
)
)
async def main():
agent = Agent(
task="示例任务 ...",
llm=llm,
browser=browser,
use_vision=False
)
print((await agent.run()).final_result())
asyncio.run(main())
五、兼容旧版三策略
- 升级 browser-use 并加载持久 Profile(推荐,上文示例)
- 继续 0.1.40 + 手动启动 Chrome
plain
google-chrome --remote-debugging-port=9222 --user-data-dir=/path/to/profile
- 然后 BrowserConfig(cdp_url="http://localhost:9222\")
- 降级 Chrome ≤ 135(应急,不建议长期)
六、常见疑问 & 排错
1. 必须每次跑 .sh 吗?
复制 Profile 只做一次;重置登录态时再执行。
2. 提示 profile locked / Chrome 已在运行?
关闭所有手动 Chrome,再启脚本。
3. 多 Agent 并发?
为每个实例复制独立 Profile,并用不同 chrome_remote_debugging_port。
4. chrome_instance_path 提示弃用?
升级后统一用 browser_binary_path。
5. 还是报 ECONNREFUSED 9222?
确认已传入 --user-data-dir=<非默认目录>;端口被占时换新端口。