参考:https://blog.csdn.net/weixin_33736048/article/details/88020821
参考:https://juejin.cn/post/6844903544919687181
参考:https://www.jianshu.com/p/5d09aefae3b2

参考:https://www.jianshu.com/u/e87383f81f38

参考:https://blog.csdn.net/qupan1993/category_8567616.html
参考:https://www.cnblogs.com/wuweiblogs/p/12913193.html

参考:https://www.lfhacks.com/tech/puppeteer-skip-download-chromium/

参考:https://segmentfault.com/blog/develop_table

参考:https://www.jianshu.com/p/5d09aefae3b2

环境 node v14.12.1

{"name": "1","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC","devDependencies": {"puppeteer": "^10.4.0"}
}

案例一

截图

const puppeteer = require("puppeteer");(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto("https://y.qq.com");// 在跳转之后添加await page.waitForNavigation(); // 等待页面跳转await page.screenshot({ path: "yqq.png" });browser.close();
})();

案例二

// const puppeteer = require('puppeteer');// (async () => {//   const browser = await puppeteer.launch();
//   const page = await browser.newPage();
//   await page.emulate(puppeteer.devices['iPhone 6']);
//   await page.goto('https://www.baidu.cn');
//   await page.screenshot({ path: 'full.png', fullPage: true });
//   await browser.close();
// })();const puppeteer = require("puppeteer");const iPhone = puppeteer.devices["iPhone 6"];
let timeout = function (delay) {return new Promise((resolve, reject) => {setTimeout(() => {try {resolve(1);} catch (e) {reject(0);}}, delay);});
};(async () => {const browser = await puppeteer.launch({headless: false, //这里我设置成false主要是为了让大家看到效果,设置为true就不会打开浏览器});const page = await browser.newPage();// 参数://  {//     'name': 'Galaxy S5', //设备名//     'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36', //UA//     'viewport': {//       'width': 360,//屏幕宽度//       'height': 640,//屏幕高度//       'deviceScaleFactor': 3,//缩放比例//       'isMobile': true,//是否是移动设备//       'hasTouch': true,//是否支持touch事件//       'isLandscape': false//是否横屏//     }//   }await page.emulate(iPhone);console.log("进入页面");//   await page.goto(//     "https://y.qq.com/m/digitalbum/gold/index.html?_video=true&id=2210323&g_f=tuijiannewupload#index/fans"//   );await page.goto("https://www.processon.com/");await timeout(1000);// 在跳转之后添加await page.waitForNavigation(); // 等待页面跳转await page.screenshot({path: "1.png",});//  await page.tap(".js_buyalbum"); //btn_buy js_buyBtn c_btn1 js_buyalbum|js_sale_buyalbumawait page.tap(".collapse-btn"); // 当前第一个await page.screenshot({path: "2.png",});await page.tap(".login_btn"); // 当前第一个console.log("跳转");//   await page.waitForNavigation(); // 页面跳转后等待let dom3 = await page.$("#login_email");await dom3.type("132***2403", { delay: 20 });let dom4 = await page.$("#login_password");await dom4.type("******", { delay: 20 });await page.tap("#signin_btn"); // 当前第一个await page.screenshot({path: "3.png",});console.log("登录");//   await page.goBack();//    # 前进//    await page.goForward()//    # 刷新//    await page.reload()//    # 保存 PDF//   await page.pdf(); x//    # 截图//    await page.screenshot()//    # 设置页面 HTMLawait page.setContent("<h2>Hello World</h2>");//    # 设置 User-Agent//    await page.setUserAgent('Python')//    # 设置 Headers//    await page.setExtraHTTPHeaders(headers={})//    # 关闭//    await page.close()//    await browser.close()return;//   await page.tap(".js_login_select"); //直接操作dom选择器,是不是很方便//   let $dom1 = await page.$$(".js_login_select"); // 数组请求//   await $dom1[0].tap();//   await page.type("132****2403");await page.type("*******"); //这里密码就不展示了哈await page.tap("#onekey");await timeout(3000);await page.screenshot({path: "3.png",});console.log("登录");await page.tap("#u"); //直接操作dom选择器,是不是很方便await page.type("521017853");await page.tap("#p");await page.type("*********"); //这里密码就不展示了哈await page.tap("#go");await timeout(3000);await page.screenshot({path: "3.png",});console.log("登录成功");//点击购买console.log("点击立即购买按钮");await page.tap(".js_sale_buyalbum");await page.screenshot({path: "4.png",});console.log("点击支付浮层上的立即支付");await page.tap(".js_buyalbum_pay");await timeout(5000);console.log("进入 米大师支付浮层");await page.screenshot({path: "5.png",});let $frame = page.mainFrame();let midas_frame = $frame.childFrames()[0]; //获取到midas对应的frameconsole.log("点击确定 米大师支付浮层测试环境提示 的确认按钮");let $dom = await midas_frame.$(".fusion-pm-fl-wrapper .fpm-default");await $dom.tap();await page.screenshot({path: "6.png",});console.log("点击 米大师支付浮层 确认支付按钮");$dom = await midas_frame.$("#wrap .fpm-default");await $dom.tap();await timeout(5000);await page.screenshot({path: "7.png",});console.log("点击 米大师支付浮层 支付完成");$dom = await midas_frame.$("#wrap .btn-primary");await $dom.tap();await timeout(2000);console.log("已购铭牌页");await page.screenshot({path: "8.png",});browser.close();
})();

性能

const puppeteer = require("puppeteer");const iPhone = puppeteer.devices["iPhone 6"];(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.emulate(iPhone);await page.tracing.start({ path: "./trace.json" });await page.goto("https://y.qq.com/m/digitalbum/gold/index.html?_video=true&id=2210323&g_f=tuijiannewupload#index/fans");// 在跳转之后添加await page.waitForNavigation(); // 等待页面跳转await page.tracing.stop();browser.close();
})();

案例三

const puppeteer = require("puppeteer");
let timeout = function (delay) {return new Promise((resolve, reject) => {setTimeout(() => {try {resolve(1);} catch (e) {reject(0);}}, delay);});
};const getSearch = async () => {const browser = await puppeteer.launch({headless: false,// args:['--no-sandbox'] // CentOS 下需要});const page = await browser.newPage();await page.goto("http://m.xbiquge.la/modules/article/waps.php", {waitUntil: "networkidle2",});// await timeout(1000);// page.waitForNavigation();// page.waitForNavigation({ timeout: 480000 });// yazhengma = await page.waitForSelector('#codePic') # 通过css selector定位验证码元素// await yazhengma.screenshot({'path': 'yazhengma.png'}) # 注意这里用的是ele.screenshot方法与教程1 page.screenshot是不同的// await page.waitFor(3 * 1000)// await page.type('#TPL_username_1', '123123', {'delay': input_time_random() - 50})// await page.type('#TPL_password_1', '232322332', {'delay': input_time_random()})// await page.click('#J_QRCodeLogin > div.login-links > a.forget-pwd.J_Quick2Static')// el = await page.querySelector('#nc_1_n1z')// box = await el.boundingBox()// await page.hover('#nc_1_n1z') #鼠标移动方块上// await page.mouse.down() #鼠标拖动操作包括按下、移动、放开// await page.mouse.move(box['x']+1000,box['y'], {'delay': random.randint(1000, 2000),'steps':3})// await page.mouse.up()// browser = await launch({'headless':False})// page = await browser.newPage()// await page.goto('https://www.jianshu.com')// await page.waitFor(3 * 1000)// await page.evaluate('window.scrollBy(0, window.innerHeight)') #淘宝滚动加载用// await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')// await page.waitFor(5 * 1000)// await browser.close()const input_search = await page.$("#s_key");await input_search.type("斗罗");const search_btn = await page.$(".go");await search_btn.click();// await page.goto("http://m.xbiquge.la/modules/article/waps.php", {//   waitUntil: "networkidle2",// });await timeout(1000); // 点击后// yazhengma = await page.waitForSelector(".read_book .block"); // # 通过css selector定位验证码元素// await yazhengma.screenshot({ path: "yazhengma.png" }); //# 注意这里用的是ele.screenshot方法与教程1 page.screenshot是不同的let res = await page.evaluate(() => {let $ = window.$; // window 中的jqlet items = $(".read_book .block");let lsArray = [];let linkArray = [];if (items.length >= 1) {items.each((index, item) => {// jq的方法let ele = $(item);let link = ele.find(".block_img a").attr("href");let image = ele.find(".block_img a img").attr("src");let title = ele.find(".block_txt h2 a").text();// let latestChapter = ele.find('.block_txt p').eq(0).text();// let author = ele.find('.block_txt p').eq(2).text();if (linkArray.indexOf(link) === -1) {title = title.replace(/\s*/g, "");// latestChapter = abstract.replace(/\s*/g,'');// author = author.replace(/\s*/g,'');linkArray.push(link);lsArray.push({link,title,image,// latestChapter,// author});}});}return lsArray;});console.log(res);await browser.close(); //关闭浏览器
};
getSearch();const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch({headless:false});const page = await browser.newPage();await page.goto('https://www.baidu.com/',{waitUntil:'networkidle2'});await page.waitFor('#u1');// 得到百度右上角的标题和相应的URL网址const result = await page.evaluate(() => {let data = []; // 初始化空数组来存储数据let elements = document.querySelectorAll('#u1 > a'); // 获取所有元素for (var element of elements){let title = element.innerText; // 获取标题let url = element.href;//获取网址data.push({title,url}); // 存入数组}return data;});console.log(result);//打印出信息await page.waitFor(3000);await browser.close();
})();

案例四

const puppeteer = require('puppeteer');const html = `
<html><body><div id="element">element inner html</div></body>
</html>`;(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto(`data:text/html,${html}`);try {await page.waitForSelector('#element', { timeout: 1000 });const element = await page.$('#element');console.log(await (await element.getProperty('innerHTML')).jsonValue());} catch (e) {console.log('element probably not exists');}await browser.close();
})();

