在 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=<非默认目录>;端口被占时换新端口。