Puppeteer基础知识(一)

news2024/11/18 11:29:52

Puppeteer基础知识(一)

在这里插入图片描述

    • Puppeteer基础知识(一)
        • 一、简介
        • 二、其他一些自动化测试工具
        • 三、Puppeteer常用命令
        • 四、常见问题解决:

一、简介

Puppeteer 是一个强大而灵活的工具,可以用于网页爬虫、自动化测试、性能分析等场景。能够模拟用户行为、拦截网络请求、处理弹窗、模拟设备等,可以让我们更灵活地控制浏览器和页面。不仅能够启动web进行测试,也能够启动web H5 模拟器进行测试。

二、其他一些自动化测试工具

● Selenium/WebDriver 专注于跨浏览器自动化;它的价值主张是一个适用于所有主要浏览器的单一标准 API。多种语言支持。官网地址:https://www.selenium.dev/zh-cn/documentation/

● Puppeteer 比较轻量化,专注于 Chromium;其价值主张是更丰富的功能和更高的可靠性。官网地址:https://pptr.dev/

● nightmare 链式调用方式,已经不再维护。官网地址: https://github.com/segment-boneyard/nightmare

Selenium/WebDriver代码格式

const {Builder, By, Key, until} = require('selenium-webdriver');

(async function example() {
  let driver = await new Builder().forBrowser('firefox').build();
  try {
    await driver.get('http://www.google.com/ncr');
    await driver.findElement(By.name('q'));.sendKeys('webdriver', Key.RETURN);
    await driver.wait(until.titleIs('webdriver - Google Search'), 1000);
  } finally {
    await driver.quit();
  }
})();

Puppeteer代码风格

const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
});

Nightmare 代码风格:链式调用方式https://github.com/segment-boneyard/nightmare

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })

nightmare
  .goto('https://duckduckgo.com')
  .type('#search_form_input_homepage', 'github nightmare')
  .click('#search_button_homepage')
  .wait('#r1-0 a.result__a')
  .evaluate(() => document.querySelector('#r1-0 a.result__a').href)
  .end()
  .then(console.log)
  .catch(error => {
    console.error('Search failed:', error)
  })
三、Puppeteer常用命令

中文文档: https://puppeteer.bootcss.com/api#class-browserfetcher

常用命令

  • 选择器
    page.$(selector)
    page.$$(selector)
    它们的功能类似于document.querySelector和document.querySelectorAll。
const frontEnd = await page.$('span[data-type=frontend]');
frontEnd.click();
  • 等待几毫秒
await page.waitFor(500); 
  • 等待某个 JavaScript 函数返回 true
await page.waitFor(() => !document.querySelector('.ant-spin.ant-spin-spinning'));
  • 向某个 Input 中输入字符
await page.type('#username', '18154');
await page.type('#session_email_or_mobile_number', userName);
  • 点击某个节点
await page.click('#btn-submit');
  • 截取网页的屏幕截图
    备注 在OS X上 截图需要至少1/6秒。
