geoGo/internal/service/a_test.go

149 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
// }
//}
}