首页 > 其他分享 >【JS|第24期】Puppeteer:50个常用操作,你会了吗?

【JS|第24期】Puppeteer:50个常用操作,你会了吗?

时间:2024-08-25 09:57:44浏览次数:9  
标签:24 const log await 50 Puppeteer console page 页面

日期:2024年8月19日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^


文章目录


在这里插入图片描述


一、前言


如需了解基础篇 —— Puppeteer 的安装与使用,请看《Puppeteer:网页自动化利器入门指南》

二、50个常用操作


Puppeteer 提供了丰富的 API 来进行高级交互。以下是一些 Puppeteer 常用的操作及其语法和示例代码:

1. 启动浏览器和打开新页面

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // ...其他操作
  await browser.close();
})();

2. 访问网页

await page.goto('https://example.com');

3. 元素选择和交互

// 选择元素
const element = await page.$('selector');
// 点击元素
await element.click();

// 指定元素点击(合体:选择元素+点击元素)
await page.click('selector');

4. 输入内容

const inputElement = await page.$('input#example');
await inputElement.type('Hello, World!');

// 指定元素输入内容(合体:选择元素+输入内容)
// Types instantly
await page.type('input#example', 'Hello'); 
// Types slower, like a user
await page.type('input#example', 'World', {delay: 100});

5. 获取元素文本

const text = await page.$eval('selector', el => el.innerText);

6. 获取属性值

const value = await page.$eval('selector', el => el.getAttribute('href'));

7. 截图

await page.screenshot({ path: 'screenshot.png' });

8. 等待元素出现

await page.waitForSelector('selector');

await page.waitForSelector('selector', { visible: true });

9. 执行自定义 JavaScript

const domcumentTitle = await page.evaluate(() => {
  // 在页面上下文中执行的代码
  return document.title;
});

10. 设置浏览器视口大小

// 宽1280 × 高720
await page.setViewport({ width: 1280, height: 720 });

// 全屏
await page.setViewport({ width: 0, height: 0 });

11. 登录页面

await page.type('#username', 'myUser');
await page.type('#password', 'myPassword');
await page.click('.submit-button');

12. 使用 cookies

await page.setCookie({ name: 'myCookie', value: 'myValue' });
const cookies = await page.cookies();

13. 模拟设备

await page.emulate(puppeteer.devices['iPhone 6']);

14. 处理页面中的弹出窗口

const [popup] = await Promise.all([
  page.waitForEvent('popup'),
  page.click('#open-popup')
]);
// 在弹出窗口中进行操作

15. 滚动页面

await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));

16. 导航操作

// 前进到下一个页面
await page.goto('https://example.com/page1');
await page.click('a.next'); // 假设有一个指向下一页的链接
await page.waitForNavigation(); // 等待导航完成
// 后退到上一个页面
await page.goBack();

17. 模拟键盘按键

await page.focus('input'); // 焦点移至输入框
await page.keyboard.type('Hello'); // 输入文字
await page.keyboard.press('ArrowLeft'); // 按左箭头键
await page.keyboard.press('Backspace'); // 删除一个字符

18. 模拟鼠标操作

await page.mouse.move(0, 0); // 移动鼠标到页面左上角
await page.mouse.down(); // 按下鼠标左键
await page.mouse.move(100, 100); // 移动鼠标到新位置
await page.mouse.up(); // 释放鼠标左键

19. 监听页面事件

page.on('load', () => console.log('Page loaded!'));
page.on('request', request => console.log('Request:', request.url()));

20. 拦截网络请求

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'image')
    request.abort(); // 中断图片请求
  else
    request.continue(); // 继续其他请求
});

21. 获取网络响应内容

const response = await page.goto('https://example.com');
const body = await response.text();
console.log(body);

22. 使用 Headless 模式

const browser = await puppeteer.launch({ headless: true });

23. 使用 SlowMo 慢动作执行

const browser = await puppeteer.launch({ slowMo: 250 }); // 所有操作延迟250ms

24. 获取页面性能指标

const metrics = await page.metrics();
console.log(metrics);

25. 执行自定义 JavaScript 并获取返回值

