目录

连接chrome调试

# 应用场景

  1. 调用接口,接口打开一个网页,从网页中获取到二维码返回给用户扫码
  2. 二维码返回以后不能立刻关闭网页,需要等待扫码回调访问接口
  3. 如果用户扫完码,需要关闭这个网页防止内存占用过多导致崩溃
  4. 如果用户一直没扫码,等待五分钟以后关闭这个网页防止内存占用过多导致崩溃

# 地址

下载地址 (opens new window)

注意要保证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

# 安装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

# 参数解释

  • --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

# 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

# 定时任务

这里没有定时任务的启动代码,请根据自己的代码进行包装

// 设置 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
上次更新: 2024-07-23, 13:56:26
最近更新
01
2023年度总结
01-03
02
MongoDB的简单的常用语法
12-11
03
cetnos7通过nfs共享磁盘文件
11-24
更多文章>