puppeteer 之chromium版本问题
最近使用puppeteer模拟用户操作,填了不少的坑,写出来分享一下。
puppeteer包
使用npm i puppeteer
来下载puppeteer的时候,会自动下载依赖的chromium,但因为众所周知的原因,很难下载,那能不能先下载好再直接引入呢,也可以移植使用。
官方提供2个包一个puppeteer,另外一个是puppeteer-core。puppeteer-core不会自动下载chromium,以及PUPPETEER_* 环境变了都不起效。这个就是我们想要的包。官方提供两个包的差别puppeteer vs puppeteer-core。
执行npm i puppeteer-core
下面是使用的代码1
2
3
4
5
6
7
8
9
10
11
12const puppeteer = require('puppeteer-core');
async () => {
const browserPath = '../../../chrome-mac/Chromium.app/Contents/MacOS/Chromium'
const browser = await puppeteer.launch(
{
headless: false,
slowMo: 250,
devtools: true,
executablePath: browserPath,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
}
其中一个我遇到比较大的容易错的地方就是executablePath是一个相对地址,当时怎么执行都不行,因为写了一个绝对路径。
这里mac的Chromium要指向Chromium.app/Contents/MacOS/Chromium,也是很容易出错。
Chromium版本
我还遇到一个问题,如果不同操作系统的部署nodejs,网络情况不能自动下载chromium,我随便系统找个版本是不是就行了?
我也试过了,我本来想在树莓派上部署,但树莓派的linux是32位的,上面的chromium也是很长时间之前的的,花了很长时间搞环境,发现不支持puppeteer,每个版本的puppeteer需要绑定版本的chromium,当时真的很崩溃,所以我决定提前下好chromium,按版本放到不同系统里,这样就统一的chromium版本,不会出现不见兼容的问题。
chromium版本查看package.json里的1
2
3"puppeteer": {
"chromium_revision": "609904"
},
这个里面就是依赖的版本号。然后去chromium发布库,输入版本号‘609904’,去搜索,这个网站很慢,会从第一个版本一点点搜索,我看了一下请求,每个请求100个数组,一点点遍历数据。
下载好不同系统的同一个版本的chromium后,通过上面的executablePath参数来引入chromium运行。不同操作系统的运行程序不太一样,需要找到对应的执行文件。