const data = await page.evaluate(() => {
  // 运行在浏览器中的代码
  return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight };
});
console.log(data); // { width: ..., height: ... }

26. 截取长图

await page.screenshot({ path: 'long-screenshot.png', fullPage: true });

27. 使用 PDF 功能

await page.pdf({ path: 'page.pdf', format: 'A4' });

28. 监听页面中的 console.log 消息

page.on('console', msg => console.log('PAGE LOG:', msg.text()));

29. 模拟触摸屏事件

await page.touchscreen.tap(100, 200); // 在坐标 (100, 200) 处点击

30. 使用浏览器上下文

const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
// 在无痕模式下操作
await page.goto('https://example.com');

31. 管理多个页面

const firstPage = await browser.newPage();
const secondPage = await browser.newPage();

// 在两个页面间切换操作
firstPage = await browser.pages[0];
secondPage = await browser.pages[1s];

32. 使用浏览器插件

const browser = await puppeteer.launch({
  headless: false,
  args: [
  	'--disable-extensions-except=/path/to/extension', 
  	'--load-extension=/path/to/extension'
  ]
});

33. 设置请求头

await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8'
});

34. 处理页面中的文件上传

const inputElement = await page.$('input[type=file]');
await inputElement.uploadFile('/path/to/file');

35. 监听页面中的 JavaScript 错误

page.on('pageerror', console.error);

36. 获取页面源代码

const content = await page.content();
console.log(content);

37. 使用浏览器缓存

await page.setCacheEnabled(true); // 默认为 true

38. 使用自定义的 userAgent

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3');

39. 获取浏览器版本信息

const browserVersion = await browser.version();
console.log(browserVersion);

40. 检查元素是否可见

const visible = await page.$eval('selector', el => window.getComputedStyle(el).visibility === 'visible');

41. 使用 XPath 选择器

const handle = await page.$x('//div[@class="example"]');
if (handle.length > 0) {
  await handle[0].click();
}

42. 检测元素是否存在

const exists = await page.$('selector') !== null;

43. 使用 CSS 选择器获取多个元素

const elements = await page.$$('selector');
for (const element of elements) {
  console.log(await element.evaluate(node => node.innerText));
}

44. 使用 cookies 前,确保页面已经加载

await page.goto('https://example.com');
await page.setCookie({ name: 'myCookie', value: 'myValue' });

45. 获取页面的 URL

const url = page.url();
console.log(url);

46. 监听页面中的请求完成事件

page.on('requestfinished', request => {
  console.log('Request finished: ', request.url());
});

47. 监听页面中的请求失败事件

page.on('requestfailed', request => {
  console.log('Request failed: ', request.url());
});

48. 使用 evaluateOnNewDocument 在页面加载前注入脚本

await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', {
    get: () => false,
  });
});

49. 使用 evaluateHandle 获取复杂对象

const handle = await page.evaluateHandle(() => ({
  someProp: 'someValue',
  someArray: [1, 2, 3],
}));
const properties = await handle.jsonValue();
console.log(properties);

50. 使用 frame 操作 iframe 中的内容

const frame = page.frames().find(frame => frame.url() === 'https://example.com/iframe');
if (frame) {
  await frame.click('selector');
}

三、结语


Puppeteer 的强大之处在于其灵活性和丰富的 API。通过本文的介绍,我们只是揭开了 Puppeteer 功能的冰山一角。想要更深入地了解和使用 Puppeteer,建议查阅其 《Puppeteer官方文档》,那里有更详细的教程和示例。

最后也是最重要的一点,在使用 Puppeteer 时,请各位务必遵守相关法律法规,不要用于非法爬取数据或者侵犯他人权益。正确地使用 Puppeteer,可以大大提高我们的工作效率,为我们的项目带来便利。


参考文章:


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/141331666

标签:24,const,log,await,50,Puppeteer,console,page,页面
From: https://blog.csdn.net/qq_35844043/article/details/141331666

