基于Node+HeadlessBrowser的浏览器自动化方案

基于Node+HeadlessBrowser的浏览器自动化方案

什么是无头浏览器(Headless Browser)?

无头浏览器,就像是一个没有用户界面的浏览器程序。你可以想象它就是一个“隐形”的浏览器,只不过它没有图形界面,但能做我们用普通浏览器所能做的大部分事情,比如打开网页、执行 JavaScript、进行页面互动等。无头浏览器最常用的场景就是在自动化测试、网页抓取、服务器上执行任务等不需要用户界面的场合。

使用无头浏览器,你无需打开真正的浏览器窗口就可以让程序去浏览网页、录制操作、生成截图等等,特别适合那些需要在没有人手动操作的情况下处理网页内容的任务。

特性PlaywrightPuppeteerSeleniumPhantomJS
支持浏览器Chromium, Firefox, WebKitChromium所有主流浏览器已内置 WebKit
平台支持Windows, Mac, LinuxWindows, Mac, LinuxWindows, Mac, LinuxWindows, Mac, Linux
多浏览器支持
API 现代性现代且易用现代且易用较复杂,学习曲线陡峭较简单
开发活跃度活跃且增长快活跃非常活跃已停止维护
适用场景自动化测试、爬虫、跨浏览器兼容性测试浏览器自动化测试和爬虫复杂测试流程静态网页抓取
启动速度较慢
资源占用
文档和社区支持良好优秀广泛限制, 文档停滞
  • Playwright:适合需要多浏览器支持的项目,API 现代且跨平台,对新功能的支持很快。
  • Puppeteer:专注于 Chromium,适合简单的自动化测试和爬虫任务。
  • Selenium:对于复杂的跨浏览器测试任务是很好的选择,但需要较多的配置和学习。
  • PhantomJS:虽然轻量且快速,但由于停止维护,而其使用逐渐减少,不建议用于新项目。

一、依赖安装

以下用Playwright为例,实现几个模拟浏览器操作的案例

// 安装无头浏览器依赖
npm i playwright --save
// 安装浏览器内核
npx playwright install

二、具体自动化操作

ScreenHotUtils.js提供了三个案例方法

  • 对目标网页进行截取
  • 获取目标页面的大标题
  • 获取目标页面Window对象的任意属性
// 注入chromium内核
const { chromium } = require('playwright');/*** 异步暂停方法* @param {number} delay - 时长(以毫秒为单位)* @returns {Promise<void>}*/
const sleep = delay => new Promise(resolve => setTimeout(resolve, delay));/*** 网页截屏方法* @param {string} webPageUrl - 目标网页地址* @param {number} loadDelay - 网页加载延时(以毫秒为单位)* @param {number} width - 浏览器宽度* @param {number} height - 浏览器高度* @param {boolean} fullPage - 是否进行全屏长截图* @returns {Promise<Buffer>} - 截图图像的Buffer*/
const captureWebPageScreenshot = async (webPageUrl,loadDelay = 1000,width = 1980,height = 1024,fullPage = false
) => {// 创建浏览器对象const browser = await chromium.launch();// 创建一个新的页面const page = await browser.newPage({viewport: {width,height,},});// 跳转到目标页await page.goto(webPageUrl);// 等待页面加载完成await page.waitForLoadState('load');// 页面加载延时await sleep(loadDelay);// 截图,并获取一个Bufferconst screenFileBuffer = await page.screenshot({ fullPage });// 关闭浏览器await browser.close();return screenFileBuffer;
};/*** 获取网页标题* @param {string} webPageUrl - 目标网页地址* @param {number} loadDelay - 网页加载延时(以毫秒为单位)* @returns {Promise<string>} - 网页标题*/
const getWebPageTitle = async (webPageUrl, loadDelay = 1000) => {// 创建浏览器对象const browser = await chromium.launch();const page = await browser.newPage();await page.goto(webPageUrl);await page.waitForLoadState('load');await sleep(loadDelay);// 获取页面标题const title = await page.title();await browser.close();return title;
};/*** 获取Window属性* @param {string} webPageUrl - 目标网页地址* @param {string[]} propertyNames - 要获取的属性名称列表* @returns {Promise<string>} - 获取的属性值*/
const getWindowProperty = async (webPageUrl, propertyNames) => {const browser = await chromium.launch();const page = await browser.newPage();await page.goto(webPageUrl);await page.waitForLoadState('load');// 使用 evaluate 在页面上下文中运行脚本const propertyValue = await page.evaluate(propertyNames => {const result = propertyNames.reduce((pre, prop) => {pre = pre[prop];return pre;}, window);return result;}, propertyNames);await browser.close();return propertyValue;
};module.exports = {getWebPageTitle,getWindowProperty,captureWebPageScreenshot,
};

