新一代的自动化测试利器?puppeteer生态一览

news2024/12/29 10:33:08

puppeteer是chrome官方出品的无界面浏览器,我们一般称为无头浏览器。

这种浏览器具有普通版浏览器的完备功能,并且可以运行在无界面的服务端,比如远程的linux服务器上,是做ui自动化测试的一个不错的选择。

我们今天就来看一下puppeteer的生态,看看除了自动化测试这个工具还能做什么吧。

Puppetron

https://github.com/cheeaun/puppetron,这个项目的功能非常简单,就是使用puppeteer来渲染页面并且进行截图或者是将页面保存成pdf文件。

你可以通过api调用来完成上述的3个功能,渲染/截图以及保存pdf都支持宽高设置,所以你可以很容易的实现模拟不同大小屏幕的功能。

比如你可以通过设置不同的宽高来得到某个网站在小屏手机/大屏手机/平板以及电脑上的屏幕截图。

新一代的自动化测试利器?puppeteer生态一览

pupperender

https://github.com/LasaleFamine/pupperender,pupperender是一个express中间件,它的功能是如果探测到这次页面的访问是来自搜索引擎的机器人或者是爬虫,那么就自动使用puppeteer来渲染页面,返回完整的html。

该工具就解决了一些前后端分离的站点对搜索引擎不友好的问题,因为如果是纯js实现的前端页面,那么搜索机器人爬到的页面仅仅包含一些基本的html,页面的具体内容是没办法正确渲染出来并返回的。

该库的使用也非常的简单,几行代码就可以搞定了。

const express = require('express');
const pupperender = require('pupperender');

const app = express();

app.use(pupperender.makeMiddleware({}));

app.use(express.static('files'));
app.listen(8080);

有困惑的同学可以搜索PWA进行更深入的学习。

headless-chrome-crawler

https://github.com/yujiosaka/headless-chrome-crawler,是使用puppeteer实现的爬虫。

它的一些功能还是非常有特色的,比如:

  • 支持分布式爬取
  • 实现了深度优先和广度优先算法
  • 支持csv和json line格式导出
  • 插件式的结果存储,比如支持redis
  • 自动插入jquery,可以使用jquery语法进行结果处理
  • 支持截图作为爬取证据
  • 支持模拟不同的设备

简单看一个例子:

const HCCrawler = require('headless-chrome-crawler');

(async () => {
  const crawler = await HCCrawler.launch({
    // Function to be evaluated in browsers
    evaluatePage: (() => ({
      title: $('title').text(),
    })),
    // Function to be called with evaluated results from browsers
    onSuccess: (result => {
      console.log(result);
    }),
  });
  // Queue a request
  await crawler.queue('https://example.com/');
  // Queue multiple requests
  await crawler.queue(['https://example.net/', 'https://example.org/']);
  // Queue a request with custom options
  await crawler.queue({
    url: 'https://example.com/',
    // Emulate a tablet device
    device: 'Nexus 7',
    // Enable screenshot by passing options
    screenshot: {
      path: './tmp/example-com.png'
    },
  });
  await crawler.onIdle(); // Resolved when no queue is left
  await crawler.close(); // Close the crawler
})();

上面的例子就演示了使用jquery语法title: $('title').text() 获取页面信息以及模拟特定的设备Nexus 7进行爬取以及截图的功能。

browserless

https://github.com/browserless/chrome。browserless是一个云服务,它允许远程客户端连接并控制在服务器上的无界面浏览器,而这一切都是跑在docker里的。

browserless

你可以使用browserless在自己公司内部搭建这样一套服务,这样就可以实现自己的headless浏览器私有云服务,组织内的任何成员都可以通过脚本去使用浏览器,统一了自动化执行环境并且优化了资源利用率。

browserless的原理如下,有兴趣的同学可以仔细研究一下。

