cdp-tunnel 1.0.13 → 1.0.15

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 (69) hide show
  1. package/cli/index.js +65 -0
  2. package/extension-new/background.js +6 -1
  3. package/extension-new/cdp/handler/special.js +47 -27
  4. package/extension-new/core/state.js +64 -6
  5. package/extension-new/core/websocket.js +124 -19
  6. package/package.json +9 -2
  7. package/server/proxy-server.js +45 -34
  8. package/.github/workflows/publish.yml +0 -92
  9. package/.github/workflows/release-assets.yml +0 -50
  10. package/PUBLISH.md +0 -65
  11. package/console-test.js +0 -52
  12. package/docs/README_CN.md +0 -204
  13. package/docs/config-page-screenshot.png +0 -0
  14. package/final-console-test.js +0 -105
  15. package/simple-tab-group-test.js +0 -56
  16. package/test-cdp-connection.js +0 -85
  17. package/test-cdp-groups.js +0 -71
  18. package/test-check-newtab.js +0 -144
  19. package/test-chrome-native.js +0 -140
  20. package/test-client-connected.js +0 -99
  21. package/test-compare-formats.js +0 -88
  22. package/test-context-features.js +0 -113
  23. package/test-create-tab.js +0 -113
  24. package/test-debug-broadcast.js +0 -52
  25. package/test-debug-targets.js +0 -127
  26. package/test-expose-newtab.js +0 -164
  27. package/test-expose-shared.js +0 -189
  28. package/test-final-logs.js +0 -110
  29. package/test-fresh-chromium.js +0 -153
  30. package/test-init-script.js +0 -128
  31. package/test-keepalive.js +0 -89
  32. package/test-launch-chromium.js +0 -140
  33. package/test-launch-vs-connect.js +0 -149
  34. package/test-listen-events.js +0 -102
  35. package/test-monitor.js +0 -83
  36. package/test-multiple-cdp-groups.js +0 -78
  37. package/test-native.js +0 -96
  38. package/test-page-connection.js +0 -74
  39. package/test-playwright-connection.js +0 -45
  40. package/test-playwright-groups.js +0 -47
  41. package/test-playwright-pages.js +0 -47
  42. package/test-playwright-sequence.js +0 -81
  43. package/test-proper-context.js +0 -129
  44. package/test-real-final.js +0 -251
  45. package/test-real-scenario-v2.js +0 -166
  46. package/test-real-scenario-v3.js +0 -231
  47. package/test-real-scenario.js +0 -104
  48. package/test-server-logs.js +0 -98
  49. package/test-session-id.js +0 -91
  50. package/test-simple-cdp-groups.js +0 -44
  51. package/test-simple-context.js +0 -137
  52. package/test-tab-group-simple.js +0 -58
  53. package/test-tab-grouping.js +0 -48
  54. package/test-three-pages.js +0 -192
  55. package/test-wait-for-page.js +0 -95
  56. package/test-with-logs.js +0 -118
  57. package/test-ws-groups.js +0 -59
  58. package/tests/e2e-auto-test.js +0 -304
  59. package/tests/iframe-test-page.html +0 -89
  60. package/tests/playwright-demo.js +0 -45
  61. package/tests/playwright-interactive.js +0 -261
  62. package/tests/playwright-multi-demo.js +0 -60
  63. package/tests/playwright-multi.js +0 -85
  64. package/tests/playwright-single.js +0 -41
  65. package/tests/screenshot-config.js +0 -35
  66. package/tests/test-client.js +0 -89
  67. package/tests/test-douyin-iframe.js +0 -171
  68. package/tests/test-iframe-debug.js +0 -204
  69. package/tests/test-multi-client.js +0 -129
