Puppeteer实现上下滚动、打开新Tab、用户数据保存(三)

news2024/11/26 2:40:52

Puppeteer实现上下滚动、打开新Tab、用户数据保存(三)

在这里插入图片描述

    • Puppeteer实现上下滚动、打开新Tab、用户数据保存(三)
        • 一、实现上下滚动
        • 二、打开新Tab
        • 三、用户数据保存
        • 四、效果演示

一、实现上下滚动

在自动化测试中,我们需要能够通过程序控制进行上下滚动屏幕,从而能够查看页面中的更多内容或者进行加载更多数据,进行分页操作。但是 Puppeteer 并没有提供专门的滚动方法,这里需要我们自己去实现具体细节。

查看文档,我们能够看到命令 page.evaluate,其作用是执行一段 js 代码,有了这个命令,我们就能够配合系统中的 window.scrollBy(0, distance);去实现向下滚动页面内容了。通过控制参数的数值,然后循环调用,就能够实现这种向下滚动向上滚动的效果了。

  async function autoScroll(page, distance = 100, toScrollHeight = 120000) {
    await page.evaluate(async ({ distance, toScrollHeight }) => {
      await new Promise((resolve, reject) => {
        var totalHeight = 0;
        var timer = setInterval(([distanceTime, toScrollHeightTime]) => {
          var scrollHeight = document.body.scrollHeight;
          window.scrollBy(0, distanceTime);
          totalHeight += distanceTime;

          if (totalHeight >= scrollHeight || totalHeight > toScrollHeightTime) {
            clearInterval(timer);
            resolve();
          }
        }, 100, [distance, toScrollHeight]);
      });
    }, { distance, toScrollHeight });
  }

autoScroll 方法就是一个具体实现,通过 setInterval 定时器,进行循环执行 window.scrollBy(0, 100);这个方法。

代码中需要传递三个参数 page、distance、toScrollHeight

  • page: 表示Puppeteer控制的页面
  • distance:表示每一次滚动滚动的距离
  • toScrollHeight:表示最大滚动到多少距离

在程序中调用:

  await autoScroll(newPage, 80, 2200)

这就实现了向上滚动。上面的方法调用表示每一次滚动 80 的距离,滚动的最大值是 2200 。这个就比较自由了,如果在自己的项目中使用,就可以随意更改这些参数,以符合自己的业务需要。

❓ 对于向下滚动该如何实现呢?其实也是很简单。

由于 window.scrollBy(0, distance); 中第二个参数 distance 可以为负数,当为负数时,则会产生向下的滚动,那我们也就很容易实现向下滚动。

首先,我们可以从 document.body 中获取到页面已经滚动的总高度,然后让已经滚动的总高度逐渐变为零,则可以实现向下滚动的效果。

 let scrollHeight = document.body.scrollHeight;
 var totalHeight = scrollHeight;

下面来看看完整的向下滚动页面:
这里只需要 page, distance两个属性参数,不再需要滚动到最大距离,因为本身就是需要从最大距离滚动到零,这样就可以了。

  async function autoScrollZero(page, distance = 100) {
    await page.evaluate(async ({ distance }) => {
      await new Promise((resolve, reject) => {
        let scrollHeight = document.body.scrollHeight;
        var totalHeight = scrollHeight;
        var timer = setInterval(([distanceTime, scrollHeightTime]) => {
          window.scrollBy(0, -distanceTime);
          totalHeight -= distanceTime;
          if (totalHeight <= 0) {
            clearInterval(timer);
            resolve();
          }
        }, 100, [distance, scrollHeight]);
      });
    }, { distance });
  }

代码中,同样是使用 setIntervalwindow.scrollBy(0, -distanceTime); 循环定时逐步减小滚动的值。

调用时使用方法:

  await autoScrollZero(newPage, 50)

这个调用就会让页面向下滚动,最终回到顶部。每次的滚动距离是50.

二、打开新Tab