await page.screenshot({ path: '../images/publishClick.png', fullPage: true });

  • 生成 PDF 文件
    await page.pdf({path: ‘example.pdf’});

  • 在浏览器中执行一段 JavaScript 代码
    await page.evaluate(() => alert(‘1’));

  • 返回页面的完整 html 代码,包括 doctype。
    await page.content()

  • 返回操作
    await page.goBack([options])

  • 获取当前页面的标题
    await page.title();

  • 获取某一个节点的某个属性
    const searchValue = await page.KaTeX parse error: Expected 'EOF', got '#' at position 7: eval('#̲search', el => …eval(‘link[rel=preload]’, el => el.href);
    const text = await page. e v a l ( ′ . t e x t ′ , e l = > e l . t e x t C o n t e n t ) ; c o n s t h t m l = a w a i t p a g e . eval('.text', el => el.textContent); const html = await page. eval(.text,el=>el.textContent);consthtml=awaitpage.eval(‘.main-container’, e => e.outerHTML);

  • 获取某一类节点的某个属性集合
    const textArray = await page.$$eval(‘.text’, els => Array.from(els).map(el => el.textContent));

事件监听

  • 监听发出的网络的请求
    page.on(‘request’)

  • 监听收到的输出,用于打印
    page.on(‘console’, msg => console.log(‘PAGE LOG:’, msg.text()));

四、常见问题解决:
  1. https://pptr.dev/troubleshooting

以上就是基础知识的学习。


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

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

相关文章

大数据Doris(六):编译 Doris遇到的问题

文章目录 编译 Doris遇到的问题 一、js_generator.cc:(.text+0xfc3c): undefined reference to `well_known_types_js’

华为云新开源低代码引擎 TinyEngine

在当今数字化飞速发展的时代,企业对高效、敏捷的应用程序需求日益旺盛。为了满足这一需求,越来越多的低代码开发平台开始涌现。这些平台通过提供简单易用的开发工具和优化后的开发流程,帮助开发者快速构建高质量、可重复使用的应用程序&#…

Suricata + Wireshark离线流量日志分析

Suricata 环境搭建:基于Ubuntu坏境下的Suricata坏境搭建_奈何@_@的博客-CSDN博客 suricata:监控日志 wireshark:监控流量 同时使用需要降噪,因为规则有许多重叠 题目及要求我打包上传了,有需要的同学自…

十一工具箱流量主小程序源码

无授权,去过滤机制版本 看到网上发布的都是要授权的 朋友叫我把他去授权,能用就行 就把过滤去了 这样就不用授权 可以免费使用 白嫖党专属 一切接口可用,无需担心不能用 授权者不关站一直可以用 源码下载:https://download.csdn.…

彻底理解浏览器cookie策略

cookie介绍 为什么存在cookie? (1)cookie存在的原因 因为http请求是无状态的,同一个用户从浏览器向A服务器发送两次请求,A服务器无法判断这两次请求是否是同一个用户。所以,浏览器提供了客户端携带cooki…

threejs 透明贴图,模型透明,白边

问题 使用Threejs加载模型时,模型出现了上面的问题。模型边缘部分白边,或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时(一个透贴和其他贴图&#xff0…

互联网Java工程师面试题·Redis篇·第一弹

目录 1、什么是 Redis? 2、Redis 优势 3、Redis 与其他 key-value 存储有什么不同? 4、Redis 的数据类型? 5、使用 Redis 有哪些好处? 6、Redis 相比 Memcached 有哪些优势? 7、Memcache 与 Redis 的区别都有哪些&#xf…

MyBatisPlus(十四)主键策略

说明 MyBatis Plus 集成了多种主键策略,帮助用户快速生成主键。 雪花算法ID(默认策略)(推荐)UUID自增ID用户输入ID(必须用户每次插入数据时,手动传入ID) 雪花算法ID:I…

ModelScope-agent体验

7月在魔搭社区hackathon的时候就了解到了魔搭在做的这件事,前段时间开源了,去体验一 本文写的很浅,没有做深入尝试 一.在线体验 体验地址:https://modelscope.cn/studios/damo/ModelScopeGPT/summary 效果还是挺惊艳的 二.部署…

认识File 类和InputStream, OutputStream

Java中通过file类来对一个文件(包括目录)进行抽象的描述。并且有File类对象,并不代表真实存在该文件。认识File类,就先了解File类的属性,构造方法,方法。 属性: 修饰符及类型 属性 …

最全最详细最高质量 java 面试题

“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址 面试题手册 面试题手册 学习建议 最全最详细最高质量 java 面试题,建议不要死记硬背,每天过一下&#xf…

el-tabs(标签栏)的入门学习

el-tabs(标签栏)的入门学习 适用场景 与导航栏相似,项目中常见的是点击某个导航栏,主页面(el-main)模块的最上方会显示我们的标签栏集合,点击不同的导航栏,标签栏会在不断追加,若点击到标签集合…

micro-ROS中对消息的内存管理

文章目录 1.背景2.答案2.1.基本类型及其数组,不需要2.1.序列类型(复合类型、复合序列类型),需要 3.内存申请方法3.1.手动申请(Manual allocation)3.1.工具辅助(micro-ROS utilities)…

css入门知识点

CSS&#xff08;层叠样式表&#xff09;完整知识点 1. 什么是CSS&#xff1f; <a id"what-is-css"></a> CSS是一种用于描述网页上元素样式和布局的样式表语言。它使开发人员能够控制网页的外观和排版&#xff0c;从而提供更好的用户体验。 2. CSS基础…

基于毫米波雷达的可行驶区域检测(Freespace)

说明 随着具备测高能力、更高角度分辨率、更远检测范围的4D毫米波雷达的出现&#xff0c;很多之前只能用摄像头/激光雷达做的事毫米波雷达也开始涉足(并且可以做得很好)&#xff1a;比如目标识别、SLAM、以及本博文将要讨论的可行驶区域检测(Freespace)。以往(至少是我个人)对于…

一、动态规划简单实例

【题目】 当我们给定一个简单序列[1、5、2、4、3]&#xff0c;现在要求输出该序列中&#xff0c;最大子序列的长度&#xff0c;子序列要求从小到大&#xff0c;元素下标可以跳跃&#xff0c;例如子序列[1、2、3]。 【实现方式(暴力实现)】 1、先定义一个函数L(nums,i)&#x…

C# 给某个方法设定执行超时时间

C# 给某个方法设定执行超时时间在某些情况下(例如通过网络访问数据)&#xff0c;常常不希望程序卡住而占用太多时间以至于造成界面假死。 在这时、我们可以通过Thread、Thread Invoke&#xff08;UI&#xff09;或者是 delegate.BeginInvoke 来避免界面假死&#xff0c; 但是…

RocketMQ 基于时间轮算法实现指定时间点的定时消息原理解析

在 RocketMQ 4.x 版本&#xff0c;使用延时消息来实现消息的定时消费。延时消息可以一定程度上实现定时发送&#xff0c;但是有一些局限。 RocketMQ 新版本基于时间轮算法引入了定时消息&#xff0c;目前&#xff0c;精确到秒级的定时消息实现的 pr 已经提交到社区&#xff0c…

unity中绑定动画的行为系统

主要代码逻辑是创建一个action队列,当动画播放结束时就移除队头,执行后面的事件 public class Enemy : MonoBehaviour {public event Action E_AnimatorFin;//当动画播放完毕时public Action DefaultAction;//默认事件public Dictionary<Action, string> EventAnimator n…

数据科学最佳实践:Kedro 的工程化解决方案 | 开源日报 No.47

leonardomso/33-js-concepts Stars: 58.4k License: MIT 这个项目是一个帮助开发者掌握 JavaScript 概念的资源库。该项目基于 Stephen Curtis 撰写的一篇文章&#xff0c;包含了对 33 个重要 JavaScript 概念全面深入地讲解&#xff0c;并被 GitHub 评为 2018 年最佳开源项目…