案例五

xhr = 'http://www.yoursite.com/api'
await btn.click()
await page.waitForResponse(res => {return res.request().url().startsWith(xhr) &&res.ok()
})xhr = '/api'
await btn.click()
await page.waitForResponse(res => {return res.request().url().includes(xhr) &&res.ok()
})

puppeteer 初步实战 测试相关推荐

  1. Android 系统(212)---monkey实战–测试步骤、常用参数、常规monkey命令

    monkey实战–测试步骤.常用参数.常规monkey命令 [转]monkey实战–测试步骤.常用参数.常规monkey命令 ***(本文转自:https://blog.csdn.net/u01164 ...

  2. 微信公众账号第三方平台全网发布源码(java)- 实战测试通过

    微信公众账号第三方平台全网发布源码(java)- 实战测试通过 (更多资料,关注论坛:www.jeecg.org) 技术交流请加:289709451.287090836 package org.jee ...

  3. 150.网络安全渗透测试—[Cobalt Strike系列]—[DNS Beacon原理/实战测试]

    我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录 一.DNS Beacon原理 1.DNS Beacon简介 2.DSN Beacon工作原理 二.DNS Bea ...

  4. Python量化交易+网格技术分析及实战测试

    主要目标 使用Python爬取股票数据 数据清洗并上传至HDFS 使用PyHive对股票数据进行分析 Python数据分析-量化交易 股票量化交易分析 使用Python爬取股票数据 我们这次的目标地址 ...

  5. Jenkins 之 单节点 对接GitHub搭建自动化部署项目环境 与 实战测试 (三)

    Jenkins 之 单节点 对接GitHub搭建自动化部署项目环境 与 实战测试 (三) 目录 Jenkins 之 单节点 搭建自动化部署项目环境 与 实战测试 (三) Jenkins 服务器 环境 ...

  6. FLIR高端热像仪T640实战测试

    FLIR高端热像仪T640实战测试 在8楼办公室,俯瞰莲花路上的车流,如一道道彩虹,闪耀着宽阔的马路. 为确保设备可靠运行,您需要可靠的故障排除工具,以帮助您快速查找并报告问题.这正是FLIR红外热像 ...

  7. [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%

    系列文章目录 深度学习NLP(一)之Attention Model; 深度学习NLP(二)之Self-attention, Muti-attention和Transformer; 深度学习NLP(三) ...

  8. 刨根问底:MySQL索引篇之千万级数据实战测试

    今天中午我这边只有半个小时时间,再过半个小时,得带着孩子去我妈那吃饭,就拿我给学生讲的案例,给大家直入主题讲一下吧- MySQL索引创建 先说明一个问题啊,如果你创建数据表时创建了主键,此时主键列会自 ...

  9. AI软件写作实战测试:写作技巧 - 让智能写作助手变得更加智能化?

    最近测试了一些AI软件,市面上很多分列各种AI软件的推荐,但是对于AI软件写作的一些技巧,比较缺乏分析和总结.本文尝试从自身实践出发,分享个人的一些感受.具体写效果可以查看如下视频: AI智能写作软件 ...

  10. 万字以上的电商项目 Jmeter 脚本实战测试开发详细讲解

    目录 一.前置工作 1.黄金流程 2.Jmeter安装 二.脚本实战开发 1.用户注册链路 2.用户下单链路 一.前置工作 1.黄金流程 在做性能脚本之前,先了解下这本次性能实战业务,简要说明本次使用 ...

最新文章

  1. jszip压缩服务器文件,使用JSZip压缩驻留在服务器上的PDF
  2. python实现链表的删除_Python垃圾回收机制
  3. SQL UNION 和 UNION ALL 操作符(mysql)
  4. Java 8中的策略模式
  5. leetcode 664. 奇怪的打印机(dp)
  6. SWT学生成绩管理系统
  7. 大数据之-Hadoop3.x_MapReduce_官方WordCount源码和序列化类型---大数据之hadoop3.x工作笔记0085
  8. 知了堂学习笔记-CSS样式整理(一)
  9. android真实项目教程(七)——梦醒边缘花落_by_CJJ
  10. (9)Redis-Cluster集群理论及实践【下】
  11. qq四国军旗2.1 beat03 builde018记牌器开发思路(四)
  12. OpenWrt之DNS域名解析系统(/etc/resolv.conf)
  13. ectouch手机版去除微信登录
  14. 谷歌与Facebook的关系数据库之战
  15. 【分布式版本控制系统】GIT 托管网站 客户端
  16. 手机怎么更改html打开方式,安卓如何更改文件打开方式?
  17. 微信小程序 判断身份证号码正确(封装成公共方法并使用)
  18. 如何思考总结,并如何写文档展示. 结构化思考, 金字塔思维
  19. reference_line_provider
  20. 计算机专业术语session,Session

热门文章

  1. 2021年茶艺师(初级)证考试及茶艺师(初级)理论考试
  2. twitter关注排行榜
  3. 没有对象怎么面向对象编程呢?真让人头秃!
  4. ERP、SCM、CRM的区别和联系
  5. 金莹江苏省计算机学会教授,第二届江苏省青年计算机精英论坛”在江南大学举行...
  6. 入门 HTML JavaScript Jquery学习回顾 有小案例
  7. 2017计算机办公自动化试题,【2017年整理】计算机办公自动化试题.doc
  8. 降维分析:人类发展指数法(IFI法)
  9. 怎样创建和提交谷歌站点地图?
  10. python PIL 图像增强