常规测试中,我们经常会遇到点击 a 标签,打开新的tab页面,对于这种需求,Puppeteer也提供了处理方式,那就是通过浏览器监听 targetcreated 事件完成,等待该事件完成,再去响应接下来的操作。

  const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page())))
  await page.click('a._1qp91i', { waitUntil: 'networkidle2' });
  const newPage = await newPagePromise;

如上,newPagePromise 是一个promise,当我们在当前页面通过 page.click('a._1qp91i') 点击链接时,会打开一个新的页面,然后等待 newPagePromise 响应,最后我们就会拿到新页面的page对象,也就是对于新页面的操作,我们需要使用 newPage 来操作。

比如:

  • 新页面的点击事件
 await newPage.click('a._1qp91i', { waitUntil: 'networkidle2' });
  • 新页面的监听事件
  newPage.on('console', logFunction);
三、用户数据保存

自动化测试时,每次的登录都是比较复杂且繁琐的,我们可以通过记录一次登录数据信息,避免每一次都需要进行登录操作,可以使用userDataDir记录登录数据

 const browser = await puppeteer.launch({
    headless: false,
    devtools: false, // 打开开发者模式
    defaultViewport: null, // 不使用默认的固定大小,直接填满浏览器

    userDataDir: '.puppeteer-data',  // 保存用户数据,记录登录信息,不用每次都进行登录

  });

当运行代码时,我们能够看到在根目录下生成了一个新的 .puppeteer-data 文件夹,里边会记录一些登录的数据信息。

四、效果演示

打开新tab和上下滚动,我们可以看看简书中的效果:
在这里插入图片描述

用户数据,我们能够在项目根目录下看到保存的数据信息

在这里插入图片描述

以上就是Puppeteer实现上下滚动、打开新Tab、用户数据保存的全部内容。


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

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

相关文章

计算机毕业设计选题推荐-springboot 蛋糕甜品店管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

YOLO目标检测——跌倒摔倒数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共安全监控、智能家居、工业安全等活动区域无监管情况下的人员摔倒事故数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含…

SpringBoot面试题1:什么是SpringBoot?为什么要用SpringBoot?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是SpringBoot? Spring Boot 是一个用于快速开发独立的、基于 Spring 框架的应用程序的开源框架。它简化了 Spring 应用的配置和部署过程,使…

稚晖君项目复刻:L-ink门禁卡(1)——环境搭建与第一个项目创建

行文目录 前言其他文章正文开始STM32CubeMX安装STM32CubeMX安装L0的固件支持包Clion安装OpenOCD安装MinGw安装arm-none-eabi-gcc安装Clion配置 创建STM32工程创建STM32CubeMX工程更改芯片型号 参考文献 前言 其实关于稚晖君的L-ink门禁卡在我本科阶段就已经刷过好几次了&#x…

前端页面布局之【响应式布局】

目录 &#x1f31f;前言&#x1f31f;优点&#x1f31f;缺点&#x1f31f;media兼容性&#x1f31f;利用CSS3-Media Query实现响应式布局&#x1f31f;常见的媒体类型&#x1f31f;常见的操作符&#x1f31f;属性值&#x1f31f;设备检测&#x1f31f;响应式阈值选取&#x1f3…

使用vue3+element-ui plus 快速构建后台管理模板

一、安装 vue3 脚手架 npm create vuelatestcd vue-ui-template #切换到刚刚创建好的vue项目根目录中 npm install #下载项目所需要的依赖包 npm run dev #启动运行项目服务项目启动后&#xff0c;默认页面显示如下&#xff1a; 二、安装element-ui plus 官网链接&#xff1a;…

CDN到底有什么魅力,值得网站接入

当谈到提高网站性能和用户体验时&#xff0c;内容分发网络&#xff08;Content Delivery Network&#xff0c;CDN&#xff09;是一项不可忽视的技术。CDN加速已经成为许多在线企业的首选&#xff0c;用以减少加载时间、提高安全性和全球可访问性。本文将深入探讨CDN的原理、工作…

2023-10-14 LeetCode每日一题(只出现一次的数字)