browserless listens for both incoming websocket requests, generally issued by most libraries, as well as pre-build REST APIs to do common functions (PDF generation, images and so on). When a websocket connects to browserless it invokes Chrome and proxies your request into it. Once the session is done then it closes and awaits for more connections. Some libraries use Chrome's HTTP endpoints, like /json to inspect debug-able targets, which browserless also supports.

Your application still runs the script itself (much like a database interaction), which gives you total control over what library you want to choose and when to do upgrades. This is preferable over other solutions as Chrome is still breaking their debugging protocol quite frequently.

puppeteersandbox

https://puppeteersandbox.com,这个站点可以是一个puppeteer的沙盒环境,可以很方便的嵌入到其他的站点或者是markdown文件里。

不过不知道是不是因为网络的原因,这个站点似乎从来就没工作过,好吧,希望早日恢复健康。

jest-puppeteer

https://github.com/smooth-code/jest-puppeteer,是一个几乎只需要零配置的基于puppeteer和jest的ui自动化测试框架。

稍微看一下用例的写法,相信你很快就可以明白这个框架的用处了。

import 'expect-puppeteer'

describe('Google', () => {
  beforeAll(async () => {
    await page.goto('https://google.com')
  })

  it('should display "google" text on page', async () => {
    await expect(page).toMatch('google')
  })
})

// Assert that current page contains 'Text in the page'
await expect(page).toMatch('Text in the page')

// Assert that a button containing text "Home" will be clicked
await expect(page).toClick('button', { text: 'Home' })

// Assert that a form will be filled
await expect(page).toFillForm('form[name="myForm"]', {
  firstName: 'James',
  lastName: 'Bond',
})

可以很方便的断言页面的文字包含,点击以及表单的填写,加上jest灵活的定制能力,该框架的灵活性是值得期待的。

Puppetry

https://puppetry.app 是一款完成度很高的用例录制及执行回放工具,当然了,基于puppeteer。

puppetry开源,跨平台,核心特性很多,这里就不一一列举了。有兴趣的同学可以看一下项目的github主页。

需要重点说明的是,Puppetry官方表示支持的测试场景有下面这么多:

  • 功能测试
  • 测试动态内容
  • 详细测试
  • 性能测试
  • 可视化的回归测试
  • mock api的能力
  • 测试rest api
  • 测试google analytics代码
  • 测试chrome扩展
  • 测试shadow dom
  • 测试邮件

总结

总的来说,开发者对于puppeteer的热情还是很高的,而且puppeteer的更新频率很快,整体生态环境是健康和谐的。

对于大多数同学来说,只需要简单的理解,puppeteer可以实现

  • 爬虫的能力
  • ui自动化测试的能力

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

自动化测试视频教程、学习笔记领取传送门!!!

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

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

相关文章

智慧林业~经典开源项目数字孪生智慧林业——开源工程及源码

东北林业局的工程和源码免费赠送,帮您实现深林防火的智慧林业。 项目介绍 东北林业局作为东北地区林业管理的重要机构,致力于森林资源保护和防火工作。他们的项目通过先进的技术手段,为林业管理提供可靠的解决方案。 本项目使用数字孪生技术&…

2.3 网络安全协议

数据参考:CISP官方 目录 OSI七层模型TCP/IP体系架构TCP/IP安全架构 一、OSI七层模型 简介 开放系统互连模型(Open System Interconnection Reference Model,OSI)是国际标准化组织(ISO)于1977年发布的…

自动化测试po模式是什么

一、什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage:封装一些最基…

Obsidian之与Typora图片格式相互兼容

Typora设置 因为复制到Typora的图片格式默认是markdown的标准格式,所以主要需要设置“优先使用相对路径”即可。使用相对路径而非绝对路径,能确保将md目录拷贝到其他电脑时,图片能够正常显示。 obsidian设置 在“文件与链接”更改这三处设…

122.买卖股票的最佳时机2

一、题目 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector<vector<int>>dp(n,vector<int>(2,0));//0表示第i天不持有股…

提升维修服务体验:探索上门维修小程序开发的优势

