Go使用Selenium Chrome发起请求

Selenium是一个用于Web应用程序测试的工具。

前提

Selenium是web 浏览器自动化的一个工具集,所以机器中本身需要安装好Chrome浏览器,在设置 > 关于Chrome 中可以看到浏览器的版本号
在这里插入图片描述




根据大版本号108下载相应的ChromeDriver,下载驱动,比如ChromeDriver 108.0.5359.71,需要注意的是驱动的大版本号要与浏览器的大版本号保持一致,否则后续使用Selenium运行程序的时候,会因为驱动版本问题,导致失败。

在这里插入图片描述


常用Chrome flags

  • --user-data-dir
    Selenium每次打开Chrome浏览器时,都是一个初始的全新环境,有时候,我们需要一些当前用户的一些设置和插件等,通过指定用户数据目录–user-data-dir来打开浏览器。

note:如果仅仅是个人测试使用,建议将chrome的用户数据目录拷贝一份,避免共用数据导致各种各样的问题



  • --proxy-server
    平常上网的时候就已经有不少需要访问外网地址的场景,设置代理就很有必要了。



  • --no-sandbox
    不开启沙盒模式,可以减少对服务器的资源消耗



  • --incognito
    以 “无痕模式” 打开



  • --disable-infobars
    关闭 “Chrome正受到自动化测试软件的控制” 的提示
    在这里插入图片描述



  • --headless
    无界面运行,后台运行。如果不想每次都打开浏览器页面,可以设置该参数



  • --start-maximized
    浏览器全屏窗口



  • --disable-gpu
    关闭gpu



Chrome URLs

浏览器地址栏访问chrome://chrome-urls,可以看到chrome内置的网址列表,其中chrome://version可以能看到浏览器的版本信息,对我们开发来说还是非常有用的,用户数据目录路径,版本号。。。

在这里插入图片描述



示例

package main

import (
	"fmt"
	"github.com/tebeka/selenium"
	"github.com/tebeka/selenium/chrome"
)

func main() {
	port := 19999	// 指定工具运行的浏览器所占用端口,当然也可以用动态端口的形式
	chromeExe := `E:\workspace\chromedriver.exe` // ChromeDriver驱动的目录
	service, err := selenium.NewChromeDriverService(chromeExe, port) 
	if err != nil {
		fmt.Printf("new chrome driver service err: %s\n", err)
		return
	}
	defer service.Stop()

	// 设置浏览器兼容性
	caps := selenium.Capabilities{
		"browserName": "chrome", 
	}
	caps.AddProxy(selenium.Proxy{
		Type:     selenium.Manual,
		HTTP:     "127.0.0.1",
		HTTPPort: 7890,
	})
	caps.AddChrome(chrome.Capabilities{
		Args: []string{
			`--no-sandbox`,
			"--incognito",
			`--disable-gpu`,
			`--user-data-dir=E:\workspace\User Data`,	// 用户数据目录路径,这是拷贝出来的一份真实的数据
		},
	})

	webDriver, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
	if err != nil {
		fmt.Printf("new web driver err: %s\n", err)
		return
	}
	//defer webDriver.Quit()	// 退出浏览器

	uris := []string{"https://www.google.com", "https://www.baidu.com"}
	for idx, uri := range uris {
		if idx == 0 {
			if err = webDriver.Get(uri); err != nil {
				fmt.Printf("get [%s] err: %s\n", uri, err)
				continue
			}
			continue
		}

		// 用新标签页打开页面
		if _, err = webDriver.ExecuteScriptAsync(fmt.Sprintf(`window.open('%s')`, uri), []interface{}{}); err != nil {
			fmt.Printf("open [%s] err: %s\n", uri, err)
			continue
		}
	}

	return
}



上面这段代码主要是通过Selenium Chrome驱动,以无痕模式,指定用户数据目录配置,访问google,再异步执行脚本,用新标签页访问baidu,效果图如下



在这里插入图片描述



能看到Chrome 无痕窗口打开了两个网页,因为指定了--user-data-dir,所以能看到浏览器安装了不少扩展插件,及书签等数据都在。浏览器左上方有“Chrome正受到自动化测试软件的控制” 的提示,可以设置--disable-infobars来关闭



巨人的肩膀

从他人的工作中汲取经验来避免自己的错误重复,正如我们是站在巨人的肩膀上才能做出更好的成绩。

https://github.com/tebeka/selenium
https://peter.sh/experiments/chromium-command-line-switches/
https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md
https://chromium.googlesource.com/chromium/src/+/master/chrome/common/chrome_switches.cc
https://blog.51cto.com/u_9406836/2499426



VChat

一个没有哆啦A梦和静香的IT码农,不专业Gopher
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值