cdp-tunnel 1.0.13 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/extension-new/background.js +6 -1
  2. package/extension-new/cdp/handler/special.js +47 -27
  3. package/extension-new/core/state.js +64 -6
  4. package/extension-new/core/websocket.js +124 -19
  5. package/package.json +9 -2
  6. package/server/proxy-server.js +45 -34
  7. package/.github/workflows/publish.yml +0 -92
  8. package/.github/workflows/release-assets.yml +0 -50
  9. package/PUBLISH.md +0 -65
  10. package/console-test.js +0 -52
  11. package/docs/README_CN.md +0 -204
  12. package/docs/config-page-screenshot.png +0 -0
  13. package/final-console-test.js +0 -105
  14. package/simple-tab-group-test.js +0 -56
  15. package/test-cdp-connection.js +0 -85
  16. package/test-cdp-groups.js +0 -71
  17. package/test-check-newtab.js +0 -144
  18. package/test-chrome-native.js +0 -140
  19. package/test-client-connected.js +0 -99
  20. package/test-compare-formats.js +0 -88
  21. package/test-context-features.js +0 -113
  22. package/test-create-tab.js +0 -113
  23. package/test-debug-broadcast.js +0 -52
  24. package/test-debug-targets.js +0 -127
  25. package/test-expose-newtab.js +0 -164
  26. package/test-expose-shared.js +0 -189
  27. package/test-final-logs.js +0 -110
  28. package/test-fresh-chromium.js +0 -153
  29. package/test-init-script.js +0 -128
  30. package/test-keepalive.js +0 -89
  31. package/test-launch-chromium.js +0 -140
  32. package/test-launch-vs-connect.js +0 -149
  33. package/test-listen-events.js +0 -102
  34. package/test-monitor.js +0 -83
  35. package/test-multiple-cdp-groups.js +0 -78
  36. package/test-native.js +0 -96
  37. package/test-page-connection.js +0 -74
  38. package/test-playwright-connection.js +0 -45
  39. package/test-playwright-groups.js +0 -47
  40. package/test-playwright-pages.js +0 -47
  41. package/test-playwright-sequence.js +0 -81
  42. package/test-proper-context.js +0 -129
  43. package/test-real-final.js +0 -251
  44. package/test-real-scenario-v2.js +0 -166
  45. package/test-real-scenario-v3.js +0 -231
  46. package/test-real-scenario.js +0 -104
  47. package/test-server-logs.js +0 -98
  48. package/test-session-id.js +0 -91
  49. package/test-simple-cdp-groups.js +0 -44
  50. package/test-simple-context.js +0 -137
  51. package/test-tab-group-simple.js +0 -58
  52. package/test-tab-grouping.js +0 -48
  53. package/test-three-pages.js +0 -192
  54. package/test-wait-for-page.js +0 -95
  55. package/test-with-logs.js +0 -118
  56. package/test-ws-groups.js +0 -59
  57. package/tests/e2e-auto-test.js +0 -304
  58. package/tests/iframe-test-page.html +0 -89
  59. package/tests/playwright-demo.js +0 -45
  60. package/tests/playwright-interactive.js +0 -261
  61. package/tests/playwright-multi-demo.js +0 -60
  62. package/tests/playwright-multi.js +0 -85
  63. package/tests/playwright-single.js +0 -41
  64. package/tests/screenshot-config.js +0 -35
  65. package/tests/test-client.js +0 -89
  66. package/tests/test-douyin-iframe.js +0 -171
  67. package/tests/test-iframe-debug.js +0 -204
  68. package/tests/test-multi-client.js +0 -129
