【问题标题】:Puppeteer is unable to take a screenshotPuppeteer 无法截图
【发布时间】:2018-05-04 05:25:37
【问题描述】:

我正在尝试用 puppeteer 截屏。

Unhandled Promise Rejection 错误给我带来了很多麻烦。 我浏览了许多论坛和主题,这些论坛和主题提出了许多不同的建议,我应用了这些内容。

这些建议的范围从使用异步函数到使用 try-catch 块。

经过改进,这是我的最终版本代码:

const puppeteer = require('puppeteer');

async function getPic() {
    const browser = await puppeteer.launch(/*{headless: false}*/);
    const page = await browser.newPage();
    page.setViewport({width: 1000, height: 500});

    process.on("unhandledRejection", (reason, p) => {
        console.error("Unhandled Rejection at: Promise", p, "reason:", reason);
        browser.close();
    });

    try{
        await page.goto('https://www.google.com');
    }
    catch (error) {
        console.log(error);
        browser.close();
    }

    await page.screenshot({path: 'pic.png'});
    await broswer.close();
}

getPic();

虽然,它仍然不起作用,我收到以下错误消息:

Error: Navigation Timeout Exceeded: 30000ms exceeded
    at Promise.then (C:\...\pupet test\node_modules\pupp
eteer\lib\NavigatorWatcher.js:71:21)
    at <anonymous>
Unhandled Rejection at: Promise Promise {
  <rejected> { Error: Protocol error (Target.sendMessageToTarget): Target closed
.
    at Promise (C:\...\pupet test\node_modules\puppeteer
\lib\Connection.js:198:56)
    at new Promise (<anonymous>)
    at CDPSession.send (C:\...\pupet test\node_modules\p
uppeteer\lib\Connection.js:197:12)
    at Page._screenshotTask (C:\...\pupet test\node_modu
les\puppeteer\lib\Page.js:707:24)
    at <anonymous>
  message: 'Protocol error (Target.sendMessageToTarget): Target closed.' } } rea
son: { Error: Protocol error (Target.sendMessageToTarget): Target closed.
    at Promise (C:\...\pupet test\node_modules\puppeteer
\lib\Connection.js:198:56)
    at new Promise (<anonymous>)
    at CDPSession.send (C:\...\pupet test\node_modules\p
uppeteer\lib\Connection.js:197:12)
    at Page._screenshotTask (C:\...\pupet test\node_modu
les\puppeteer\lib\Page.js:707:24)
    at <anonymous>
  message: 'Protocol error (Target.sendMessageToTarget): Target closed.' }

【问题讨论】:

  • 你在await broswer.close();有错字应该是browser
  • 非常感谢您的贡献!

标签: node.js puppeteer


【解决方案1】:

正确使用异步等待

您需要正确使用 async-await。您正在以同步方式调用异步函数。

这是经过适当等待的修改后的代码。阅读下面的代码,看看有什么问题。

const puppeteer = require('puppeteer');
async function getPic() {
    try{ // <-- wrap the whole block in try catch
      const browser = await puppeteer.launch(/*{headless: false}*/);
      const page = await browser.newPage();
      await page.setViewport({width: 1000, height: 500}); // <-- add await here so it sets viewport after it creates the page
      await page.goto('https://www.google.com');
      await page.screenshot({path: 'pic.png'});
      await broswer.close(); // <-- close browser after everything is done
    } catch (error) {
      console.log(error);
    }
}

getPic();

检查代理设置

错误说它正在超时,这意味着它甚至无法加载网站。尝试检查页面是否在浏览器上正常加载。

【讨论】:

  • 非常感谢您花时间回答。虽然我测试了您的代码,但现在我收到此错误:错误:超过导航超时:Promise.then (C:\...\pupet_test\node_modules\puppeteer\lib\NavigatorWatcher.js:71:21) 超过 30000 毫秒 我没有任何代理问题,并且可以在浏览器中完全访问该 URL。
  • 我刚刚发现如果我使用 const browser = await puppeteer.launch({headless: false});然后代码工作。在上面的代码中,{headless: false} 被注释掉了,导致代码无法运行。我不知道为什么会这样,但这是另一个问题......谢谢!
猜你喜欢
  • 2022-06-17
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
相关资源
最近更新 更多