随着社会的发展和科技的进步&#xff0c;上门维修小程序的开发为人们提供了更加便捷和高效的维修服务体验。本文将介绍上门维修小程序开发的优势&#xff0c;以帮助人们更好地了解和利用这一便利工具。   1. 快速预约和响应   上门维修小程序允许用户快速预约维修服务&…

一文带你了解TCP/IP模型以及封装和分用

文章目录 1. 网络协议2. OSI七层网络模型3.TCP/IP (五层/四层)4. 封装和分用 1. 网络协议 网络协议是计算机网络中用于规定数据在网络中传输和处理的规则&#xff0c;它定义了在网络中通信的格式、规范和顺序。网络协议可以分为不同的层次&#xff0c;每个层次负责不同的功能和…

常用正则表达式总结(一)

文章目录 前言 一、元字符----字符集 1、[ns] 只匹配n或s。注意&#xff1a;这里[ ]里面的字符与字符之间是或的关系。 2、[a-z]只匹配abcd....xyz&#xff0c;的小写字母。注意&#xff1a;这里的“-”字符是叫做&#xff1a;连字符。是一种简写。只是在括号里生效。 3、[A…

C++运算符重载详解(赋值、流插入流提取、前置后置++、取地址)

C运算符重载详解 基本介绍运算符重载案列1. 赋值运算符重载2. 前置和后置重载3. cout&#xff0c;cin(流插入&#xff0c;流提取重载)4. 取地址重载 基本介绍 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其 返回值…

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件&#xff0c;添加如下内容&#xff1a; #该选项用来开启查询日志&#xff0c;可选值&#xff1a;0或者1&#xff1b;0代表关闭&#xff0c;1代表开启 general_log1 #设置日志的文件名&#xff0…

数组中的第K个最大元 O(N)

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,6,4], k 2…

c语言实现八大排序详细解析

首先先看排序算法的整体分类 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff…

上海市第十人民医院胃肠外科沈通一:以菌为药,非药而愈

6月29日&#xff0c;2023主动健康与临床营养高峰论坛在西安国际会展中心盛大召开&#xff0c;会议汇集了来自国内医学与营养领域杰出的专家学者&#xff0c;交流分享行业的先进理念和研究成果&#xff0c;为主动营养业界与学界能量交换搭建了新接口&#xff0c;以凝聚学术力量&…

嘉立创EDA画爱心

需要用&#xff1a;折线(L)&#xff0c;两点圆弧&#xff0c;三点圆弧(A)&#xff0c;园形(U)等功能 如下就是画出的图形 2D 3D 去除丝印pcb 2d 3d

RocketMQ安装和简单使用

说明&#xff1a;RocketMQ与RabbitMQ一样&#xff0c;是分布式架构中的一个组件&#xff0c;用来解决微服务之间的异步调用。同类的还有两个&#xff0c;各自的特点如下&#xff1a; Rocket结构 服务启动时 发送消息时 其中各个部分的功能如下&#xff1a; &#xff08;1&…

Kubernetes高可用集群二进制部署(三)部署api-server

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

【C#学习笔记】引用类型(2)

文章目录 ObjectEqualsGetTypeToStringGetHashCode string逐字文本复合格式字符串字符串内插 StringBuilderStringBuilder 的工作原理StringBuilder提供的方法访问字符迭代字符查询字符 dynamic Object 支持 .NET 类层次结构中的所有类&#xff0c;并为派生类提供低级别服务。…

设计模式行为型——迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;属于行为型模式&#xff0c;其提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…

leetcode每日一练-第102题-二叉树的层序遍历

一、思路 BFS 二、解题方法 通过广度优先搜索&#xff08;BFS&#xff09;的方式&#xff0c;按层遍历二叉树节点&#xff0c;并将每层的节点值保存在一个一维数组中&#xff0c;然后再将所有的一维数组存储在二维数组中&#xff0c;最后返回二维数组作为层序遍历的结果。 …