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,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();
@@ -1,113 +0,0 @@
1
- const { chromium } = require('playwright');
2
-
3
- async function testContextFeatures(port, label) {
4
- console.log(`\n${'='.repeat(60)}`);
5
- console.log(`Testing ${label} (port ${port})`);
6
- console.log('='.repeat(60));
7
-
8
- try {
9
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
10
- console.log(`[${label}] Connected successfully!`);
11
-
12
- const contexts = browser.contexts();
13
- console.log(`[${label}] Found ${contexts.length} context(s)`);
14
-
15
- let context;
16
- if (contexts.length === 0) {
17
- console.log(`[${label}] Creating new context...`);
18
- context = await browser.newContext();
19
- } else {
20
- context = contexts[0];
21
- }
22
-
23
- console.log(`[${label}] Testing exposeFunction...`);
24
- await context.exposeFunction('myCustomFunction', (arg) => {
25
- console.log(`[${label}] myCustomFunction called with:`, arg);
26
- return `Hello from ${label}: ${arg}`;
27
- });
28
-
29
- console.log(`[${label}] Testing addInitScript...`);
30
- await context.addInitScript(() => {
31
- window.myInitScript = 'This is from addInitScript!';
32
- console.log('Init script executed!');
33
- });
34
-
35
- console.log(`[${label}] Creating first page...`);
36
- const page1 = await context.newPage();
37
- await page1.goto('https://www.example.com');
38
-
39
- console.log(`[${label}] Testing in first page...`);
40
- const result1 = await page1.evaluate(async () => {
41
- const funcResult = await window.myCustomFunction('test1');
42
- const initResult = window.myInitScript;
43
- return { funcResult, initResult };
44
- });
45
- console.log(`[${label}] First page result:`, result1);
46
-
47
- console.log(`[${label}] Creating second page (new tab)...`);
48
- const page2 = await context.newPage();
49
- await page2.goto('https://www.example.com');
50
-
51
- console.log(`[${label}] Testing in second page (should persist)...`);
52
- const result2 = await page2.evaluate(async () => {
53
- const funcResult = await window.myCustomFunction('test2');
54
- const initResult = window.myInitScript;
55
- return { funcResult, initResult };
56
- });
57
- console.log(`[${label}] Second page result:`, result2);
58
-
59
- console.log(`[${label}] Switching back to first page...`);
60
- const result1Again = await page1.evaluate(async () => {
61
- const funcResult = await window.myCustomFunction('test1-again');
62
- const initResult = window.myInitScript;
63
- return { funcResult, initResult };
64
- });
65
- console.log(`[${label}] First page (after switch) result:`, result1Again);
66
-
67
- console.log(`[${label}] Creating third page...`);
68
- const page3 = await context.newPage();
69
- await page3.goto('https://www.example.com');
70
-
71
- console.log(`[${label}] Testing in third page...`);
72
- const result3 = await page3.evaluate(async () => {
73
- const funcResult = await window.myCustomFunction('test3');
74
- const initResult = window.myInitScript;
75
- return { funcResult, initResult };
76
- });
77
- console.log(`[${label}] Third page result:`, result3);
78
-
79
- console.log(`[${label}] ✓ All tests passed!`);
80
-
81
- await browser.close();
82
-
83
- return true;
84
- } catch (error) {
85
- console.error(`[${label}] ✗ Error:`, error.message);
86
- console.error(`[${label}] Stack:`, error.stack);
87
- return false;
88
- }
89
- }
90
-
91
- async function main() {
92
- console.log('Testing Context-level features persistence across tabs');
93
- console.log('This tests if exposeFunction and addInitScript persist across different tabs\n');
94
-
95
- const nativeResult = await testContextFeatures(9333, 'Native CDP');
96
- const tunnelResult = await testContextFeatures(9221, 'CDP Tunnel');
97
-
98
- console.log('\n' + '='.repeat(60));
99
- console.log('COMPARISON RESULTS');
100
- console.log('='.repeat(60));
101
- console.log(`Native CDP (port 9333): ${nativeResult ? '✓ PASS' : '✗ FAIL'}`);
102
- console.log(`CDP Tunnel (port 9221): ${tunnelResult ? '✓ PASS' : '✗ FAIL'}`);
103
-
104
- if (nativeResult && tunnelResult) {
105
- console.log('\n✓ Both implementations behave identically!');
106
- } else if (nativeResult && !tunnelResult) {
107
- console.log('\n✗ CDP Tunnel has issues with Context-level features!');
108
- } else {
109
- console.log('\n✗ Native CDP has issues (unexpected)!');
110
- }
111
- }
112
-
113
- main();
@@ -1,113 +0,0 @@
1
- const WebSocket = require('ws');
2
- const http = require('http');
3
-
4
- async function test() {
5
- // 创建本地服务器
6
- const html = `
7
- <!DOCTYPE html>
8
- <html>
9
- <head><title>Test</title></head>
10
- <body>
11
- <h1>Test Page</h1>
12
- <a href="about:blank" target="_blank" id="link">Open New Tab</a>
13
- </body>
14
- </html>
15
- `;
16
-
17
- const server = http.createServer((req, res) => {
18
- res.writeHead(200, { 'Content-Type': 'text/html' });
19
- res.end(html);
20
- });
21
-
22
- await new Promise(r => server.listen(9999, r));
23
- console.log('Server: http://localhost:9999');
24
-
25
- // 连接到 CDP Tunnel
26
- console.log('\nConnecting to CDP Tunnel...');
27
- const ws = new WebSocket('ws://localhost:9221/client');
28
-
29
- let targetCreatedCount = 0;
30
-
31
- ws.on('open', () => {
32
- console.log('Connected!');
33
-
34
- // 1. 获取所有 targets
35
- ws.send(JSON.stringify({
36
- id: 1,
37
- method: 'Target.getTargets',
38
- params: {}
39
- }));
40
- });
41
-
42
- ws.on('message', (data) => {
43
- try {
44
- const msg = JSON.parse(data.toString());
45
-
46
- // 打印所有 Target 相关事件
47
- if (msg.method && msg.method.startsWith('Target.')) {
48
- console.log('[EVENT]', msg.method);
49
- if (msg.method === 'Target.targetCreated') {
50
- targetCreatedCount++;
51
- console.log(' targetId:', msg.params?.targetInfo?.targetId?.substring(0, 8));
52
- console.log(' type:', msg.params?.targetInfo?.type);
53
- console.log(' url:', msg.params?.targetInfo?.url?.substring(0, 50));
54
- }
55
- }
56
-
57
- // 收到 getTargets 响应后,启用 discover
58
- if (msg.id === 1 && msg.result) {
59
- console.log('\nGot', msg.result.targetInfos.length, 'targets');
60
-
61
- // 2. 启用 Target.setDiscoverTargets
62
- ws.send(JSON.stringify({
63
- id: 2,
64
- method: 'Target.setDiscoverTargets',
65
- params: { discover: true }
66
- }));
67
- console.log('Sent Target.setDiscoverTargets');
68
- }
69
-
70
- // 收到 setDiscoverTargets 响应后,创建新 target
71
- if (msg.id === 2 && msg.result !== undefined) {
72
- console.log('\nDiscover enabled, creating new target...');
73
-
74
- // 3. 创建新 target
75
- setTimeout(() => {
76
- ws.send(JSON.stringify({
77
- id: 3,
78
- method: 'Target.createTarget',
79
- params: { url: 'http://localhost:9999' }
80
- }));
81
- console.log('Sent Target.createTarget');
82
- }, 1000);
83
- }
84
-
85
- // 收到 createTarget 响应
86
- if (msg.id === 3 && msg.result) {
87
- console.log('\nNew target created:', msg.result.targetId?.substring(0, 8));
88
-
89
- // 等待一段时间,看看是否收到 targetCreated 事件
90
- setTimeout(() => {
91
- console.log('\n=== RESULTS ===');
92
- console.log('Target.targetCreated events received:', targetCreatedCount);
93
- ws.close();
94
- server.close();
95
- }, 3000);
96
- }
97
-
98
- } catch (e) {
99
- console.log('[ERROR]', e.message);
100
- }
101
- });
102
-
103
- ws.on('close', () => {
104
- console.log('Connection closed');
105
- process.exit(0);
106
- });
107
-
108
- ws.on('error', (err) => {
109
- console.error('Error:', err.message);
110
- });
111
- }
112
-
113
- test();