@@ -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();
@@ -1,144 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const { spawn } = require('child_process');
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- let serverPort = 8900;
7
-
8
- async function testExposeFunctionNewTab(port, label) {
9
- serverPort++;
10
- const currentPort = serverPort;
11
-
12
- console.log(`\n${'='.repeat(60)}`);
13
- console.log(`Testing ${label} (port ${port})`);
14
- console.log('='.repeat(60));
15
-
16
- try {
17
- const sharedState = { counter: 0 };
18
-
19
- const htmlContent1 = `
20
- <!DOCTYPE html>
21
- <html>
22
- <head><title>Page 1</title></head>
23
- <body>
24
- <h1>Page 1</h1>
25
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
26
- </body>
27
- </html>
28
- `;
29
-
30
- const htmlContent2 = `
31
- <!DOCTYPE html>
32
- <html>
33
- <head><title>Page 2</title></head>
34
- <body>
35
- <h1>Page 2 - New Tab</h1>
36
- </body>
37
- </html>
38
- `;
39
-
40
- const serverDir = '/tmp/test-expose-newtab2';
41
- if (!fs.existsSync(serverDir)) {
42
- fs.mkdirSync(serverDir, { recursive: true });
43
- }
44
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
45
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
46
-
47
- const http = require('http');
48
- const server = http.createServer((req, res) => {
49
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
50
- if (fs.existsSync(filePath)) {
51
- const content = fs.readFileSync(filePath);
52
- res.writeHead(200, { 'Content-Type': 'text/html' });
53
- res.end(content);
54
- } else {
55
- res.writeHead(404);
56
- res.end('Not found');
57
- }
58
- });
59
-
60
- await new Promise(resolve => server.listen(currentPort, resolve));
61
- console.log(`[${label}] Test server on port ${currentPort}`);
62
-
63
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
64
- console.log(`[${label}] Connected!`);
65
-
66
- console.log(`[${label}] Creating context...`);
67
- const context = await browser.newContext();
68
-
69
- console.log(`[${label}] exposeFunction getCounter...`);
70
- await context.exposeFunction('getCounter', () => {
71
- sharedState.counter += 1;
72
- console.log(`[${label}] getCounter: ${sharedState.counter}`);
73
- return sharedState.counter;
74
- });
75
-
76
- console.log(`[${label}] Creating first page...`);
77
- const page1 = await context.newPage();
78
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
79
-
80
- console.log(`[${label}] Testing first page...`);
81
- const r1 = await page1.evaluate(() => window.getCounter());
82
- console.log(`[${label}] First page: ${r1}`);
83
-
84
- console.log(`[${label}] Clicking link...`);
85
- await page1.click('#link1');
86
-
87
- console.log(`[${label}] Waiting 3 seconds for new tab...`);
88
- await new Promise(r => setTimeout(r, 3000));
89
-
90
- console.log(`[${label}] Checking pages in context...`);
91
- const allPages = context.pages();
92
- console.log(`[${label}] Total pages: ${allPages.length}`);
93
- for (let i = 0; i < allPages.length; i++) {
94
- const p = allPages[i];
95
- console.log(`[${label}] Page ${i}: ${p.url()}`);
96
- }
97
-
98
- if (allPages.length >= 2) {
99
- const page2 = allPages[1];
100
- console.log(`[${label}] Testing new tab...`);
101
- try {
102
- const r2 = await page2.evaluate(() => window.getCounter());
103
- console.log(`[${label}] New tab: ${r2}`);
104
- } catch (e) {
105
- console.log(`[${label}] New tab error: ${e.message}`);
106
- }
107
- } else {
108
- console.log(`[${label}] No new tab found!`);
109
- }
110
-
111
- server.close();
112
- await browser.close();
113
-
114
- } catch (error) {
115
- console.error(`[${label}] Error:`, error.message);
116
- }
117
- }
118
-
119
- async function main() {
120
- console.log('Testing: Click link -> Check if new tab appears\n');
121
-
122
- console.log('Step 1: Native CDP...');
123
- const p1 = spawn('/Applications/Chromium.app/Contents/MacOS/Chromium', [
124
- '--remote-debugging-port=9231',
125
- '--user-data-dir=/tmp/chromium-test-nt1',
126
- '--no-first-run',
127
- '--no-default-browser-check'
128
- ], { detached: true, stdio: 'ignore' });
129
- await new Promise(r => setTimeout(r, 3000));
130
-
131
- await testExposeFunctionNewTab(9231, 'Native CDP');
132
-
133
- await new Promise(r => setTimeout(r, 1000));
134
- try { process.kill(-p1.pid); } catch(e) {}
135
-
136
- console.log('\n' + '='.repeat(60));
137
- console.log('Step 2: CDP Tunnel...');
138
-
139
- await testExposeFunctionNewTab(9221, 'CDP Tunnel');
140
-
141
- process.exit(0);
142
- }
143
-
144
- main();
@@ -1,140 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const fs = require('fs');
3
- const path = require('path');
4
-
5
- let serverPort = 9200;
6
-
7
- async function testWithChrome(label) {
8
- serverPort++;
9
- const currentPort = serverPort;
10
-
11
- console.log(`\n${'='.repeat(60)}`);
12
- console.log(`Testing ${label} - Using local Google Chrome`);
13
- console.log('='.repeat(60));
14
-
15
- try {
16
- const sharedState = { counter: 0 };
17
-
18
- const htmlContent1 = `
19
- <!DOCTYPE html>
20
- <html>
21
- <head><title>Page 1</title></head>
22
- <body>
23
- <h1>Page 1</h1>
24
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
25
- </body>
26
- </html>
27
- `;
28
-
29
- const htmlContent2 = `
30
- <!DOCTYPE html>
31
- <html>
32
- <head><title>Page 2</title></head>
33
- <body>
34
- <h1>Page 2 - New Tab</h1>
35
- </body>
36
- </html>
37
- `;
38
-
39
- const serverDir = '/tmp/test-chrome-native';
40
- if (!fs.existsSync(serverDir)) {
41
- fs.mkdirSync(serverDir, { recursive: true });
42
- }
43
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
44
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
45
-
46
- const http = require('http');
47
- const server = http.createServer((req, res) => {
48
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
49
- if (fs.existsSync(filePath)) {
50
- const content = fs.readFileSync(filePath);
51
- res.writeHead(200, { 'Content-Type': 'text/html' });
52
- res.end(content);
53
- } else {
54
- res.writeHead(404);
55
- res.end('Not found');
56
- }
57
- });
58
-
59
- await new Promise(resolve => server.listen(currentPort, resolve));
60
- console.log(`[${label}] Server on port ${currentPort}`);
61
-
62
- console.log(`[${label}] Launching Google Chrome...`);
63
- const browser = await chromium.launch({
64
- executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
65
- headless: false
66
- });
67
-
68
- console.log(`[${label}] Launched!`);
69
-
70
- console.log(`[${label}] Creating context...`);
71
- const context = await browser.newContext();
72
-
73
- console.log(`[${label}] exposeFunction getCounter...`);
74
- await context.exposeFunction('getCounter', () => {
75
- sharedState.counter += 1;
76
- console.log(`[${label}] getCounter: ${sharedState.counter}`);
77
- return sharedState.counter;
78
- });
79
-
80
- console.log(`[${label}] Creating first page...`);
81
- const page1 = await context.newPage();
82
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
83
-
84
- console.log(`[${label}] Testing first page...`);
85
- const r1 = await page1.evaluate(() => window.getCounter());
86
- console.log(`[${label}] First page: ${r1}`);
87
-
88
- console.log(`[${label}] Clicking link...`);
89
- await page1.click('#link1');
90
-
91
- console.log(`[${label}] Waiting 3 seconds...`);
92
- await new Promise(r => setTimeout(r, 3000));
93
-
94
- console.log(`[${label}] Checking pages...`);
95
- const allPages = context.pages();
96
- console.log(`[${label}] Total pages: ${allPages.length}`);
97
- for (let i = 0; i < allPages.length; i++) {
98
- console.log(`[${label}] Page ${i}: ${allPages[i].url()}`);
99
- }
100
-
101
- if (allPages.length >= 2) {
102
- console.log(`[${label}] Testing new tab...`);
103
- const page2 = allPages[1];
104
- const r2 = await page2.evaluate(() => window.getCounter());
105
- console.log(`[${label}] New tab: ${r2}`);
106
-
107
- console.log(`[${label}] First page again...`);
108
- const r1a = await page1.evaluate(() => window.getCounter());
109
- console.log(`[${label}] First page again: ${r1a}`);
110
-
111
- console.log(`[${label}] New tab again...`);
112
- const r2a = await page2.evaluate(() => window.getCounter());
113
- console.log(`[${label}] New tab again: ${r2a}`);
114
-
115
- const success = r1 === 1 && r2 === 2 && r1a === 3 && r2a === 4;
116
- if (success) {
117
- console.log(`[${label}] ✓ PASS! Counter: 1 -> 2 -> 3 -> 4`);
118
- } else {
119
- console.log(`[${label}] ✗ FAIL! Expected: 1,2,3,4 Got: ${r1},${r2},${r1a},${r2a}`);
120
- }
121
- } else {
122
- console.log(`[${label}] ✗ No new tab found!`);
123
- }
124
-
125
- server.close();
126
- await browser.close();
127
-
128
- } catch (error) {
129
- console.error(`[${label}] Error:`, error.message);
130
- console.error(error.stack);
131
- }
132
- }
133
-
134
- async function main() {
135
- console.log('Testing with local Google Chrome\n');
136
- await testWithChrome('Native Chrome');
137
- process.exit(0);
138
- }
139
-
140
- main();
@@ -1,99 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const fs = require('fs');
3
- const path = require('path');
4
- const http = require('http');
5
-
6
- let serverPort = 9600;
7
-
8
- async function testWithLogs(label, port) {
9
- serverPort++;
10
- const currentPort = serverPort;
11
-
12
- console.log(`Testing ${label} (port ${port})`);
13
-
14
- const htmlContent1 = `
15
- <!DOCTYPE html>
16
- <html>
17
- <head><title>Page 1</title></head>
18
- <body>
19
- <h1>Page 1 - Click the link below</h1>
20
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
21
- </body>
22
- </html>
23
- `;
24
-
25
- const htmlContent2 = `
26
- <!DOCTYPE html>
27
- <html>
28
- <head><title>Page 2</title></head>
29
- <body>
30
- <h1>Page 2 - New Tab Opened!</h1>
31
- </body>
32
- </html>
33
- `;
34
-
35
- const serverDir = '/tmp/test-logs3';
36
- if (!fs.existsSync(serverDir)) {
37
- fs.mkdirSync(serverDir, { recursive: true });
38
- }
39
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
40
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
41
-
42
- const server = http.createServer((req, res) => {
43
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
44
- if (fs.existsSync(filePath)) {
45
- const content = fs.readFileSync(filePath);
46
- res.writeHead(200, { 'Content-Type': 'text/html' });
47
- res.end(content);
48
- } else {
49
- res.writeHead(404);
50
- res.end('Not found');
51
- }
52
- });
53
-
54
- await new Promise(resolve => server.listen(currentPort, resolve));
55
-
56
- console.log('\n=== STEP 1: Connecting to CDP Tunnel ===');
57
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
58
- console.log('Connected! Now check extension logs for "client-connected" message');
59
-
60
- console.log('\n=== STEP 2: Waiting 3 seconds ===');
61
- await new Promise(r => setTimeout(r, 3000));
62
-
63
- console.log('\n=== STEP 3: Creating context ===');
64
- const context = await browser.newContext();
65
-
66
- console.log('\n=== STEP 4: Creating first page ===');
67
- const page1 = await context.newPage();
68
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
69
- console.log(`Page loaded: ${page1.url()}`);
70
-
71
- console.log('\n=== STEP 5: Click the link NOW ===');
72
- console.log('>>> Check extension logs for: [WS] Client connected <<<');
73
- await page1.click('#link1');
74
-
75
- console.log('\n=== STEP 6: Waiting 5 seconds ===');
76
- await new Promise(r => setTimeout(r, 5000));
77
-
78
- console.log('\n=== RESULTS ===');
79
- const allPages = context.pages();
80
- console.log(`Pages: ${allPages.length}`);
81
-
82
- server.close();
83
- await browser.close();
84
- }
85
-
86
- async function main() {
87
- console.log('=== Debug Test - Check "client-connected" message ===\n');
88
- console.log('INSTRUCTIONS:');
89
- console.log('1. Clear extension console logs');
90
- console.log('2. Run test');
91
- console.log('3. Look for: [WS] Client connected or client-connected');
92
- console.log('4. Tell me if you see it!\n');
93
-
94
- await testWithLogs('CDP Tunnel', 9221);
95
-
96
- process.exit(0);
97
- }
98
-
99
- main();
@@ -1,88 +0,0 @@
1
- const WebSocket = require('ws');
2
-
3
- async function testCDPTunnel() {
4
- console.log('\n=== Testing CDP Tunnel ===\n');
5
-
6
- const ws = new WebSocket('ws://localhost:9221/client');
7
-
8
- ws.on('open', () => {
9
- console.log('[CDP Tunnel] Connected');
10
-
11
- // 启用 Target 域
12
- ws.send(JSON.stringify({
13
- id: 1,
14
- method: 'Target.setDiscoverTargets',
15
- params: { discover: true }
16
- }));
17
- console.log('[CDP Tunnel] Sent Target.setDiscoverTargets');
18
- });
19
-
20
- ws.on('message', (data) => {
21
- try {
22
- const msg = JSON.parse(data.toString());
23
- if (msg.method === 'Target.targetCreated') {
24
- console.log('[CDP Tunnel] Received Target.targetCreated:');
25
- console.log(' Raw:', JSON.stringify(msg).substring(0, 200));
26
- console.log(' Has method:', !!msg.method);
27
- console.log(' Has params:', !!msg.params);
28
- console.log(' Has targetInfo:', !!msg.params?.targetInfo);
29
- }
30
- } catch (e) {}
31
- });
32
-
33
- await new Promise(r => setTimeout(r, 15000));
34
- ws.close();
35
- }
36
-
37
- async function testNativeCDP() {
38
- console.log('\n=== Testing Native CDP (port 9222) ===\n');
39
-
40
- // 先启动 Chromium
41
- const { spawn } = require('child_process');
42
- const chrome = spawn('/Applications/Chromium.app/Contents/MacOS/Chromium', [
43
- '--remote-debugging-port=9222',
44
- '--user-data-dir=/tmp/chrome-test-format',
45
- '--no-first-run'
46
- ], { detached: true, stdio: 'ignore' });
47
-
48
- await new Promise(r => setTimeout(r, 3000));
49
-
50
- const ws = new WebSocket('ws://localhost:9222/devtools/browser');
51
-
52
- ws.on('open', () => {
53
- console.log('[Native CDP] Connected');
54
-
55
- ws.send(JSON.stringify({
56
- id: 1,
57
- method: 'Target.setDiscoverTargets',
58
- params: { discover: true }
59
- }));
60
- console.log('[Native CDP] Sent Target.setDiscoverTargets');
61
- });
62
-
63
- ws.on('message', (data) => {
64
- try {
65
- const msg = JSON.parse(data.toString());
66
- if (msg.method === 'Target.targetCreated') {
67
- console.log('[Native CDP] Received Target.targetCreated:');
68
- console.log(' Raw:', JSON.stringify(msg).substring(0, 200));
69
- console.log(' Has method:', !!msg.method);
70
- console.log(' Has params:', !!msg.params);
71
- console.log(' Has targetInfo:', !!msg.params?.targetInfo);
72
- }
73
- } catch (e) {}
74
- });
75
-
76
- await new Promise(r => setTimeout(r, 15000));
77
- ws.close();
78
-
79
- try { process.kill(-chrome.pid); } catch(e) {}
80
- }
81
-
82
- async function main() {
83
- await testCDPTunnel();
84
- await testNativeCDP();
85
- process.exit(0);
86
- }
87
-
88
- main();