$npx -y skills add agentscope-ai/QwenPaw --skill browser_cdp-zh当用户明确希望连接到已运行的 Chrome 浏览器、扫描本地 CDP 端口、显式指定 cdp_port,或让多个 agent / 工具共享同一个浏览器时,使用本 skill。当前 browser_use 默认已使用 managed CDP 启动浏览器;如果用户不希望暴露浏览器历史、Cookies 等敏感信息,推荐改用 private_mode=true 的隐私模式。
| 1 | # 浏览器 CDP 使用参考 |
| 2 | |
| 3 | 当前 **browser_use** 默认就是以 **managed CDP** 方式启动并接管本地 Chrome/Chromium,但这不等于每次都应该把 CDP 端口暴露给用户或其他工具。 |
| 4 | |
| 5 | 本 skill 关注的是更“显式”的 CDP 用法: |
| 6 | |
| 7 | 1. **扫描本地 CDP 端口** |
| 8 | 2. **连接已有 Chrome(`connect_cdp`)** |
| 9 | 3. **显式指定 `cdp_port` 启动浏览器** |
| 10 | 4. **让多个 agent / 工具共享同一个浏览器实例** |
| 11 | |
| 12 | 也就是说: |
| 13 | |
| 14 | - 普通 `start` 默认会使用 managed CDP,但通常不需要用户理解或感知 CDP 细节 |
| 15 | - 只有在用户明确提出“连接现有浏览器 / 扫描端口 / 指定端口 / 共享浏览器”时,才应进入本 skill 的语义范围 |
| 16 | |
| 17 | > **隐私建议** |
| 18 | > |
| 19 | > 如果用户不希望暴露浏览器历史、Cookies、页面内容或会话信息,推荐使用 `private_mode=true`,改走 Playwright 直接管理模式。 |
| 20 | |
| 21 | > **⚠️ 单 workspace 单浏览器实例** |
| 22 | > |
| 23 | > 同一 workspace 同时只能运行或连接一个浏览器。若当前已有浏览器实例,必须先执行 `stop`,再切换到新的浏览器或新的 CDP 连接。 |
| 24 | |
| 25 | --- |
| 26 | |
| 27 | ## 何时使用 |
| 28 | |
| 29 | 仅在用户明确表达以下意图时使用本 skill: |
| 30 | |
| 31 | - “连接到我已经打开的 Chrome” |
| 32 | - “扫描一下本机有哪些 CDP 端口可用” |
| 33 | - “用固定调试端口启动浏览器” |
| 34 | - “让别的 agent / 工具也能连到这个浏览器” |
| 35 | - “通过远程调试端口附着到浏览器” |
| 36 | |
| 37 | 以下情况通常**不要**进入本 skill: |
| 38 | |
| 39 | - 用户只是说“打开浏览器” |
| 40 | - 用户只是说“开一个可见窗口” |
| 41 | - 用户没有提到共享、端口、CDP、远程调试 |
| 42 | |
| 43 | 这些情况通常直接使用普通 `start`,必要时加 `headed=true`,参考 **browser_visible** 即可。 |
| 44 | |
| 45 | --- |
| 46 | |
| 47 | ## 场景一:扫描本地 CDP 端口 |
| 48 | |
| 49 | 默认扫描端口范围 **9000–10000**: |
| 50 | |
| 51 | ```json |
| 52 | {"action": "list_cdp_targets"} |
| 53 | ``` |
| 54 | |
| 55 | 指定单个端口: |
| 56 | |
| 57 | ```json |
| 58 | {"action": "list_cdp_targets", "port": 9222} |
| 59 | ``` |
| 60 | |
| 61 | 自定义扫描范围: |
| 62 | |
| 63 | ```json |
| 64 | {"action": "list_cdp_targets", "port_min": 8000, "port_max": 12000} |
| 65 | ``` |
| 66 | |
| 67 | 适用场景: |
| 68 | |
| 69 | - 用户已经手动启动了带远程调试端口的 Chrome |
| 70 | - 你不知道具体端口,先扫描确认 |
| 71 | - 需要在连接前确认本机有哪些可附着目标 |
| 72 | |
| 73 | --- |
| 74 | |
| 75 | ## 场景二:连接已有 Chrome |
| 76 | |
| 77 | 连接已存在的 CDP 端点: |
| 78 | |
| 79 | ```json |
| 80 | {"action": "connect_cdp", "cdp_url": "http://localhost:9222"} |
| 81 | ``` |
| 82 | |
| 83 | 特点: |
| 84 | |
| 85 | - 连接成功后,可以继续使用 `open`、`snapshot`、`click`、`type` 等常规操作 |
| 86 | - 这是**附着到外部浏览器**,不是 QwenPaw 自己启动的新进程 |
| 87 | - `stop` 时只断开连接,**不会关闭外部浏览器** |
| 88 | - 当前也受 idle auto-stop 管理,但 external CDP 的 auto-stop 语义是“自动断开,不关闭外部浏览器” |
| 89 | |
| 90 | 适用场景: |
| 91 | |
| 92 | - 用户已经打开自己的 Chrome,并希望 agent 直接接管 |
| 93 | - 需要附着到用户已有登录态 / 已打开标签页 |
| 94 | |
| 95 | --- |
| 96 | |
| 97 | ## 场景三:显式指定 cdp_port 启动 |
| 98 | |
| 99 | 如果用户明确要求使用固定端口,或需要把端点提供给其他工具,可以在 `start` 时指定 `cdp_port`: |
| 100 | |
| 101 | ```json |
| 102 | {"action": "start", "cdp_port": 9222} |
| 103 | ``` |
| 104 | |
| 105 | 如需同时打开可见窗口: |
| 106 | |
| 107 | ```json |
| 108 | {"action": "start", "headed": true, "cdp_port": 9222} |
| 109 | ``` |
| 110 | |
| 111 | 当前行为说明: |
| 112 | |
| 113 | - 如果显式指定的 `cdp_port` 已被占用,会直接报错,不会强行复用 |
| 114 | - 如果不指定 `cdp_port`,默认会自动挑选空闲端口,通常可避免多 workspace 冲突 |
| 115 | - 自动挑空闲端口仍存在极小 race window:在“找到空闲端口”和“Chrome 真正绑定端口”之间理论上可能被别的进程抢占;当前失败时会清理并报错,但不会自动重试 |
| 116 | |
| 117 | 因此: |
| 118 | |
| 119 | - **用户没明确要求端口时,不要主动传 `cdp_port`** |
| 120 | - **用户明确要求固定端口 / 外部共享时,才显式传 `cdp_port`** |
| 121 | |
| 122 | --- |
| 123 | |
| 124 | ## 多 workspace 与端口占用 |
| 125 | |
| 126 | 当前多 workspace 下的端口策略是: |
| 127 | |
| 128 | - **显式指定端口**:先检测 `127.0.0.1:cdp_port` 是否已占用;若已占用则直接失败,提示用户换端口或先停止旧进程 |
| 129 | - **未显式指定端口**:通过自动选空闲端口来降低冲突概率 |
| 130 | |
| 131 | 这意味着: |
| 132 | |
| 133 | - 多个 workspace 同时使用默认启动,通常可以并存 |
| 134 | - 如果多个 workspace 都要求同一个固定 `cdp_port`,后启动的那个会因为端口已占用而失败 |
| 135 | |
| 136 | --- |
| 137 | |
| 138 | ## stop 行为 |
| 139 | |
| 140 | CDP 相关 stop 需要区分两类: |
| 141 | |
| 142 | ### 1. QwenPaw 自己启动的 managed CDP |
| 143 | |
| 144 | 例如: |
| 145 | |
| 146 | ```json |
| 147 | {"action": "start"} |
| 148 | ``` |
| 149 | |
| 150 | 或: |
| 151 | |
| 152 | ```json |
| 153 | {"action": "start", "cdp_port": 9222} |
| 154 | ``` |
| 155 | |
| 156 | 这类浏览器由 QwenPaw 自行启动并持有进程,`stop` 时会: |
| 157 | |
| 158 | - 断开 Playwright / CDP 连接 |
| 159 | - 关闭该浏览器进程 |
| 160 | |
| 161 | ### 2. 外部 CDP 浏览器 |
| 162 | |
| 163 | 例如: |
| 164 | |
| 165 | ```json |
| 166 | {"action": "connect_cdp", "cdp_url": "http://localhost:9222"} |
| 167 | ``` |
| 168 | |
| 169 | 这类浏览器不是 QwenPaw 启动的,`stop` 时只会: |
| 170 | |
| 171 | - 断开连接 |
| 172 | - **不会关闭外部浏览器进程** |
| 173 | |
| 174 | --- |
| 175 | |
| 176 | ## 与 browser_visible 的分工 |
| 177 | |
| 178 | - **browser_visible**:解决“是否显示窗口”“是否改走 private_mode” |
| 179 | - **browser_cdp**:解决“是否连接 / 暴露 / 指定 / 扫描 CDP 端口” |
| 180 | |
| 181 | 简单说: |
| 182 | |
| 183 | - 用户关心“看得见窗口” → 先想 browser_visible |
| 184 | - 用户关心“连接现有浏览器 / 指定调试端口 / 给别人共享” → 先想 browser_cdp |
| 185 | |
| 186 | --- |
| 187 | |
| 188 | ## 注意 |
| 189 | |
| 190 | - 默认 `start` 虽然底层使用 managed CDP,但这属于 tool 的内部默认实现,不代表每次都要把 CDP 概念暴露给用户 |
| 191 | - 使用显式 CDP 能力前,应提醒用户存在敏感数据暴露风险 |
| 192 | - external CDP 的 auto-stop 是“自动断开”,不是“自动关闭用户浏览器” |
| 193 | - 当前 activity 主要由 tool 操作刷新;用户手动在浏览器窗口中的本地交互,通常不会刷新 idle 计时 |
| 194 | - `private_mode` 是每次 `start` 的显式参数,不作为 workspace 持久状态保存 |