Skip to content

[Bug]: fix: ensure OPENCLI_CDP_ENDPOINT bypasses daemon and prevent navigation hangs #1228

@yirenkeji555

Description

@yirenkeji555

Description

📝 OpenCLI CDP 直连模式修复总结

问题背景:
原本 OpenCLI 虽然声明支持 OPENCLI_CDP_ENDPOINT 环境变量,但在实际使用中存在两个核心问题:

  1. 逻辑路径未切换:即便设置了环境变量,内核仍会尝试启动 daemon (守护进程) 并使用 BrowserBridge,导致无法直接控制指定的浏览器端口。
  2. 导航卡死 (Hang):在使用 CDP 直连模式进行页面跳转 (goto) 时,程序常因等待 DOM 稳定信号而永久挂起。

主要修改内容:

  1. 核心工厂逻辑重构 (src/runtime.ts)

修改了 getBrowserFactory 函数,提升了 OPENCLI_CDP_ENDPOINT 的优先级。

  • 改动:现在只要检测到环境变量 OPENCLI_CDP_ENDPOINT,就会强制返回 CDPBridge 实例,彻底绕过 daemon 启动逻辑和 BrowserBridge 检查。
  1. CDP 桥接器稳定性增强 (src/browser/cdp.ts)

这是修复“卡死”现象的关键:

  • 引入超时保护:为 CDPPage.goto 中的 DOM 稳定性检查 (waitForDomStableJs) 引入了 withTimeoutMs 包装。
    • 原因:某些指纹浏览器或页面(如 Facebook/Bilibili)会有持续的背景微小变动或加载动画,导致 waitForDomStableJs 永远无法达成“绝对静默”。
    • 修复:增加了 2 秒的额外容错时间。如果页面在设定的 settleMs 内未完全稳定,系统会抛出警告而非永久挂起,从而保证后续自动化指令能继续执行。
  • 命令发送超时控制:为底层的 send() 方法增加了默认 30s 的保护,防止 WebSocket 指令丢失导致的进程僵死。
  1. 页面跳转流程优化
  • 事件驱动:将原有的硬编码 sleep(1000) 改为监听 CDP 原生的 Page.loadEventFired 事件,使得页面加载更灵敏且更可靠。

修复效果:

  • 用户现在可以通过 OPENCLI_CDP_ENDPOINT=http://localhost:9333 完美控制各种指纹浏览器(如 AdsPower, HubStudio, BitBrowser 等)。
  • 解决了跨浏览器、多 Profile 自动化时的内核启动冲突问题。

Steps to Reproduce

  1. Run /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9333 --user-data-dir="/tmp/chrome-debug-9333" --remote-allow-origins="*"
  2. Run OPENCLI_CDP_ENDPOINT=http://localhost:9333
  3. Run opencli browser open "https://www.google.com" --live --focus
  4. But not opreate in new chrome.

Expected Behavior

run on new chrome

OpenCLI Version

1.7.8

Node.js Version

20.x

Operating System

macOS

Logs / Screenshots

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions