【转】Chrome 的无头模式升级了:推出 --headless=new

news/2024/9/19 17:01:14/文章来源:https://www.cnblogs.com/x666-6/p/18412289

 Chrome的无头模式变得更好用了!本文概要介绍了近期的工程工作,让 Headless 更接近Chrome的常规“Headful”模式,让Headless对开发者更有用。

背景

早在 2017 年,Chrome 59 便引入了所谓的无头模式,可让您在没有任何可见界面的无人值守环境中运行浏览器。从本质上讲,就是在不使用 Chrome的情况下运行 Chrome

无头模式是一种通过 Puppeteer或 ChromeDriver 等项目实现浏览器自动化的热门选择。以下是使用无头模式创建指定网址的PDF文件的极简命令行示例:

chrome --headless --print-to-pdf https://developer.chrome.com/

Headless 有哪些新变化?

在深入了解最新的Headless改进之前,我们有必要先了解一下旧版 Headless的工作原理。我们之前展示的命令行代码段使用了 --headless 命令行标记,这表明无头只是常规Chrome浏览器的一种操作模式。但令人惊讶的是,事实并非如此。从技术上讲,旧版 Headless 是一种独立的替代浏览器实现方案,它正好是作为同一 Chrome 二进制文件的一部分一起提供的。但不共享 chrome中的任何 Chrome 浏览器代码。

正如您所想象的,实施和维护这个独立的无头浏览器会产生大量的工程开销,但这不是唯一的问题。由于 Headless 是一种单独的实现,因此它有自己的 bug和功能,而这些 bug 和功能是头部Chrome中不存在的。这就造成了一种令人困惑的情况:任何自动化浏览器测试在有头模式下都可能会通过,但在无头模式下却会失败,反之亦然。这是自动化工程师的一大痛点。它还排除了任何依赖于安装浏览器扩展程序的自动化测试,例如测试。这同样适用于任何其他浏览器级功能:除非 Headless 有自己的单独实现,否则不受支持。

2021 年,Chrome 团队着手解决此问题,并一次性统一了无头模式和有头模式。

我们很高兴地宣布,Chrome 112 中现已提供新的无头模式!在此模式下,Chrome 会创建但不显示任何平台窗口。所有其他功能(包括现有和未来的功能)均不受限制。

体验全新的无头模式

如需试用新的无头模式,请传递 --headless=new 命令行标志

chrome --headless=new

目前,旧版无头模式仍可通过以下方式使用:

chrome --headless=old

目前,如果在没有明确值的情况下传递 --headless 命令行标志,系统仍会激活旧的无头模式,但我们计划随着时间的推移将此默认设置更改为新的无头模式。

我们计划从 Chrome 二进制文件中彻底移除旧版 Headless,并于今年晚些时候停止在 Puppeteer中支持此模式。在此次移除过程中,我们将把旧版 Headless 作为单独的独立二进制文件提供给无法升级的用户。

Puppeteer 推出全新无头模式

如需在 Puppeteer中选择启用新的无头模式,请执行以下操作:

import puppeteer from 'puppeteer';const browser = await puppeteer.launch({headless: 'new',// `headless: true` (default) enables old Headless;// `headless: 'new'` enables new Headless;// `headless: false` enables "headful" mode.
});const page = await browser.newPage();
await page.goto('https://developer.chrome.com/');//

await browser.close();
 

Selenium-WebDriver 中的全新无头

如需在 Selenium-WebDriver中使用新的无头模式,请执行以下操作:

const driver = await env.builder().setChromeOptions(options.addArguments('--headless=new')).build();await driver.get('https://developer.chrome.com/');//

await driver.quit();

如需了解详情,包括使用其他语言绑定的示例,请参阅 Selenium 团队的博文。

特定于无头的命令行标志

以下命令行 flag 适用于新的无头模式。

--dump-dom

--dump-dom 标志会将目标网页的序列化 DOM输出到 stdout。示例如下:

 
chrome --headless=new --dump-dom https://developer.chrome.com/

请注意,这与简单地输出HTML源代码(您可以通过 curl 完成此操作)不同。为了生成 --dump-dom 的输出,Chrome首先会将 HTML代码解析为 DOM,执行任何可能会更改 DOM 的 <script>,然后将该 DOM重新转换为序列化的 HTML字符串。

--screenshot

--screenshot 标记会截取目标网页的屏幕截图,并将其作为 screenshot.png 保存到当前工作目录中。与 --window-size 标志结合使用尤为有用。示例如下:

 
chrome --headless=new --screenshot --window-size=412,892 https://developer.chrome.com/

--print-to-pdf

--print-to-pdf 标志可将目标网页另存为当前工作目录中名为 output.pdf 的 PDF。示例如下:

chrome --headless=new --print-to-pdf https://developer.chrome.com/

您还可以选择添加 --no-pdf-header-footer 标记,以省略打印页眉(包含当前日期和时间)和页脚(包含网址和页码)。

 
chrome --headless=new --print-to-pdf --no-pdf-header-footer https://developer.chrome.com/

注意:--no-pdf-header-footer 标志后面的功能之前可通过 --print-to-pdf-no-header 标志使用。根据您使用的 Chrome 版本,您可能需要回退到旧的 flag 名称。

--timeout

--timeout 标志定义了最长等待时间(以毫秒为单位),之后,即使网页仍在加载,--dump-dom--screenshot 和 --print-to-pdf 也会捕获该网页的内容。

 
chrome --headless=new --print-to-pdf --timeout=5000 https://developer.chrome.com/

--timeout=5000 标志会告知 Chrome最多等待 5 秒再打印 PDF。因此,此过程最多只需 5 秒即可运行完毕。

--virtual-time-budget

--virtual-time-budget 支持时间旅行!嗯,在某种程度上对于任何具有时效性的代码(例如,setTimeout/setInterval),虚拟时间可充当“快进”。它会强制浏览器尽快执行相应网页的任何代码,同时让网页相信时间实际上会经过。

为便于说明其用途,请参考此演示页面,该页面使用 setTimeout(fn, 1000) 每秒递增、记录和显示一个计数器。下面是相关代码:

 
<output>0</output>
<script>const element = document.querySelector('output');let counter = 0;setInterval(() => {counter++;console.log(counter);element.textContent = counter;}, 1_000);
</script>

一秒后,网页会显示“1”;两秒后,会显示“2”,依此类推。下面展示了如何捕获网页在 42 秒后的状态并将其保存为 PDF格式:

 
chrome --headless=new --print-to-pdf --virtual-time-budget=42000 https://mathiasbynens.be/demo/time

--allow-chrome-scheme-url

如需访问 chrome:// 网址,必须使用 --allow-chrome-scheme-url 标志。从 Chrome 123开始提供此标志。示例如下:

chrome --headless=new --print-to-pdf --allow-chrome-scheme-url chrome://gpu
 

调试

由于 Chrome 在无头模式下实际上不可见,因此似乎很难弄清楚在出现问题时出了什么问题。幸运的是,使用Headless Chrome调试无头 Chrome 的方式与有头 Chrome 非常相似。技巧就是使用 --remote-debugging-port 命令行 flag以无头模式启动 Chrome

chrome --headless=new --remote-debugging-port=0 https://developer.chrome.com/

此命令会将唯一的WebSocket网址输出到 stdout,例如:

 
DevTools listening on ws://127.0.0.1:60926/devtools/browser/b4bd6eaa-b7c8-4319-8212-225097472fd9

在常规的有头 Chrome实例中,我们随后可以使用 Chrome 开发者工具远程调试连接到无头目标并对其进行检查。为此,请转到 chrome://inspect,点击 Configure... 按钮,然后输入 WebSocket 网址的 IP 地址和端口号。在上面的示例中,我输入了 127.0.0.1:60926。点击 Done,您应该会看到远程目标及其所有标签页和其他目标列在下方。点击inspect,即可使用 Chrome 开发者工具检查远程无头目标,inspect

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796590.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop(六)生产集群搭建(三)

