连接chrome调试
# 应用场景
- 调用接口,接口打开一个网页,从网页中获取到二维码返回给用户扫码
- 二维码返回以后不能立刻关闭网页,需要等待扫码回调访问接口
- 如果用户扫完码,需要关闭这个网页防止内存占用过多导致崩溃
- 如果用户一直没扫码,等待五分钟以后关闭这个网页防止内存占用过多导致崩溃
# 地址
注意要保证WebDriver和Chrome版本的绝对一致性
注意要保证WebDriver和Chrome版本的绝对一致性
注意要保证WebDriver和Chrome版本的绝对一致性
centos7的服务器默认使用125.0.6422.141版本,再新的版本会出现依赖库问题,其他服务器版本请自行测试
# 安装WebDriver
# 解压
unzip chromedriver-linux64.zip
# 移动
mv ./chromedriver-linux64/chromedriver /usr/local/share/
cd /usr/local/share/
# 执行权限
chmod +x chromedriver
# 软连接
ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
# 软连接
ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
# 验证
chromedriver --version
# --port 设置chromedriver的连接端口
# --whitelisted-ips 设置白名单 生产服慎用
nohup chromedriver --port=13889 --whitelisted-ips='' &
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装Chrome
unzip chrome-linux64.zip
mv chrome-linux64 /usr/local/share/
ln -s /usr/local/share/chrome-linux64/chrome /usr/bin/chrome
# 验证
chrome --version --no-sandbox
# 后台启动chrome 各个参数的作用看下方
nphup chrome --headless --disable-gpu --disable-software-rasterizer --no-sandbox --remote-debugging-address=0.0.0.0 --no-first-run --no-default-browser-check --disable-software-rasterizer --disable-software-compositing --remote-debugging-port=13888 --user-data-dir=/data/chrome/13888 --enable-logging --v=1 --new-window "https://网址.com" %
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 参数解释
--headless
- 启用无头模式。无头模式允许 Chrome 在没有图形用户界面的情况下运行,适用于服务器环境和自动化测试。
--disable-gpu
- 禁用 GPU 硬件加速。由于无头模式不需要显示图形,因此禁用 GPU 可以减少资源消耗。
--disable-software-rasterizer
- 禁用软件光栅化器。这个选项通常与
--disable-gpu
一起使用,以确保完全禁用 GPU 和软件光栅化器。
- 禁用软件光栅化器。这个选项通常与
--no-sandbox
- 禁用沙盒模式。沙盒模式用于安全性隔离,通常用于测试或自动化环境,但禁用它可以提高兼容性(注意安全性风险)。
--remote-debugging-address=0.0.0.0
- 设置远程调试的绑定地址为所有可用的网络接口。允许外部设备连接到 Chrome 的远程调试端口。生产服慎用
--no-first-run
- 禁用首次运行检查。通常在 Chrome 首次运行时,会显示欢迎页面和默认浏览器设置对话框,此选项可跳过这些步骤。
--no-default-browser-check
- 禁用默认浏览器检查。Chrome 启动时不会检查是否设置为默认浏览器,适用于自动化测试环境。
--disable-software-compositing
- 禁用软件合成。确保渲染完全依赖 CPU,而不是软件合成路径。
--remote-debugging-port=13888
- 设置远程调试端口为 13888。允许外部工具通过该端口连接和控制 Chrome 实例。
--user-data-dir=/data/chrome/13888
- 指定用户数据目录。Chrome 会将用户数据和配置文件存储在这个目录中,确保数据隔离。
--enable-logging
- 启用日志记录。用于调试和监控,生成详细的日志信息。
--v=1
- 设置日志详细级别。数字越大,日志信息越详细,1 表示基本信息。
--new-window
- 启动 Chrome 并打开一个新窗口。此选项可确保 Chrome 以新的浏览窗口启动。远程调试的情况下这个参数很重要。
https://网址.com
- 启动时打开的默认网页。在启动 Chrome 后,会自动导航到指定的 URL。
# 判断
# 获取到chrome版本
curl localhost:13888/json/version
# 获取到chrome打开的tab。这一步很重要,如果一直为[],webDriver连接会报错,所以要保证起码有一个tab打开
curl localhost:13888/json/list
1
2
3
4
5
2
3
4
5
# JAVA代码
# 爬取元素
// 设置 ChromeOptions
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");//无头模式
options.addArguments("--disable-gpu");//禁用GPU
options.addArguments("--no-sandbox");//禁用沙盒
options.addArguments("--incognito");//无痕
options.addArguments("--no-first-run"); //禁用首次运行
options.addArguments("--no-default-browser-check"); //禁用默认浏览器检查
options.setExperimentalOption("debuggerAddress", "localhost:13888"); //调试端口号 不能加http或者https前缀 否则会报错
// 连接到远程的 ChromeDriver
URL remoteUrl = new URL("http://localhost:13889");
WebDriver chromeWebDriver = new RemoteWebDriver(remoteUrl, options);
chromeWebDriver.switchTo().newWindow(WindowType.TAB).get(authorizationData);
//操作的等待时长,防止DOM、js加载慢导致报错
WebDriverWait webDriverWait = new WebDriverWait(chromeWebDriver, Duration.ofMillis(5000));
try {
//窗口句柄。因为不直接执行drover.close()或driver.quit(),所以需要获取窗口句柄存储到redis、mysql之类的,给其他接口或者定时去关闭
String windowHandle = chromeWebDriver.getWindowHandle();
//校验元素是否有(有等待时长)
webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.className("qr")));
//获取元素
WebElement webElement = chromeWebDriver.findElement(By.className("qr"));
String srcData = "";
if (webElement.isEnabled()) {
srcData = webElement.getAttribute("src");
}
System.out.println(srcData);;
} catch (Exception e) {
System.out.println("抓取失败,,原因:"+e.getMessage());;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 定时任务
这里没有定时任务的启动代码,请根据自己的代码进行包装
// 设置 ChromeOptions
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");//无头模式
options.addArguments("--disable-gpu");//禁用GPU
options.addArguments("--no-sandbox");//禁用沙盒
options.addArguments("--incognito");//无痕
options.addArguments("--no-first-run"); //禁用首次运行
options.addArguments("--no-default-browser-check"); //禁用默认浏览器检查
options.setExperimentalOption("debuggerAddress", "localhost:13888"); //调试端口号 不能加http或者https前缀
// 连接到远程的 ChromeDriver
URL remoteUrl = new URL("http://localhost:13889");
WebDriver webDriver = new RemoteWebDriver(remoteUrl, options);
System.out.println("定时任务的remoteDriver连接上了");
Set<String> driverWindowHandles = webDriver.getWindowHandles();
System.out.println("当前一共有 "+driverWindowHandles.size()+" 个窗口句柄");
for (String driverWindowHandle : driverWindowHandles) {
System.out.println("窗口句柄:"+driverWindowHandle);
//切换窗口
webDriver.switchTo().window(driverWindowHandle);
/**
* 关闭tab。
* 注意是close不是quit,且不能关闭最后一个默认打开的tab。close只会关闭当前页不会退出driver,如果是quit会导致drirver直接退出无法连接。
* 这里省略了是否要关闭这个tab的判断,自行补充你的逻辑
*/
if (!StrUtil.startWith(webDriver.getCurrentUrl(), "https://网址.com")) {
webDriver.close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
上次更新: 2024-12-06, 10:03:39