-
Notifications
You must be signed in to change notification settings - Fork 13
Puppeteer:模拟浏览器操作行为的利器 #38
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
每次滚动100有点慢,我直接让每次滚动document.body.scrollHeight,同时调高了时间间隔。 感谢你的代码。 |
@akeyboardlife ,有帮助就好,客气了! |
赞! |
终端请求少了一行代码否则不生效
|
@yiqiesuiyuan Yes, it works well after adding |
请问可以转载么,会注明出处和链接 |
@yifeikong ,可以的。 |
如何模拟设置下拉列表的值,甚至下拉列表是联动ajax关联请求的 |
@yangweijie ,这个得具体情况具体分析。如果是类似于地址关联的下拉框。可以等前面的下拉框变动之后,等待2秒钟,再去设置后面的下拉框值。这些在 puppeteer中都是有相关api的,可以查看一下。 |
问题就不知道怎么让前面的下拉框变动,keyboard.type无效,要写额外js设置值吗? 有的下拉可能 是其他js框架渲染的, 比如 这一个注册界面的 省市 下拉 http://interactive.cponline.cnipa.gov.cn/app/03_jh/login/register-qiye.jsp |
@yangweijie ,我其实也好久不看它的文档了。刚才翻了一下文档,看到这个方法:https://pptr.dev/#?product=Puppeteer&version=v1.18.1&show=api-pageselectselector-values,估计可能对你有用。 |
大佬有遇到截出来的图是空白么?用了你提供的方法,查了半天也不知道从何下手 |
把 headless 设置为 true 就好了,感谢感谢 |
我尝试了设置了headless为true,还有滚动截图和fullPage: true,但是我截出来的图还是有白色的一段,我截的图片是偏大的有10000*20000,请问有什么方法可以解决吗? |
估计是图片太大,在截屏的时候还没有完全加载出来 |
@v2x2 是不是在截图的时候页面还没加载完成 下面是我的例子 🌰: 导出 PDF, 页面的长度取决于数据多少,数据是由 Api 加载的, 所以导致页面大小不确定,等待 api 加载完,页面重新渲染完成,再指定 导出的高度。
|
Puppeteer 出自于 GoogleChrome 团队,是一个可以用来模拟 Chrome 浏览器各种操作行为的 nodejs 库,基于谷歌的开发工具协议。
它可以用来模拟你在浏览器中大多数常见操作,比如:
Puppeteer 运行依赖的 nodejs 版本最低是
6.4.0
,但是由于示例中使用了async/await
的特性,所以我建议你使用7.6.0
以及更高的版本。安装 Puppeteer
截屏示例
第一个示例:自动跳转到 https://example.com 并生成一张截图:
Puppeteer 设置的默认可视区域大小是
800*600
像素。上面示例中的网站页面小于这个尺寸,可以完整的截取出来。但是,你换成http://www.jd.com
就不行了,所以,我们得使用page.setViewport()
方法来重新定义可视区域的大小。运行查看截图,发现只是完整的截取了第一屏,后面几屏的怎么办?
page.screenshot()
方法提供了一个fullPage
参数,用来设置截取整个页面。截取的确实是整个网站页面,但是有些楼层使用了懒加载机制,导致这些楼层就没有截取出来。解决办法就是能够让页面自动从顶部滚动到底部之后,再去进行截取,所以我们需要自己编写一个
autoScroll()
方法。重点解释一下
autoScroll()
方法的实现。totalHeight
用来记录页面的当前高度,初始值为0。distance
用来表示每次向下滚动的距离,这里为100像素。接着使用了一个定时器,每隔100毫秒向下滚动distance
设定的距离,然后累加到totalHeight
,直到它大于等于页面的实际高度document.body.scrollHeight
之后,才会清除定时器,并将Promise
对象的状态置为resolve()
。页面滚动完成之后,后面的处理跟上面一样了,直接执行截屏操作就可以了。
模拟用户输入与鼠标事件
上面已经说过,puppeteer 还可以模拟键盘的输入操作和鼠标单击事件,基于这些我们可以自然想到可以用它模拟表单提交操作。
编写了一个简单的 html 页面来模拟表单:
在文本框中自动输入一串数字,然后自动点击提交按钮。我们用到了 puppeteer 的
page.type
和page.click
方法,前者用于模拟输入,后者用于模拟单击操作。puppeteer.launch()
方法在之前的版本中有一个devtool: true
参数,可在页面中自动打开 Chrome 的开发者工具。可是后面的版本,不知道什么原因给去掉了。如果你现在还有此需求,可以这样写:可以使用
page.emulate()
方法来模拟各种移动设备。最重要的是userAgent
参数,因为服务器一般都是根据这个参数值来决定显示的页面类型的。此外,还有
page.hover()
用来模拟 mouseover 的操作;page.reload()
用来模拟刷新操作;page.title()
用来获取网页标题。这些大家都可以自己去使用挖掘一下。过滤页面中的元素
有时候我打开一个网页可能只是想分析它里面的超级链接,并不想让页面加载图片,这可以大大加快页面的访问速度。所以,你可以给页面绑定一个
request
的事件,可以通过它的回调函数参数获取到当前页面加载的每一个请求,并加以处理。我们这里就可以根据它的
url()
来判断当前请求是图片的话,直接将其abort()
,否则continue()
即可。创建隐私模式
官方文档
The text was updated successfully, but these errors were encountered: