doubao ask: site:doubao 租约绑在 about:blank 时「领养已有豆包标签」路径下发送静默丢失,稳定超时
- Dominant language
- JavaScript
- Stars
- 29.3k
- Forks
- 2.9k
- Avg merge
- 15h 36m
- Merged PRs (30d)
- 70
Description
## 环境
- OpenCLI 1.8.7(npm 全局安装),Browser Bridge 扩展 v1.0.23
- macOS(Darwin 25),Chrome 151,独立 user-data-dir profile
- 豆包网页版已登录,`opencli doubao status` 正常返回 `logged_in: true`
## 现象
当 `site:doubao` 会话租约绑定在一个 `about:blank` 标签上、而真正的豆包页面开在同 profile 的其他标签时,`opencli doubao ask` **稳定失败**:
- 命令总是超时返回 `No response within Ns. Doubao may still be generating.`
- 但豆包侧:文字确实被填进了输入框(`sendDoubaoMessage` 的 hasText 校验通过,未抛错),**发送从未发生**——会话里没有新消息、服务端没有生成
- 期间 `browser site:doubao eval "location.href"` 返回 `about:blank`,而 `doubao status` 却报告 `Url: https://www.doubao.com/chat`(走了 `selectPreferredDoubaoTab` 的「领养」路径)
对用户来说这是最难排查的一类故障:ask 的每一步内部校验都通过,只是永远等不到回复。
## 根因分析
`ensureDoubaoChatPage` 在租约页不在豆包域时会尝试「领养」已存在的豆包标签(`selectPreferredDoubaoTab`)。领养路径下疑似出现**执行目标分裂**:
- `page.evaluate`(填文本、hasText 校验、状态读取)作用在**被领养的豆包标签**上;
- 而 `nativeType` / `nativeKeyPress`(CDP 原生输入,含发送用的 Enter)疑似仍打在**原来的 about:blank 租约页**上(或落在领养标签但焦点不在输入框)。
结果:JS 填充让校验通过,但承担「发送」的原生 Enter 落空,消息永远停在输入框里。textarea 的 value 不进 `innerText`,从外部看两个豆包标签毫无变化,极具迷惑性。
对照实验支持这个判断:把租约页直接导航到豆包(不触发领养)后,**同一流程立即正常**(见下方 workaround)。
## 复现
1. 让 `site:doubao` 租约落在空白页(例如先前 `browser bind` 在空白标签上留下的残留,或手动 `browser site:doubao open about:blank`);
2. 同 profile 另开一个正常登录的 `https://www.doubao.com/chat` 标签;
3. 运行 `opencli --profile
doubao ask "任意问题" --timeout 60 -f json`;
4. 观察:超时无回复;豆包标签输入框里留有未发送的文字;`browser site:doubao eval "location.href"` 仍是 `about:blank`。
## 临时解法(已验证)
```bash
opencli --profile
browser site:doubao close
opencli --profile
browser site:doubao open "https://www.doubao.com/chat/"
# 并关闭多余的豆包标签,避免再次触发领养
```
之后 ask 一切正常。
## 建议
领养语义下,要么把租约的 CDP 输入目标一并切换到被领养标签并确保输入框焦点,要么放弃领养、直接对租约页 `goto` 豆包(`ensureDoubaoChatPage` 的兜底分支本来就有 goto,问题只出在领养分支)。
---
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Contributor guide
Research direction
Start with ensureDoubaoChatPage and its selectPreferredDoubaoTab adoption path, then trace how nativeType and nativeKeyPress choose their CDP input target. Reproduce with an about:blank lease page using the documented doubao ask command. Done means the adopted Doubao tab receives the input and send action, while the ask command completes normally.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, playwright
- Domain
- cli, tooling, web-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 58/100