三、执行测试

const {getWebPageTitle,captureWebPageScreenshot,getWindowProperty,
} = require('./ScreenHotUtils');
const fs = require('fs');
const path = require('path');(async () => {const webPageUrl = `http://www.baidu.com`;//   执行截图动作const fileBuffer = await captureWebPageScreenshot(webPageUrl);// 写入本地 | 上传OSS | 其他fs.writeFileSync(path.resolve(__dirname, './screenShot.png'), fileBuffer);//   获取页面标题const pageTitle = await getWebPageTitle(webPageUrl);console.log('PageTitle', pageTitle); // 百度一下 你就知道// 获取页面cookieconst cookie = await getWindowProperty(webPageUrl, ['document', 'cookie']);console.log('Cookie:', cookie); // cookie......
})();

效果:
在这里插入图片描述
就这样,我们可以轻松获得一个页面截图,通过代码就能在不打开浏览器的情况下获取到网页的图像,来实现一些自动化巡检&截图工具。

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

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

相关文章

AEB法规升级后的市场预测与分析:技术迭代、政策驱动与产业变革

文章目录 一、政策驱动&#xff1a;全球法规升级倒逼市场扩容二、技术迭代&#xff1a;从“基础防护”到“场景全覆盖”三、市场格局&#xff1a;竞争加剧与生态重构四、挑战与未来展望五、投资建议结语 近年来&#xff0c;全球汽车安全法规的加速升级正深刻重塑AEB&#xff08…

【Docker项目实战】使用Docker部署Caddy+vaultwarden密码管理工具(详细教程)

【Docker项目实战】使用Docker部署vaultwarden密码管理工具 前言一、vaultwarden介绍1.1 vaultwarden简介1.2 主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、拉取镜像五、…

第十六届蓝桥杯大赛软件赛省赛第二场

第十六届蓝桥杯大赛软件赛省赛第二场 大家好。最近参加了第十六届蓝桥杯大赛软件赛省赛第二场 Python 大学 B 组的比赛&#xff0c;现在来和大家分享一下我的解题思路和代码实现。以下内容是我自己写的&#xff0c;可能对也可能错&#xff0c;欢迎大家交流讨论。 试题 A&…

硬件须知的基本问题2

目录 1、典型电路 1. DC5V 转 DC3.3V 电路 2. 通信电路 2、STM32F103RCT6 最小系统如何设计搭建电路 1. 电源电路 2. 复位电路 3. 时钟电路 4. 下载电路 5. 单片机连接连接 3、请列举你所知道的二极管型号&#xff1f; 1. 整流二极管 2. 小信号二极管 3. 肖特基二极管 4. 超…

