环境:win10+nodev8.11.3++npm5.6.0 (python3.6) 不是相似环境的,直接离开,别浪费时间。
手上用的框架是面向原生APP设计的,作自动化时,遇到微信小程序控件信息难以定位的问题,网上介绍puppeteer可以处理该问题,于是安装来验证一下可行性,先安装踩一下坑,以及解决办法,后面再进行验证。
问题1:提示更新npm,那么久更新吧!没什么好说的。
C:\Users\X>npm i puppeteer
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\X\package.json'
npm WARN X No description
npm WARN X No repository field.
npm WARN X No README data
npm WARN X No license field.
npm ERR! Cannot read property '0' of undefined
╭─────────────────────────────────────╮
│ │
│ Update available 5.6.0 → 6.4.0 │
│ Run npm i npm to update │
│ │
╰─────────────────────────────────────╯
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\X\AppData\Roaming\npm-cache\_logs\2018-08-26T09_54_48_048Z-debug.log
问题2:npm无法更新
C:\Users\X>npm i npm
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\X\package.json'
npm WARN X No description
npm WARN X No repository field.
npm WARN X No README data
npm WARN X No license field.
npm ERR! Cannot read property '0' of undefined
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\X\AppData\Roaming\npm-cache\_logs\2018-08-26T09_55_34_149Z-debug.log
那么就用: cnpm install npm -g 解决 ,附上cnpm安装方法:
npm install -g cnpm --registry=https://registry.npm.taobao.org
问题3:更新npm后依然不能安装puppeteer:
C:\Users\X>npm i puppeteer
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\X\package.json'
npm WARN X No description
npm WARN X No repository field.
npm WARN X No README data
npm WARN X No license field.
npm ERR! Cannot read property '0' of undefined
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\X\AppData\Roaming\npm-cache\_logs\2018-08-26T10_03_08_555Z-debug.log
查了一圈,最简单解决办法: cnpm i puppeteer (别问为什么,其他我都试过了)
问题4:无法下载Chromium
ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
只要在处理问题3时,使用我推荐的方法就没有问题4了。
C:\Users\X>cnpm i puppeteer
√ Installed 1 packages
√ Linked 39 latest versions
Downloading Chromium r579032 - 127.7 Mb [====================] 100% 0.0s
Chromium downloaded to C:\Users\X\node_modules\[email protected]@puppeteer\.local-chromium\win64-579032
√ Run 1 scripts
√ All packages installed (41 packages installed from npm registry, used 17s(network 1s), speed 235.89kB/s, json 40(297.7kB), tarball 0B)
好吧,装上了,那肯定要跑一下demo:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.baidu.com/');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
demo有了,那么怎么跑呢?nodejs我是新手:将上面的代码保存a.js,打开cmd,键入node a.js,与a.js相同目录下出现example.png,表示ok啦,其他参照 https://www.npmjs.com/package/puppeteer
没有图形界面,有时不知道它干了什么,可以加上参数:{headless: false} 这些上面的连接都有,在这贴出来,主要是加上后报错了;
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
await page.pdf({path: 'hn.pdf', format: 'A4'});
await browser.close();
})();
报错:
C:\Users\X\Desktop\ui>node html_to_pdf.js
(node:600) UnhandledPromiseRejectionWarning: Error: Protocol error (Page.printToPDF): PrintToPDF is not implemented
at Promise (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Connection.js:202:56)
at new Promise (<anonymous>)
at CDPSession.send (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Connection.js:201:12)
at Page.pdf (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Page.js:897:39)
at C:\Users\X\Desktop\ui\html_to_pdf.js:7:14
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
(node:600) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:600) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
信息太少,没办法定位问题,修改一下,将报错的具体内容打印一下:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless: false, slowMo: 250});
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
try{
await page.pdf({path: 'hn.pdf', format: 'A4'});
}catch(e){
console.log(e);
}
await browser.close();
})();
查看报错信息:
C:\Users\X\Desktop\ui>node html_to_pdf.js
{ Error: Protocol error (Page.printToPDF): PrintToPDF is not implemented
at Promise (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Connection.js:202:56)
at new Promise (<anonymous>)
at CDPSession.send (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Connection.js:201:12)
at Page.pdf (C:\Users\X\node_modules\[email protected]@puppeteer\lib\Page.js:897:39)
at C:\Users\X\Desktop\ui\html_to_pdf.js:8:15
at <anonymous>
message: 'Protocol error (Page.printToPDF): PrintToPDF is not implemented' }
明显在win10下PrintToPDF执行错误,查了一圈,暂不纠结,先跳过,后面处理。
npmc安装的chromium地址:C:\Users\X\node_modules\puppeteer\.local-chromium\win64-579032\chrome-win32 (X为用户名),若想更换,或使用指定版本的chromium,可以根据需求在脚本中修改。