2023-10-14每日一题 一、题目编号 136. 只出现一次的数字二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时…

基于Java的大学生实习管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【LVGL】SquareLine Studio入门基础操作

1.SquareLine Studio基础 在这篇文章中将介绍SquareLine Studio的基础操作、解释如何加载一个项目、布局结构。    启动软件后,可以加载之前的项目、创建项目、加载一个示例。    这里以打开示例audio_mixer为例,可以双击该项目打开或者选中该项目点击右下角的【创建】按…

从基础到卷积神经网络(第13天)

1. PyTorch 神经网络基础 1.1 模型构造 1. 块和层 首先,回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as Fnet = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X = torch.rand(2, 20) # 生成随机输入(批…

Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构

电子病历&#xff08;EMR,Electronic Medical Record&#xff09;是用电子技术保存、管理、传输和重现的数字化的病人的医疗记录&#xff0c;取代手写纸张病历&#xff0c;将医务人员在医疗活动过程中,使用医疗机构管理系统生成的文字、符号、图表、图形、数据、影像等数字化内…

27 mysql 组合索引 的存储以及使用

前言 这里来看一下 mysql 中索引的 增删改查 查询在前面的系列文章中都有使用到 这里 来看一下 增删改 的相关实现 索引记录 和 数据记录 的处理方式是一致的 这里来看一下 组合索引 的相关, 以及 特性 组合索引的存储以及使用 创建数据表如下, 除了主键之外, 创建了…

Leetcode刷题笔记--Hot61-70

1--课程表&#xff08;207&#xff09; 主要思路&#xff1a; 用 in 记录每一门课程剩余的先修课程个数&#xff0c;当剩余先修课程个数为0时&#xff0c;将该课程加入到队列q中。 每修队列q中的课程&#xff0c;以该课程作为先修课程的所有课程&#xff0c;其剩余先修课程个数…

安卓camera2获取到的YUV420_888格式详解

本文字数&#xff1a;7885字 预计阅读时间&#xff1a;45分钟 安卓音视频开发中的一个环节是摄像头采集数据&#xff0c;而 Android 平台上摄像头采集的 API 有两套&#xff0c;camera1 和 camera2。本文主要讲的是 camera2 这套 API 在采集数据并指明 YUV420_888 格式时&#…

软件设计师_面向对象_学习笔记

文章目录 1 面向对象基本概念2 设计模式3 UML4 设计模式4.1 设计模式的基本概念4.2 设计模式的分类4.3 创建型模式 1 面向对象基本概念 2 设计模式 3 UML 4 设计模式 4.1 设计模式的基本概念 模式&#xff1a;通俗的来说就是成功方案的复用。 架构模式从全局看待问题。设计模式…

芯片学习记录TLP291-4

TLP291-4 芯片介绍 东芝TLP291-4由光学耦合到红外LED的光电晶体管组成。TLP291-4光电耦合器安装在非常小而薄的SO16封装中。由于TLP291-4在宽工作温度范围内得到保证&#xff08;Ta-55至110&#xff09;&#xff0c;因此适用于高密度表面贴装应用&#xff0c;例如可编程控制器…

快速排序全面详解

目录 1 基本思想 2 排序步骤 3 代码实现 3.1 区间划分算法&#xff08;hoare初始版本&#xff09;&#xff1a; 3.2 主框架 4 区间划分算法 4.1 hoare法 4.2 挖坑法 4.3 前后指针法 5 快排优化 5.1 取key方面的优化 5.2 递归方面的优化 5.3 区间划分方面的优化 6…

终极Whois查询工具:优雅美观、功能强大、信息全面

1. 引言 这个程序的适用面不是很广&#xff0c;但对于域名爱好者&#xff0c;我想这会是一个不错的工具。 查询一个域名的Whois&#xff0c;这样的工具有很多。但是显示的数据却是有点差强人意&#xff0c;一次偶然的机会发现了 who.cx 这个whois工具&#xff0c;不得不说界面…