@@ -1,50 +0,0 @@
1
- name: Create Release Assets
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- jobs:
8
- build-assets:
9
- runs-on: ubuntu-latest
10
-
11
- steps:
12
- # 检出代码
13
- - name: Checkout code
14
- uses: actions/checkout@v4
15
-
16
- # 打包扩展
17
- - name: Pack extension
18
- run: |
19
- cd extension-new
20
- zip -r ../cdp-tunnel-extension.zip .
21
- cd ..
22
- ls -lh cdp-tunnel-extension.zip
23
-
24
- # 上传扩展到 Release
25
- - name: Upload extension to Release
26
- uses: actions/upload-release-asset@v1
27
- env:
28
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
- with:
30
- upload_url: ${{ github.event.release.upload_url }}
31
- asset_path: ./cdp-tunnel-extension.zip
32
- asset_name: cdp-tunnel-extension.zip
33
- asset_content_type: application/zip
34
-
35
- # 打包完整项目
36
- - name: Pack full project
37
- run: |
38
- zip -r cdp-tunnel-full.zip . -x "*.git*" -x "node_modules/*" -x "test/*"
39
- ls -lh cdp-tunnel-full.zip
40
-
41
- # 上传完整项目到 Release
42
- - name: Upload full project to Release
43
- uses: actions/upload-release-asset@v1
44
- env:
45
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
46
- with:
47
- upload_url: ${{ github.event.release.upload_url }}
48
- asset_path: ./cdp-tunnel-full.zip
49
- asset_name: cdp-tunnel-full.zip
50
- asset_content_type: application/zip
package/PUBLISH.md DELETED
@@ -1,65 +0,0 @@
1
- # 发布到 npm 指南
2
-
3
- ## 自动发布(推荐)
4
-
5
- 本项目已配置 GitHub Actions,支持自动发布到 npm。
6
-
7
- ### 配置步骤
8
-
9
- 1. **获取 npm Token**
10
- - 登录 [npmjs.com](https://www.npmjs.com/)
11
- - 进入 Account → Access Tokens
12
- - 生成新的 **Automation** token
13
- - 复制 token(以 `npm_` 开头)
14
-
15
- 2. **添加到 GitHub Secrets**
16
- - 打开 GitHub 仓库 → Settings → Secrets and variables → Actions
17
- - 点击 "New repository secret"
18
- - Name: `NPM_TOKEN`
19
- - Value: 刚才复制的 npm token
20
- - 点击 "Add secret"
21
-
22
- 3. **发布新版本**
23
- - 在 GitHub 上创建新的 Release
24
- - 设置版本号(如 v1.0.1)
25
- - 填写发布说明
26
- - 点击 "Publish release"
27
- - GitHub Actions 会自动发布到 npm
28
-
29
- ### 手动触发
30
-
31
- 也可以在 GitHub Actions 页面手动触发发布:
32
- - 进入 Actions → Publish to npm
33
- - 点击 "Run workflow"
34
-
35
- ## 手动发布
36
-
37
- 如果不想使用 GitHub Actions,也可以手动发布:
38
-
39
- ```bash
40
- # 1. 登录 npm
41
- npm login
42
-
43
- # 2. 更新版本号
44
- npm version patch # 或 minor / major
45
-
46
- # 3. 发布
47
- npm publish --access public
48
- ```
49
-
50
- ## 版本号规则
51
-
52
- - `patch`: 修复 bug(1.0.0 → 1.0.1)
53
- - `minor`: 新增功能(1.0.0 → 1.1.0)
54
- - `major`: 重大更新(1.0.0 → 2.0.0)
55
-
56
- ## 验证发布
57
-
58
- 发布后可以在 npm 上查看:
59
- https://www.npmjs.com/package/cdp-tunnel
60
-
61
- 安装测试:
62
- ```bash
63
- npm install -g cdp-tunnel
64
- cdp-tunnel --version
65
- ```
package/console-test.js DELETED
@@ -1,52 +0,0 @@
1
- // 测试标签分组功能的脚本
2
- // 复制到Chrome扩展的控制台中运行
3
-
4
- // 1. 测试查询现有标签组
5
- console.log('Testing tab group functionality...');
6
- chrome.tabGroups.query({ title: 'lo' }, function(groups) {
7
- console.log('Found tab groups:', groups);
8
-
9
- // 2. 测试创建新标签
10
- chrome.tabs.create({ url: 'https://www.baidu.com/', active: false }, function(tab) {
11
- console.log('Created tab:', tab);
12
-
13
- if (groups.length > 0) {
14
- // 添加到现有组
15
- console.log('Adding tab to existing group...');
16
- chrome.tabs.group({ tabIds: tab.id, groupId: groups[0].id }, function(groupId) {
17
- console.log('Added tab to group:', groupId);
18
- });
19
- } else {
20
- // 创建新组并添加标签页
21
- console.log('Creating new group and adding tab...');
22
- chrome.tabs.group({ tabIds: tab.id }, function(groupId) {
23
- console.log('Created group:', groupId);
24
- // 更新组的标题和颜色
25
- if (groupId) {
26
- chrome.tabGroups.update(groupId, {
27
- title: 'lo',
28
- color: 'blue'
29
- }, function(group) {
30
- console.log('Updated group:', group);
31
- });
32
- }
33
- });
34
- }
35
- });
36
- });
37
-
38
- // 3. 测试现有标签的分组
39
- chrome.tabs.query({ active: true }, function(tabs) {
40
- if (tabs.length > 0) {
41
- console.log('Current active tab:', tabs[0]);
42
-
43
- chrome.tabGroups.query({ title: 'lo' }, function(groups) {
44
- if (groups.length > 0) {
45
- console.log('Adding current tab to group...');
46
- chrome.tabs.group({ tabIds: tabs[0].id, groupId: groups[0].id }, function(groupId) {
47
- console.log('Added current tab to group:', groupId);
48
- });
49
- }
50
- });
51
- }
52
- });
package/docs/README_CN.md DELETED
@@ -1,204 +0,0 @@
1
- # CDP Tunnel
2
-
3
- <p align="center">
4
- <img src="../extension-new/icons/icon128.png" alt="CDP Tunnel Logo" width="128" height="128">
5
- </p>
6
-
7
- <p align="center">
8
- <strong>Chrome DevTools Protocol 桥接器</strong>
9
- </p>
10
-
11
- <p align="center">
12
- Chrome 扩展,将浏览器暴露为 CDP 端点,<br>
13
- 支持多个 Playwright/Puppeteer 客户端同时连接和控制。
14
- </p>
15
-
16
- <p align="center">
17
- <a href="../README.md">English</a> |
18
- <a href="https://github.com/dyyz1993/cdp-tunnel">GitHub</a>
19
- </p>
20
-
21
- <p align="center">
22
- <img src="https://img.shields.io/github/stars/dyyz1993/cdp-tunnel?style=social" alt="GitHub stars">
23
- <img src="https://img.shields.io/github/forks/dyyz1993/cdp-tunnel?style=social" alt="GitHub forks">
24
- <img src="https://img.shields.io/github/watchers/dyyz1993/cdp-tunnel?style=social" alt="GitHub watchers">
25
- </p>
26
-
27
- ---
28
-
29
- ## 架构
30
-
31
- ```
32
- ┌─────────────────────────────────────────────────────────────────┐
33
- │ 代理服务器 │
34
- │ (localhost:9221) │
35
- │ │
36
- │ /plugin ←─── Chrome 扩展 (WebSocket) │
37
- │ HTTP ←─── Playwright/Puppeteer 客户端 │
38
- └─────────────────────────────────────────────────────────────────┘
39
- ↑ ↑ ↑
40
- │ │ │
41
- Client 1 Client 2 Client 3
42
- (clientId_1) (clientId_2) (clientId_3)
43
- ```
44
-
45
- ## 功能特性
46
-
47
- - **多客户端支持** - 多个 Playwright/Puppeteer 可同时连接
48
- - **消息隔离** - 每个客户端创建的页面归该客户端所有
49
- - **配置页面** - 可视化查看连接状态、客户端列表、受控页面
50
- - **自动重连** - 扩展断开后自动重连服务器
51
-
52
- ## 截图
53
-
54
- ![配置页面](config-page-screenshot.png)
55
-
56
- ## 快速开始
57
-
58
- ### 方式一:npm 全局安装(推荐)
59
-
60
- ```bash
61
- # 全局安装
62
- npm install -g cdp-tunnel
63
-
64
- # 启动服务器
65
- cdp-tunnel start
66
-
67
- # 查看状态
68
- cdp-tunnel status
69
-
70
- # 安装 Chrome 扩展(打开交互式安装向导)
71
- cdp-tunnel extension
72
- ```
73
-
74
- ### 方式二:从 GitHub Releases 下载
75
-
76
- 1. 访问 [GitHub Releases](https://github.com/dyyz1993/cdp-tunnel/releases)
77
- 2. 下载最新版本的 `cdp-tunnel-extension.zip`
78
- 3. 解压文件
79
- 4. 打开 Chrome 扩展页面 `chrome://extensions/`
80
- 5. 开启「开发者模式」
81
- 6. 点击「加载已解压的扩展程序」
82
- 7. 选择解压后的扩展目录
83
-
84
- ### 方式三:手动安装
85
-
86
- #### 1. 启动代理服务器
87
-
88
- ```bash
89
- cd server
90
- npm install
91
- node proxy-server.js
92
- ```
93
-
94
- 服务器将在 `localhost:9221` 启动。
95
-
96
- #### 2. 安装 Chrome 扩展
97
-
98
- 1. 打开 `chrome://extensions/`
99
- 2. 开启「开发者模式」
100
- 3. 点击「加载已解压的扩展程序」
101
- 4. 选择 `extension-new` 目录
102
-
103
- #### 3. 连接扩展
104
-
105
- 点击扩展图标,在配置页面输入服务器地址,点击「保存并连接」。
106
-
107
- ### 客户端连接
108
-
109
- ```javascript
110
- // Playwright
111
- const { chromium } = require('playwright');
112
-
113
- const browser = await chromium.connectOverCDP('http://localhost:9221');
114
- const context = browser.contexts()[0];
115
- const page = await context.newPage();
116
- await page.goto('https://example.com');
117
-
118
- // Puppeteer
119
- const puppeteer = require('puppeteer');
120
-
121
- const browser = await puppeteer.connect({
122
- browserWSEndpoint: 'ws://localhost:9221'
123
- });
124
- const page = await browser.newPage();
125
- await page.goto('https://example.com');
126
- ```
127
-
128
- ## 多客户端使用
129
-
130
- 所有客户端连接同一个端点 `http://localhost:9221`,服务器自动为每个连接分配唯一的 `clientId`。
131
-
132
- ```javascript
133
- // 多个客户端可以同时连接
134
- const browser1 = await chromium.connectOverCDP('http://localhost:9221');
135
- const browser2 = await chromium.connectOverCDP('http://localhost:9221');
136
- const browser3 = await chromium.connectOverCDP('http://localhost:9221');
137
-
138
- // 每个客户端创建的页面互不干扰
139
- const page1 = await browser1.contexts()[0].newPage();
140
- const page2 = await browser2.contexts()[0].newPage();
141
- const page3 = await browser3.contexts()[0].newPage();
142
- ```
143
-
144
- ## 配置页面
145
-
146
- 点击扩展图标打开配置页面,可以查看:
147
-
148
- - **CDP 客户端列表** - 显示连接的 Playwright/Puppeteer 客户端
149
- - **受控页面列表** - 显示被控制的页面,支持点击跳转
150
- - **活动日志** - 连接状态变化记录
151
-
152
- ## 项目结构
153
-
154
- ```
155
- cdp-tunnel/
156
- ├── server/
157
- │ └── proxy-server.js # 代理服务器
158
- ├── extension-new/
159
- │ ├── background.js # 扩展 Service Worker
160
- │ ├── config-page-preview.html # 配置页面
161
- │ ├── config-page.js # 配置页面脚本
162
- │ ├── core/
163
- │ │ ├── state.js # 状态管理
164
- │ │ └── websocket.js # WebSocket 连接管理
165
- │ └── features/
166
- │ ├── cdp-router.js # CDP 消息路由
167
- │ └── screencast.js # 截图功能
168
- └── tests/
169
- ├── playwright-single.js # 单客户端测试
170
- ├── playwright-multi.js # 多客户端测试
171
- └── playwright-interactive.js # 交互式测试
172
- ```
173
-
174
- ## 测试
175
-
176
- ```bash
177
- # 单客户端测试
178
- node tests/playwright-single.js
179
-
180
- # 多客户端测试
181
- node tests/playwright-multi.js
182
-
183
- # 交互式测试
184
- node tests/playwright-interactive.js
185
- ```
186
-
187
- ## 注意事项
188
-
189
- 1. **端口占用** - 确保 9221 端口未被占用
190
- 2. **扩展权限** - 扩展需要 `debugger`、`tabs` 等权限
191
- 3. **浏览器限制** - 同一浏览器只能被一个扩展通过 debugger 控制
192
-
193
- ## 许可证
194
-
195
- 本项目采用 Apache License 2.0 协议,并附加署名要求。
196
-
197
- 详见 [LICENSE](../LICENSE)。
198
-
199
- ---
200
-
201
- 如果你在工作中使用了本项目,请注明来源:
202
- - 项目:CDP Tunnel
203
- - 作者:dyyz1993
204
- - 来源:https://github.com/dyyz1993/cdp-tunnel
Binary file
@@ -1,105 +0,0 @@
1
- // 完整的标签分组测试脚本
2
- // 复制到Chrome扩展的控制台中运行
3
-
4
- console.log('=== 开始测试标签分组功能 ===');
5
-
6
- // 1. 测试1:创建新标签并添加到lo组
7
- function test1_CreateTabAndAddToGroup() {
8
- console.log('\n=== 测试1:创建新标签并添加到lo组 ===');
9
-
10
- // 先查询是否存在lo组
11
- chrome.tabGroups.query({ title: 'lo' }, function(groups) {
12
- console.log('找到的标签组:', groups);
13
-
14
- // 创建新标签页
15
- chrome.tabs.create({ url: 'https://www.baidu.com/', active: false }, function(tab) {
16
- console.log('创建的标签页:', tab);
17
-
18
- if (groups.length > 0) {
19
- // 如果存在lo组,直接添加
20
- console.log('将标签页添加到现有lo组');
21
- chrome.tabs.group({ tabIds: tab.id, groupId: groups[0].id }, function(groupId) {
22
- console.log('标签页已添加到组:', groupId);
23
- test2_AddExistingTabToGroup();
24
- });
25
- } else {
26
- // 如果不存在lo组,创建新组
27
- console.log('创建新的lo组并添加标签页');
28
- chrome.tabs.group({ tabIds: tab.id }, function(groupId) {
29
- console.log('创建的组ID:', groupId);
30
- // 更新组的标题和颜色
31
- chrome.tabGroups.update(groupId, {
32
- title: 'lo',
33
- color: 'blue'
34
- }, function(group) {
35
- console.log('更新后的组:', group);
36
- test2_AddExistingTabToGroup();
37
- });
38
- });
39
- }
40
- });
41
- });
42
- }
43
-
44
- // 2. 测试2:将现有标签添加到lo组
45
- function test2_AddExistingTabToGroup() {
46
- console.log('\n=== 测试2:将现有标签添加到lo组 ===');
47
-
48
- // 获取当前活动标签
49
- chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
50
- if (tabs.length > 0) {
51
- var activeTab = tabs[0];
52
- console.log('当前活动标签:', activeTab);
53
-
54
- // 查询lo组
55
- chrome.tabGroups.query({ title: 'lo' }, function(groups) {
56
- if (groups.length > 0) {
57
- console.log('将当前标签添加到lo组');
58
- chrome.tabs.group({ tabIds: activeTab.id, groupId: groups[0].id }, function(groupId) {
59
- console.log('当前标签已添加到组:', groupId);
60
- test3_VerifyGroupMembers();
61
- });
62
- } else {
63
- console.log('未找到lo组');
64
- test3_VerifyGroupMembers();
65
- }
66
- });
67
- } else {
68
- console.log('未找到活动标签');
69
- test3_VerifyGroupMembers();
70
- }
71
- });
72
- }
73
-
74
- // 3. 测试3:验证lo组的成员
75
- function test3_VerifyGroupMembers() {
76
- console.log('\n=== 测试3:验证lo组的成员 ===');
77
-
78
- // 查询lo组
79
- chrome.tabGroups.query({ title: 'lo' }, function(groups) {
80
- if (groups.length > 0) {
81
- var loGroup = groups[0];
82
- console.log('lo组信息:', loGroup);
83
-
84
- // 查询组内的标签
85
- chrome.tabs.query({ groupId: loGroup.id }, function(tabs) {
86
- console.log('lo组内的标签:', tabs);
87
- console.log('lo组内标签数量:', tabs.length);
88
-
89
- // 打印每个标签的信息
90
- tabs.forEach(function(tab, index) {
91
- console.log('标签', index + 1, ':', tab.title, '-', tab.url);
92
- });
93
-
94
- console.log('\n=== 测试完成 ===');
95
- console.log('请检查Chrome浏览器中的标签组是否正确创建,并且标签页是否被正确添加到组中。');
96
- });
97
- } else {
98
- console.log('未找到lo组');
99
- console.log('\n=== 测试完成 ===');
100
- }
101
- });
102
- }
103
-
104
- // 开始执行测试
105
- test1_CreateTabAndAddToGroup();
@@ -1,56 +0,0 @@
1
- // 最简单的标签组测试脚本
2
- // 复制到Chrome扩展的控制台中运行
3
-
4
- console.log('=== 最简单的标签组测试 ===');
5
-
6
- // 步骤1: 检查API是否可用
7
- console.log('步骤1: 检查API是否可用');
8
- console.log('chrome.tabs.group:', typeof chrome.tabs.group);
9
- console.log('chrome.tabGroups:', chrome.tabGroups);
10
- console.log('chrome.tabGroups.query:', typeof chrome.tabGroups.query);
11
- console.log('chrome.tabGroups.update:', typeof chrome.tabGroups.update);
12
-
13
- // 步骤2: 创建一个标签页
14
- console.log('\n步骤2: 创建一个标签页');
15
- chrome.tabs.create({ url: 'https://www.baidu.com/', active: false }, function(tab) {
16
- console.log('标签页创建成功:', tab.id);
17
-
18
- // 步骤3: 等待5秒
19
- console.log('\n步骤3: 等待5秒...');
20
- setTimeout(function() {
21
- console.log('等待完成,开始创建标签组...');
22
-
23
- // 步骤4: 创建标签组
24
- console.log('\n步骤4: 创建标签组');
25
- chrome.tabs.group({ tabIds: tab.id }, function(groupId) {
26
- if (chrome.runtime.lastError) {
27
- console.error('创建标签组失败:', chrome.runtime.lastError.message);
28
- return;
29
- }
30
-
31
- console.log('标签组创建成功,组ID:', groupId);
32
-
33
- // 步骤5: 更新标签组
34
- console.log('\n步骤5: 更新标签组');
35
- chrome.tabGroups.update(groupId, {
36
- title: 'Test',
37
- color: 'blue'
38
- }, function(group) {
39
- if (chrome.runtime.lastError) {
40
- console.error('更新标签组失败:', chrome.runtime.lastError.message);
41
- return;
42
- }
43
-
44
- console.log('标签组更新成功:', group);
45
-
46
- // 步骤6: 查询所有标签组
47
- console.log('\n步骤6: 查询所有标签组');
48
- chrome.tabGroups.query({}, function(groups) {
49
- console.log('所有标签组:', groups);
50
- console.log('\n=== 测试完成 ===');
51
- console.log('请检查Chrome浏览器中是否有一个名为"Test"的蓝色标签组');
52
- });
53
- });
54
- });
55
- }, 5000);
56
- });
@@ -1,85 +0,0 @@
1
- const WebSocket = require('ws');
2
-
3
- const SERVER_URL = 'ws://localhost:9221/client';
4
-
5
- console.log('[Test] Connecting to CDP proxy server...');
6
-
7
- const ws = new WebSocket(SERVER_URL);
8
-
9
- ws.on('open', () => {
10
- console.log('[Test] Connected to server!');
11
-
12
- ws.send(JSON.stringify({
13
- id: 1,
14
- method: 'Target.setDiscoverTargets',
15
- params: { discover: true }
16
- }));
17
-
18
- console.log('[Test] Sent Target.setDiscoverTargets');
19
-
20
- setTimeout(() => {
21
- ws.send(JSON.stringify({
22
- id: 2,
23
- method: 'Target.getTargets',
24
- params: {}
25
- }));
26
- console.log('[Test] Sent Target.getTargets');
27
- }, 1000);
28
-
29
- setTimeout(() => {
30
- console.log('[Test] Creating new page...');
31
- ws.send(JSON.stringify({
32
- id: 3,
33
- method: 'Target.createTarget',
34
- params: { url: 'https://www.example.com' }
35
- }));
36
- }, 2000);
37
- });
38
-
39
- ws.on('message', (data) => {
40
- try {
41
- const msg = JSON.parse(data.toString());
42
-
43
- if (msg.type === 'connected') {
44
- console.log('[Test] Server acknowledged connection:', msg);
45
- } else if (msg.method && msg.method.startsWith('Target.')) {
46
- console.log('[Test] Target event:', msg.method, {
47
- targetId: msg.params?.targetInfo?.targetId?.substring(0, 8),
48
- url: msg.params?.targetInfo?.url,
49
- type: msg.params?.targetInfo?.type
50
- });
51
- } else if (msg.id) {
52
- console.log('[Test] Response to request #' + msg.id + ':', {
53
- success: !!msg.result,
54
- error: msg.error,
55
- targetId: msg.result?.targetId?.substring(0, 8),
56
- targetCount: msg.result?.targetInfos?.length
57
- });
58
-
59
- if (msg.result?.targetInfos) {
60
- console.log('[Test] Found targets:');
61
- msg.result.targetInfos.slice(0, 5).forEach((t, i) => {
62
- console.log(` ${i + 1}. ${t.type}: ${t.url?.substring(0, 50)}`);
63
- });
64
- }
65
- } else {
66
- console.log('[Test] Other message:', msg.type || msg.method);
67
- }
68
- } catch (e) {
69
- console.log('[Test] Raw message:', data.toString().substring(0, 100));
70
- }
71
- });
72
-
73
- ws.on('close', (code, reason) => {
74
- console.log('[Test] Connection closed:', code, reason.toString());
75
- });
76
-
77
- ws.on('error', (err) => {
78
- console.error('[Test] Error:', err.message);
79
- });
80
-
81
- setTimeout(() => {
82
- console.log('\n[Test] Test completed, closing connection...');
83
- ws.close();
84
- process.exit(0);
85
- }, 5000);
@@ -1,71 +0,0 @@
1
- const WebSocket = require('ws');
2
-
3
- async function testCDPGroups() {
4
- console.log('=== 测试CDP连接的标签分组功能 ===\n');
5
-
6
- try {
7
- // 连接到CDP服务器
8
- console.log('连接到CDP服务器...');
9
- const ws = new WebSocket('ws://localhost:9221/client');
10
-
11
- ws.on('open', async function() {
12
- console.log('CDP连接成功');
13
-
14
- // 创建第一个标签页
15
- console.log('创建第一个标签页...');
16
- ws.send(JSON.stringify({
17
- id: 1,
18
- method: 'Target.createTarget',
19
- params: {
20
- url: 'https://www.baidu.com/'
21
- }
22
- }));
23
-
24
- // 等待5秒
25
- await new Promise(resolve => setTimeout(resolve, 5000));
26
-
27
- // 创建第二个标签页
28
- console.log('创建第二个标签页...');
29
- ws.send(JSON.stringify({
30
- id: 2,
31
- method: 'Target.createTarget',
32
- params: {
33
- url: 'https://www.google.com/'
34
- }
35
- }));
36
-
37
- // 等待5秒
38
- await new Promise(resolve => setTimeout(resolve, 5000));
39
-
40
- console.log('\n=== 测试完成 ===');
41
- console.log('请检查Chrome浏览器中的标签组:');
42
- console.log('1. 应该创建了一个名为"CDP-{客户端ID}"的标签组');
43
- console.log('2. 两个标签页应该被添加到该组中');
44
-
45
- // 关闭连接
46
- ws.close();
47
- });
48
-
49
- ws.on('message', function(data) {
50
- try {
51
- const message = JSON.parse(data);
52
- console.log('收到消息:', message);
53
- } catch (e) {
54
- console.error('解析消息失败:', e);
55
- }
56
- });
57
-
58
- ws.on('error', function(error) {
59
- console.error('WebSocket错误:', error);
60
- });
61
-
62
- ws.on('close', function() {
63
- console.log('WebSocket连接已关闭');
64
- });
65
-
66
- } catch (error) {
67
- console.error('测试过程中出现错误:', error);
68
- }
69
- }
70
-
71
- testCDPGroups();