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