149 lines
3.7 KiB
Go
149 lines
3.7 KiB
Go
package service
|
||
|
||
import (
|
||
"fmt"
|
||
"os/exec"
|
||
"sync"
|
||
"testing"
|
||
"time"
|
||
|
||
"github.com/go-rod/rod"
|
||
"github.com/go-rod/rod/lib/launcher"
|
||
)
|
||
|
||
func TestMultipleChromeProcesses(t *testing.T) {
|
||
browsers := make([]*rod.Browser, 5)
|
||
|
||
// 启动 5 个独立的 Chrome 进程
|
||
for i := 0; i < 5; i++ {
|
||
browsers[i] = rod.New().MustConnect()
|
||
defer browsers[i].MustClose()
|
||
|
||
page := browsers[i].MustPage("https://example.com")
|
||
title := page.MustInfo().Title
|
||
fmt.Printf("进程 %d: %s\n", i, title)
|
||
}
|
||
|
||
// 打开任务管理器,可以看到 5 个 chrome.exe 进程
|
||
time.Sleep(10 * time.Minute)
|
||
}
|
||
|
||
func TestKill(t *testing.T) {
|
||
exec.Command("taskkill", "/F", "/IM", "chrome.exe").Run()
|
||
}
|
||
|
||
// TestCustomChromeWithMixedHeadless 使用自定义Chrome浏览器,启动5个进程(偶数有头,奇数无头)
|
||
func TestCustomChromeWithMixedHeadless(t *testing.T) {
|
||
// 配置你的Chrome路径
|
||
chromePath := "D:\\goProject\\geogo\\chrome\\chrome.exe"
|
||
|
||
processCount := 5
|
||
browsers := make([]*rod.Browser, processCount)
|
||
launchers := make([]*launcher.Launcher, processCount)
|
||
var wg sync.WaitGroup
|
||
|
||
t.Logf("开始启动 %d 个 Chrome 进程(偶数索引有头,奇数索引无头)...", processCount)
|
||
|
||
for i := 0; i < processCount; i++ {
|
||
wg.Add(1)
|
||
go func(idx int) {
|
||
defer wg.Done()
|
||
|
||
// 偶数(0,2,4):有头模式,奇数(1,3):无头模式
|
||
headless := (idx%2 != 0) // 奇数无头,偶数有头
|
||
|
||
// 每个进程使用独立的用户数据目录
|
||
userDataDir := fmt.Sprintf("./chrome_data/user_%d_%d", idx, time.Now().UnixNano())
|
||
|
||
t.Logf("[进程 %d] 启动中,headless=%v, userDataDir=%s", idx, headless, userDataDir)
|
||
|
||
// 创建 launcher
|
||
l := launcher.New().
|
||
Bin(chromePath).
|
||
UserDataDir(userDataDir).
|
||
Headless(headless).
|
||
Leakless(false)
|
||
|
||
// 有头模式需要额外配置
|
||
if !headless {
|
||
l.Set("window-size", "1920,1080")
|
||
l.Set("start-maximized")
|
||
// 移除 headless 相关参数
|
||
l.Delete("headless")
|
||
} else {
|
||
// 无头模式优化
|
||
l.Set("disable-gpu")
|
||
l.Set("no-sandbox")
|
||
l.Set("disable-dev-shm-usage")
|
||
}
|
||
|
||
// 启动浏览器进程
|
||
url, err := l.Launch()
|
||
if err != nil {
|
||
t.Logf("[进程 %d] ❌ 启动失败: %v", idx, err)
|
||
return
|
||
}
|
||
|
||
// 连接到浏览器
|
||
browser := rod.New().ControlURL(url).MustConnect()
|
||
|
||
browsers[idx] = browser
|
||
launchers[idx] = l
|
||
|
||
// 创建测试页面验证
|
||
page := browser.MustPage("about:blank")
|
||
|
||
// 获取浏览器版本
|
||
version, err := browser.Version()
|
||
if err != nil {
|
||
t.Logf("[进程 %d] 获取版本失败: %v", idx, err)
|
||
} else {
|
||
mode := "有头"
|
||
if headless {
|
||
mode = "无头"
|
||
}
|
||
t.Logf("[进程 %d] ✅ 启动成功 | 模式: %s | 协议版本: %s | PID: %d",
|
||
idx, mode, version.ProtocolVersion, 0)
|
||
}
|
||
|
||
// 有头模式:打开百度可见
|
||
if !headless {
|
||
page.MustNavigate("https://www.baidu.com")
|
||
t.Logf("[进程 %d] 有头模式已打开百度页面,可见浏览器窗口", idx)
|
||
time.Sleep(2 * time.Second)
|
||
} else {
|
||
page.MustNavigate("https://www.example.com")
|
||
t.Logf("[进程 %d] 无头模式已访问 example.com(不可见)", idx)
|
||
}
|
||
|
||
//page.MustClose()
|
||
}(i)
|
||
}
|
||
|
||
// 等待所有进程启动
|
||
wg.Wait()
|
||
|
||
// 验证启动结果
|
||
successCount := 0
|
||
for i, browser := range browsers {
|
||
if browser != nil {
|
||
successCount++
|
||
t.Logf("[进程 %d] 运行中", i)
|
||
} else {
|
||
t.Logf("[进程 %d] 启动失败", i)
|
||
}
|
||
}
|
||
|
||
t.Logf("成功启动 %d/%d 个 Chrome 进程", successCount, processCount)
|
||
t.Log("浏览器窗口已打开(有头模式可见),按 Enter 键关闭所有进程...")
|
||
fmt.Scanln()
|
||
select {}
|
||
// 清理
|
||
//for i, browser := range browsers {
|
||
// if browser != nil {
|
||
// browser.MustClose()
|
||
// t.Logf("[进程 %d] 已关闭", i)
|
||
// }
|
||
//}
|
||
}
|