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.
- package/cli/index.js +65 -0
- package/extension-new/background.js +6 -1
- package/extension-new/cdp/handler/special.js +47 -27
- package/extension-new/core/state.js +64 -6
- package/extension-new/core/websocket.js +124 -19
- package/package.json +9 -2
- package/server/proxy-server.js +45 -34
- package/.github/workflows/publish.yml +0 -92
- package/.github/workflows/release-assets.yml +0 -50
- package/PUBLISH.md +0 -65
- package/console-test.js +0 -52
- package/docs/README_CN.md +0 -204
- package/docs/config-page-screenshot.png +0 -0
- package/final-console-test.js +0 -105
- package/simple-tab-group-test.js +0 -56
- package/test-cdp-connection.js +0 -85
- package/test-cdp-groups.js +0 -71
- package/test-check-newtab.js +0 -144
- package/test-chrome-native.js +0 -140
- package/test-client-connected.js +0 -99
- package/test-compare-formats.js +0 -88
- package/test-context-features.js +0 -113
- package/test-create-tab.js +0 -113
- package/test-debug-broadcast.js +0 -52
- package/test-debug-targets.js +0 -127
- package/test-expose-newtab.js +0 -164
- package/test-expose-shared.js +0 -189
- package/test-final-logs.js +0 -110
- package/test-fresh-chromium.js +0 -153
- package/test-init-script.js +0 -128
- package/test-keepalive.js +0 -89
- package/test-launch-chromium.js +0 -140
- package/test-launch-vs-connect.js +0 -149
- package/test-listen-events.js +0 -102
- package/test-monitor.js +0 -83
- package/test-multiple-cdp-groups.js +0 -78
- package/test-native.js +0 -96
- package/test-page-connection.js +0 -74
- package/test-playwright-connection.js +0 -45
- package/test-playwright-groups.js +0 -47
- package/test-playwright-pages.js +0 -47
- package/test-playwright-sequence.js +0 -81
- package/test-proper-context.js +0 -129
- package/test-real-final.js +0 -251
- package/test-real-scenario-v2.js +0 -166
- package/test-real-scenario-v3.js +0 -231
- package/test-real-scenario.js +0 -104
- package/test-server-logs.js +0 -98
- package/test-session-id.js +0 -91
- package/test-simple-cdp-groups.js +0 -44
- package/test-simple-context.js +0 -137
- package/test-tab-group-simple.js +0 -58
- package/test-tab-grouping.js +0 -48
- package/test-three-pages.js +0 -192
- package/test-wait-for-page.js +0 -95
- package/test-with-logs.js +0 -118
- package/test-ws-groups.js +0 -59
- package/tests/e2e-auto-test.js +0 -304
- package/tests/iframe-test-page.html +0 -89
- package/tests/playwright-demo.js +0 -45
- package/tests/playwright-interactive.js +0 -261
- package/tests/playwright-multi-demo.js +0 -60
- package/tests/playwright-multi.js +0 -85
- package/tests/playwright-single.js +0 -41
- package/tests/screenshot-config.js +0 -35
- package/tests/test-client.js +0 -89
- package/tests/test-douyin-iframe.js +0 -171
- package/tests/test-iframe-debug.js +0 -204
- package/tests/test-multi-client.js +0 -129
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
name: Publish to npm
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
# 当发布 release 时触发
|
|
5
|
-
release:
|
|
6
|
-
types: [published]
|
|
7
|
-
|
|
8
|
-
# push 到 main 分支时自动更新 patch 版本
|
|
9
|
-
push:
|
|
10
|
-
branches:
|
|
11
|
-
- main
|
|
12
|
-
paths-ignore:
|
|
13
|
-
- '**.md'
|
|
14
|
-
- '.github/**'
|
|
15
|
-
|
|
16
|
-
# 手动触发
|
|
17
|
-
workflow_dispatch:
|
|
18
|
-
inputs:
|
|
19
|
-
version_type:
|
|
20
|
-
description: '版本类型'
|
|
21
|
-
required: true
|
|
22
|
-
default: 'patch'
|
|
23
|
-
type: choice
|
|
24
|
-
options:
|
|
25
|
-
- patch
|
|
26
|
-
- minor
|
|
27
|
-
- major
|
|
28
|
-
|
|
29
|
-
jobs:
|
|
30
|
-
publish:
|
|
31
|
-
runs-on: ubuntu-latest
|
|
32
|
-
permissions:
|
|
33
|
-
contents: write
|
|
34
|
-
|
|
35
|
-
steps:
|
|
36
|
-
# 检出代码
|
|
37
|
-
- name: Checkout code
|
|
38
|
-
uses: actions/checkout@v4
|
|
39
|
-
with:
|
|
40
|
-
fetch-depth: 0
|
|
41
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
-
|
|
43
|
-
# 设置 Node.js
|
|
44
|
-
- name: Setup Node.js
|
|
45
|
-
uses: actions/setup-node@v4
|
|
46
|
-
with:
|
|
47
|
-
node-version: '20'
|
|
48
|
-
registry-url: 'https://registry.npmjs.org'
|
|
49
|
-
|
|
50
|
-
# 配置 Git
|
|
51
|
-
- name: Configure Git
|
|
52
|
-
run: |
|
|
53
|
-
git config user.name "github-actions[bot]"
|
|
54
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
55
|
-
|
|
56
|
-
# 从 Release 名称提取版本号,或使用手动输入
|
|
57
|
-
- name: Update version
|
|
58
|
-
run: |
|
|
59
|
-
if [ "${{ github.event_name }}" = "release" ]; then
|
|
60
|
-
# 从 release tag 提取版本号(去掉 v 前缀)
|
|
61
|
-
VERSION=${GITHUB_REF_NAME#v}
|
|
62
|
-
npm version $VERSION --no-git-tag-version
|
|
63
|
-
elif [ "${{ github.event_name }}" = "push" ]; then
|
|
64
|
-
# push 到 main,自动更新 patch 版本
|
|
65
|
-
npm version patch --no-git-tag-version
|
|
66
|
-
else
|
|
67
|
-
# 手动触发,使用选择的版本类型
|
|
68
|
-
npm version ${{ inputs.version_type }} --no-git-tag-version
|
|
69
|
-
fi
|
|
70
|
-
cat package.json | grep version
|
|
71
|
-
|
|
72
|
-
# 提交版本更新
|
|
73
|
-
- name: Commit version update
|
|
74
|
-
run: |
|
|
75
|
-
git add package.json package-lock.json
|
|
76
|
-
git commit -m "chore: bump version to $(cat package.json | grep '"version"' | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d ' ')"
|
|
77
|
-
git push
|
|
78
|
-
|
|
79
|
-
# 安装依赖
|
|
80
|
-
- name: Install dependencies
|
|
81
|
-
run: npm ci
|
|
82
|
-
|
|
83
|
-
# 运行测试(如果有)
|
|
84
|
-
- name: Run tests
|
|
85
|
-
run: npm test || echo "No tests found"
|
|
86
|
-
continue-on-error: true
|
|
87
|
-
|
|
88
|
-
# 发布到 npm
|
|
89
|
-
- name: Publish to npm
|
|
90
|
-
run: npm publish --access public
|
|
91
|
-
env:
|
|
92
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
@@ -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
|
-

|
|
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
|
package/final-console-test.js
DELETED
|
@@ -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();
|
package/simple-tab-group-test.js
DELETED
|
@@ -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
|
-
});
|