win10 puppeteer安装,采坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xingzishuai/article/details/82083089

环境: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,可以根据需求在脚本中修改。

猜你喜欢

转载自blog.csdn.net/xingzishuai/article/details/82083089
今日推荐