go控制浏览器的方式和简单代码示例

 

目前(2025/05/06)只用过chromedp和playwright-go两个库,在这里只说一下这两个库的使用,一些更深入的我也没研究。

 

1.简单比较

  chromedp playwright-go
上手难度 代码比playwright稍微更麻烦一点 更容易上手
性能 据说是更好一些,实际中我使用它过cloudflare盾没太有感觉  
浏览器支持 打开chrome/chromium没问题,Edge没试过 可以打开多种浏览器
驱动 【好像不需要】安装chrome Driver,不知道是不是库给偷偷安装了 必须要安装驱动,或者代码中显示调用一个Install方法来安装驱动
连接Chrome方式

1.可以提前手动打开浏览器之后通过一个端口来连接Chrome

2.也可以通过代码打开Chrome后控制它

既可以提前打开Chrome,也可以通过代码打开Chrome
限制

1.【未测试】文件大小是否限制

2.一台机器可以打开多个Chrome浏览器来进行控制

1.使用ConnectOverCDP连接已经打开的Chrome浏览器的时候,上传文件被限制到了50M,并且似乎没有解开的方式。只能使用LaunchPersistentContext来打开才能突破这个限制

2.同一台机器上,使用playwright似乎不能打开多个浏览器,控制会串到其它chrome实例

3.对于连接已经打开的Firefox浏览器,【没有测试成功】,也可能是我代码的问题

用户隔离 可以通过使用不同profile的方式来隔离,但是Chrome在V136及以后的版本不能使用默认用户目录 可以通过使用不同profile的方式来隔离,但是Chrome在V136及以后的版本不能使用默认用户目录
     

 

2.playwright-go连接已经在9222端口打开的Chrome浏览器

// ConnectToChromeInstance connects to a chrome instance context
//
// cdpUrl 为一个已经运行了调试端口的chrome实例的 url, 例 http://localhost:9222
func ConnectToChromeInstance(cdpUrl string) (playwright.BrowserContext, error) {

	// 启动 Playwright 并连接到已经存在的 Chrome 实例
	pw, err := playwright.Run()
	if err != nil {
		return nil, fmt.Errorf("ConnectToChromeInstance 无法启动 Playwright: %v", err)
	}

	// defer pw.Stop()

	browser, err := pw.Chromium.ConnectOverCDP(cdpUrl)
	if err != nil {
		return nil, fmt.Errorf("ConnectToChromeInstance 无法连接到 Chrome 实例: %v", err)
	}
	// defer browser.Close()

	contexts := browser.Contexts()
	if len(contexts) == 0 {
		return nil, fmt.Errorf("ConnectToChromeInstance 无法获取 Chrome 实例的 context")
	}
	browserCtx0 := contexts[0]

	return browserCtx0, nil
}

 

3.playwright-go打开指定的用户Profile的方法(ChromeV136及以上的user-data-dir不能使用默认目录)

// 通过LaunchPersistentContext 方式打开某个Profile
func LaunchChromePersistentContext(pw *playwright.Playwright, chromeExecPath, userDataDir, userProfile string) (playwright.BrowserContext, error) {
	// 启动浏览器
	browserCtx, err := pw.Chromium.LaunchPersistentContext(userDataDir, playwright.BrowserTypeLaunchPersistentContextOptions{
		Headless:       playwright.Bool(false),
		Channel:        playwright.String("chrome"),
		ExecutablePath: &chromeExecPath,
		Args: []string{
			"--profile-directory=" + userProfile,
		},
	})
	if err != nil {
		return nil, fmt.Errorf("LaunchChromePersistentContext 无法启动浏览器 userProfileDir: %s,  错误:%v", userProfile, err)
	}

	return browserCtx, nil
}

 

posted on 2025-05-06 14:38  阿摩罗识  阅读(147)  评论(0)    收藏  举报

导航