相关文章

  • Gradle配置全局替换国内镜像(2024版)
    Gradle配置全局替换国内镜像(2024版)Gradle作为一款广泛使用的自动化构建工具,在处理Java、Kotlin等项目的依赖管理和构建过程中起着至关重要的作用。然而,由于网络环境的差异,直接使用Gradle默认的国际仓库可能会导致下载速度缓慢甚至连接失败。为了解决这一问题,配置Gradle使......
  • SP10502 VIDEO - Video game combos 题解
    题目传送门前置知识AC自动机解法多模式串匹配考虑AC自动机。令\(f_{i,j}\)表示前\(i\)个字符,当前运行到AC自动机的状态\(j\)时的最大得分。状态转移方程为\(f_{i,k}=\max\limits_{k\inSon(j)}\{f_{i-1,j}+sum_{k}\}\),其中\(sum_{k}\)表示fail树上以\(k......
  • 2024玩儿转TikTok之环境介绍及独立使用住宅ip搭建,最便宜的网络,20元/月,刚刚更新最新教
    郑重申明:本文章只对合法合理做tiktok视频运营的用户做学习交流使用,有其他使用不当的违规违法行为后果自负!网络的环境测试,必须是独立住宅ip,网络环境优良,tiktok发布作品才能有流量1、选择服务器我选择的服务器:https://ipraft.com/?i71b7cf​​​然后下载FinalShell连接......
  • 2024嵌入式面试:OPPO嵌入式面试题及参考答案
    目录TCP与UDP的区别是什么?请简述TCP的三次握手过程。HTTP协议的工作原理是什么?C++11引入了哪些新特性?什么是智能指针?如何解决其内存泄漏问题?进程间有哪些通信方式?CPU的调度策略有哪些?如何保证线程安全?多线程编程需要注意哪些问题?SPI是什么?它有几条线?支持几种......
  • BaseCTF2024-week1-Crypto部分题目wp
    先放一下官方的wp(我这里只放我出的题):Docs(feishu.cn)babypackfromCrypto.Util.numberimport*importrandomflag=b'BaseCTF{}'m=bytes_to_long(flag)bin_m=bin(m)[2:]length=len(bin_m)a=[1]sum=1foriinrange(length-1):temp=random.randint(2*sum+1,4*su......
  • 百度之星2024总结
    百度之星决赛2024受广东信奥好友影响,了解《绝区零》中格莉丝的“新型空洞内特殊作业用工业机器开发日志”,于是作一记录。开场吃过早饭上位,左右两边都是所认识的同学,没有怎么紧张,复习模板。右边沉石鱼惊旋带了一沓厚厚的纸质打印资料,左边的wmy有一大堆的多项式板子,羡慕。比赛......
  • CSP-S 2024 游记
    壹我有一个朋友叫小W,他最近有点闷。我问他为什么闷,他跟我说他根本就没准备初赛。我说你这么牛,连初赛都不用准备。他说,他在梦中见到了ddz,他问ddz没准备初赛怎么办,ddz给他的答复是:不是,哥们。你都免初赛了还问我干啥啊。贰我喜欢月光。空空,不可控,空空失控。不对,不......
  • 2024-08-24 闲话
    六级写作得了不到130分。yzf说pp写了那么多闲话怎么写作拉了。我也很意外,毕竟第一部分的写作甚至用上了考前背的参考句式(平生第一次做这个事情)。我应该是在六级作文里写了一大堆yspm语,评卷老师不能理解yspm语的高明逻辑,于是打了低分。时间转入了2024年的夏天,yspm写闲......
  • 2024年互联网公司时薪排行榜大曝光!
    2024年互联网公司时薪排行榜重磅出炉!这一次,行业薪资数据的透明度前所未有,看完这份榜单,你会发现互联网圈子的贫富差距竟然如此悬殊,不禁让人直呼“酸了”!在这个人人都关注收入与回报的时代,你是否也好奇,自己所在的公司时薪究竟排在什么位置?哪家公司是真正的“印钞机”,而又有哪些......
  • CF241B Friends 题解
    是异或粽子的超级加强版,但是本题因为\(m\)很大,不能套用那一题的解法。换一种思路:考虑把\(a_i\)从高位到低位插入0-1Trie之后,二分第\(m\)大,通过第\(m\)大求答案。对于二分的一个值\(x\),枚举每个位置\(i\),在0-1Trie上找与\(a_i\)异或值大于等于\(x\)的值的......