力扣HOT100——102.二叉树层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] /*** Definition for a bi…

CSS 定位学习笔记

一、定位概述 CSS 定位是控制 HTML 元素在页面中位置的核心技术&#xff0c;允许元素脱离正常文档流&#xff0c;实现复杂布局效果。 二、定位类型对比 定位类型属性值参考基准是否脱离文档流常用场景静态定位static无否默认布局相对定位relative自身原位置否元素微调绝对定…

Threejs中顶视图截图

Threejs中顶视图截图 一般项目中的每个模型&#xff0c;都需要有一张对应的图片&#xff0c;一般是顶视图&#xff0c;在对应的2D场景场景中展示。以下分享一个实现方式&#xff0c;先将清空模型材质的纹理&#xff0c;把颜色设置为白色&#xff0c;使用正交相机截取顶视图&am…

深度探索:DeepSeek赋能WPS图表绘制

一、研究背景 在当今数字化信息爆炸的时代&#xff0c;数据处理与可视化分析已成为众多领域研究和决策的关键环节。随着数据量的急剧增长和数据维度的不断丰富&#xff0c;传统的数据可视化工具在应对复杂数据时逐渐显露出局限性。Excel作为广泛应用的电子表格软件&#xff0c;…

第11章 面向分类任务的表示模型微调

​​​​​​第1章 对大型语言模型的介绍第2章 分词和嵌入第3章 解析大型语言模型的内部机制第4章 文本分类第5章 文本聚类与主题建模第6章 提示工程第7章 高级文本生成技术与工具第8章 语义搜索与检索增强生成第9章 多模态大语言模型第10章 构建文本嵌入模型第12章 微调生成模…

4.换行和续写

一.FileOutputStream写出数据的两个小问题&#xff1a; 问题一&#xff1a;换行 假设在本地文件中要输出数据aweihaoshuai 666&#xff0c;在输出这个数据时要换行写出&#xff0c;如下图&#xff1a; 问题二&#xff1a;续写 假设在一个文本文件中已经存在数据aweihaoshuai…

联易融受邀参加上海审计局金融审计处专题交流座谈

近日&#xff0c;联易融科技集团受邀出席了由上海市审计局金融审计处组织的专题交流座谈&#xff0c;凭借其在供应链金融领域的深厚积累和创新实践&#xff0c;联易融为与会人员带来了精彩的分享&#xff0c;进一步加深现场对供应链金融等金融发展前沿领域的理解。 在交流座谈…

SOC估算:开路电压修正的安时积分法

SOC估算&#xff1a;开路电压修正的安时积分法 基本概念 开路电压修正的安时积分法是一种结合了两种SOC估算方法的混合技术&#xff1a; 安时积分法&#xff08;库仑计数法&#xff09; - 通过电流积分计算SOC变化 开路电压法 - 通过电池电压与SOC的关系曲线进行校准 方法原…

代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)

贪心算法 Part05 合并区间 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0…

PostgreSQL的扩展 pg_cron

PostgreSQL的扩展 pg_cron pg_cron 是 PostgreSQL 的一个开源扩展&#xff0c;它允许在数据库内部使用 cron 语法调度定期任务&#xff0c;是最接近 Oracle DBMS_SCHEDULER 的解决方案。 一 安装与配置 1 安装方法 下载路径&#xff1a; https://github.com/citusdata/pg_…

卷积神经网络迁移学习:原理与实践指南

引言 在深度学习领域&#xff0c;卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而&#xff0c;从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案&#xff0c;它能够将预训练模型的知识…

图论---朴素Prim(稠密图)

O( n ^2 ) 题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 // 最小生成树 —朴素Prim #include<cstring> #include<iostream> #i…

Spring-Cache替换Keys为Scan—负优化?

背景 使用ORM工具是往往会配合缓存框架实现三级缓存提高查询效率&#xff0c;spring-cache配合redis是非常常规的实现方案&#xff0c;如未做特殊配置&#xff0c;CacheEvict(allEntries true) 的批量驱逐方式&#xff0c;默认使用keys的方式查询历史缓存列表而后delete&…

【N8N】Docker Desktop + WSL 安装过程(Docker Desktop - WSL update Failed解决方法)

背景说明&#xff1a; 因为要用n8n&#xff0c;官网推荐这个就下载了&#xff0c;然后又是一堆卡的安装问题记录过程。 1. 下载安装包 直接去官网Get Docker | Docker Docs下载 下载的是第一个windows - x86_64. &#xff08;*下面那个beta的感觉是测试版&#xff09; PS&am…

RT Thread 发生异常时打印输出cpu寄存器信息和栈数据

打印输出发生hardfault时,当前栈十六进制数据和cpu寄存器信息 在发生 HardFault 时,打印当前栈的十六进制数据和 CPU 寄存器信息是非常重要的调试手段。以下是如何实现这一功能的具体步骤和示例代码。 1. 实现 HardFault 处理函数 我们需要在 HardFault 中捕获异常上下文,…

【安装neo4j-5.26.5社区版 完整过程】

1. 安装java 下载 JDK21-windows官网地址 配置环境变量 在底下的系统变量中新建系统变量&#xff0c;变量名为JAVA_HOME21&#xff0c;变量值为JDK文件夹路径&#xff0c;默认为&#xff1a; C:\Program Files\Java\jdk-21然后在用户变量的Path中&#xff0c;添加下面两个&am…