Puppeteer-常规操作一
这里不讲
Puppeteer
怎么使用,主要讲一些常规操作在这里如何通过另类方法实现。等实现后,你就会感觉,嗯~~ 真香!
场景一
已经找出要的元素,现在有需求再继续寻找他的子元素
- 第一种、将父元素带入
evaluate
事件中
// 已经找出父元素
const foo = await page.$('.foo');
// 将父元素带入 `evaluate` 事件中,通过原生方法继续后续操作
const bar = await page.evaluate(fooEle => fooEle.querySelector('.bar'), foo);
这里的 evaluate
好处就是 callback 里面可以通过原生js进行操作,callback 后面的 argument
以逗号形式分割,顺序传入 callback 中。
- 第二种、继续通过原本的操作
// 已经找出父元素
const foo = await page.$('.foo');
// 继续通过原本的操作
const bar = await foo.$('.bar');
这里比较通俗易懂,page
找出的对象后面其实是继续给了 page
的所有方法,但由于 page
大部分方法都是异步 <Promise>
的,所以必须等待完成才可以操作,不能使用链式操作。
这里主要看习惯哪一种操作,第一种的好处习惯原生js,但是大部分操作只能在 callback 中操作,类似 page.$eval
等操作;第二种的好处是直接操作,不含糊,让人觉得更舒服一点,不管以后做输入还是点击,都非常方便。
场景二
每次做点击/输入之前都要进行验证即将操作对象是否存在
// 封装需要等待
// 等待出现
const waitPre = async(st) =>
await page.waitFor(selector =>
!!document.querySelector(selector), {}, st);
// 等待消失
const waitFade = async(st) =>
await page.waitFor(selector =>
!document.querySelector(selector), {}, st);
await waitPre('.foo'); // await page.waitFor('.foo');
await page.click('.foo');
// await waitPre('.foo');
// dosomething...
这里不做过多解释,非人操作都很快,不像人一样还看到后再操作。
场景三
当点击造成页面跳转或者重新加载时,需要等待页面加载完成。
const [response] = awiat Promise.all([
page.waitFroNavigation(),
page.click('.btn'), // 点击导致页面跳转(重载)
]);
response
response
是加载dom时的响应对象。
场景四
当主动让页面跳转(重载),而且这里也需要监听重载后的某个请求的响应对象。
- 第一种、等待
reload
完成后再监听
await page.reload(); // 也可以加option,但这里想到要监听某个请求,故为空
await const response = await page.waitForResponse(response => {});
response
这种监听方式有可能会漏掉某些请求。
- 第二种、直接通过
on
监听
page.on('response', response => {});
await page.reload();
这里的监听无任何限制,无论页面做什么操作,都不会逃过 on
的法眼。
场景五
我想删除所有文本,这里只能通过 keyboard
来实现。
- 第一种、计算长度,逐个删除
const cls = '.foo';
await page.waitFor(cls);
await page.focus(cls);
const len = await page.$eval(cls, el => el.textContent.length);
for (let i = 0; i < len; i++) {
await page.keyboard.press('Backspace');
}
await page.type(cls, 'something');
通过循环删除,不推荐
- 第二种、计算长度,选中,删除
const cls = '.foo';
await page.waitFor(cls);
await page.focus(cls);
const text = await page.$eval(cls, el => el.textContent.length);
await page.keyboard.down('Shift');
for (let i = 0; i < text.length; i++) {
await page.keyboard.press('ArrowLeft');
}
await page.keyboard.up('Shift');
await page.keyboard.press('Backspace');
await page.type(cls, 'something');
循环选中,一次性删除。
- 第三种、全选,一次性删除
const cls = '.foo';
await page.waitFor(cls);
await page.focus(cls);
const text = await page.$eval(cls, el => el.textContent.length);
await page.keyboard.down('ControlLeft');
await page.keyboard.press('KeyA');
await page.keyboard.up('ControlLeft');
await page.keyboard.press('Backspace');
await page.type(cls, 'something');
Mac os x 上这里未实现,这种方法不可用。目前推荐使用第二种方法,等官方消息。
Mac os x 上 ⌘
不支持。
Puppeteer-常规操作一的更多相关文章
- FTP服务器常规操作
导读 FTP协议是Internet文件传输的基础,它是由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据.下面就由我给大家简单介绍一下 ...
- Apache服务器常规操作
导读 Apache是世界上排名第一的Web服务器,50%以上的Web服务器都在使用Apache,它几乎可以在所有计算机平台上运行.下面就由我给大家说说Apache服务器的一些常规操作. Apache服 ...
- mysql服务器的常规操作
mysql服务器的常规操作 导读 MySQL是一个小型关系数据库管理系统,目前被广泛的应用在Internet上的中小型网站中,体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,使得许多中小型网站 ...
- 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...
- Mongodb常规操作【一】
Mongodb是一种比较常见的NOSQL数据库,数据库排名第四,今天介绍一下Net Core 下,常规操作. 首先下C# 版的驱动程序 "MongoDB.Driver",相关依赖包 ...
- C#通过Ado.net对连接数据库并进行添加删除等常规操作的代码
如下资料是关于C#通过Ado.net对连接数据库并进行添加删除等常规操作的内容. static string sqlcon = "server=.;database=;Integrated ...
- react-native 常规操作
1. 关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7
- Linux 下的 netfilter 认识与常规操作
Linux 下的 netfilter 认识与常规操作 前言 博客写到今天,1年7个月.可是包含所有写作经历,这个时间线可以达到三年. 上次更新了一篇 "镇站之宝" ,也是本站阅读量 ...
- 数据库mysql的常规操作
1. 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进 ...
- Learn Docker(一)—软件安装与常规操作
一.安装Docker Windows平台 在Windows10 X64专业版上可以直接下载Docker原生应用进行安装,在控制面板的程序与功能里启用Hyper-v,之后就可以运行docker程序啦. ...
随机推荐
- HDU 2063 过山车+poj 1469
//这是一个非常简单的匹配.其实满感觉这种算法讲道理是可以想到. //但是我们这种弱就只能先学了匈牙利算法,然后随便嗨这种题目了.没事结果都一样. //这就是匹配算法的DFS形式,有一个BFS形式的, ...
- android的logcat的message有字符长度的限制,超过将直接截断
http://blog.csdn.net/qidizi/article/details/47291803 今天想在logcat中输出足够多的调试信息时,发现从logcat中返回的信息中明显少了后面一节 ...
- 一篇文章搞定面试中的链表题目(java实现)
最近总结了一下数据结构和算法的题目,这是第二篇文章,关于链表的,第一篇文章关于二叉树的参见 废话少说,上链表的数据结构 class ListNode { ListNode next; int val; ...
- MVC和MTV结构分析
@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@ ...
- HDU6446(树上、排列的贡献计算)
关键点在于:全排列中,任意两点u.v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二:或者用n! / C(2, n)). 这之后就好算 ...
- css新奇技术及其未来发展
1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...
- qconshanghai2017
https://2017.qconshanghai.com/schedule 第一天 (2017/10/17 星期二) 时间 日程 07:45-09:00 签到 上午 主题演讲 软件质量优化与平台创新 ...
- Java_面向对象中的this和super用法
this: 1.使用在类中,可以用来修饰属性.方法.构造器 2.表示当前对象或者是当前正在创建的对象 3.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加 this 来表明该变量时类成 ...
- ios 微信环境 axios请求 status 0
做了一个支付页面,调用post请求但是请求status 0,出现这个的原因居然是https的网页请求http的数据. 但是这个再ios里面不会报错,安卓正常. 记录一下客户端的这个特征!
- 学习Python的day1
自己以前从来没有写博客的想法,但是学Python,里面的老师也说了,写博客可以加深自己的记忆,也能回顾内容.还能给别人参考.挺值的.2017-09-16 一. Python介绍 python的创始人为 ...