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