完全分布式运行模式 一、群起集群 1、配置workers [user@hadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers在文件中添加如下内容: hadoop102 hadoop103 hadoop1042、启动集群 (1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode [user@hadoop…

延迟退休!我们又可以愉快的打工了

延迟退休! 我们又可以愉快的打工了希望可以活到办理退休那天🐸本文来自博客园,作者:bigroc,转载请注明原文链接:https://www.cnblogs.com/bigroc/p/18412267blog:http://www.bigroc.cn博客园:https://www.cnblogs.com/bigroc

面试官:线程池遇到未处理的异常会崩溃吗?

首先,这个问题考察的是你对线程池 execute 方法和 submit 方法的理解,在 Java 线程池的使用中,我们可以通过 execute 方法或 submit 方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。 1.execute方法 execute 方法用于…

保持使用全局 HttpClient,但确保不同请求的 HttpRequestMessage 独立

保持使用全局 HttpClient,但确保不同请求的 HttpRequestMessage 独立这是推荐的最佳实践,因为 HttpClient 是设计为可重用的,你可以使用独立的 HttpRequestMessage 来确保每个请求有独立的请求头,而不影响其他请求。private static readonly HttpClient client = new HttpC…

清理C盘缓存,超简单的清理C盘缓存清理方法

清理C盘缓存是优化Windows系统性能的重要步骤,以下是一些超简单的清理C盘缓存的方法:使用磁盘清理工具 步骤: 右键点击C盘(系统盘),选择“属性”。 在C盘属性窗口中,点击“磁盘清理”按钮。 系统会分析C盘上的文件,并列出可以删除的文件类型。 勾选你想要删除的文件类型…

Pytorch安装(GPU_Windows,安装过CPU版的想再次安装GPU)

看过我之前那篇【Pytorch安装 CPU版本】的朋友应该知道,Pytorch安装步骤很复杂。但是其实弄清楚整个逻辑会简单很多,本篇为PytorchGPU安装。如果有朋友跟着我之前的帖子安装过的,想再安装一个GPU的,可以跟着我一起安装一下。我会把我遇到的坑以及经验都给大家分享一下。 Py…

STM32F103C8T6软件安装

本教程参考b站视频教程(STM32入门教程-2023版 细致讲解 中文字幕,第三集P3软件安装),将从一下几个方面进行安装: 1.安装Keil5 MDK软件 2.安装器件支持包 3.软件注册 4.安装ST-LINK驱动 5.安装USB转串口驱动 一、安装Keil5 MDK软件 找到软件的下载链接:https://jiangxieke…

基于pikachu靶场的水平越权详解

1. pikachu靶场搭建 如果你在之前已经使用过phpstudy了,参考pikachu 靶场环境搭建 如果没有,参考pikachu 靶场搭建 如果在靶场搭建中遇到一些问题,参考皮卡丘靶场搭建遇到的问题大全 2. 水平越权简介 水平越权是指攻击者通过获取与自己拥有相同权限级别的其他用户的访问权限…

如何实现两个机器时间同步-计算rtt+offset

背景: 之前的项目大致可以分为两层,逻辑层和设备层,运行在同一个主机上。最近在着手搭建一个仿真平台,在另外一台主机上部署机器人机器相关硬件设备,比如陀螺仪,轮机,雷达等。 由于两台主机的时间戳不同步问题,导致定位系统有问题,为此需要实现两个主机的时间同步。 具…

C# 操作xml(转)

四、xml 1、概念:XML可扩展的标记语言类似于HTML XML:存储数据 注意: XM工是严格区分大小写的。 XML标签也是成对出现的。 2、通过代码来创建xML文档 1、引用命名空间 using System.Xml; 2、创建XML文档对象 XmlDocument doc = new XmlDocument(); 3、创建第一行描述信息,并且…