在托管环境中重新连接到上一个Puppeteer会话

时间:2018-08-26 20:53:26

标签: javascript firebase google-cloud-functions puppeteer

我目前正在使用Puppeteer控制无头铬的项目。现在,我正在使用Firebase函数托管我的应用程序。如果必须在一个会话中进行所有浏览,那么此方法很好用,但是如果以后必须返回时,则无法重新建立连接并恢复从上次中断的位置。

这是我当前的脚本。

const express = require('express');
const functions = require('firebase-functions');
const puppeteer = require('puppeteer');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const db = admin.database();
const app = express();

app.get('/openpage', async (req, res) => {

  try {
    const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
    const page = await browser.newPage();

    const url = 'https://www.reddit.com/';
    await page.goto(url, { waitUntil: 'networkidle2' });
    await page.evaluate(() => {
      document.querySelector('input[name="q"]').value = 'dog';
      document.querySelector('[action="/search"]').submit();
    });

    // Here I want to save the current state of the browser
    const endpoint = browser.wsEndpoint();
    console.log('Endpoint', endpoint);
    db.ref('test/').update({ endpoint });
    await browser.close();

  } catch (err) {
    console.log(err);
  }
  res.send('Finished');
});

app.get('/screenshot', async (req, res) => {

  try {
    const endpoint = await db.ref('test/endpoint').once('value').then(snap => snap.val());
    const browser = await puppeteer.connect({ browserWSEndpoint: endpoint }); // This is where it fails
    const pages = await browser.pages();
    const page = pages[0];
    await page.screenshot({ path: 'picture' });
    await browser.close();

  } catch (err) {
    console.error(err);
  }
  res.send('Finished');
})

exports.test = functions.runWith({ memory: '2GB', timeoutSeconds: 60 }).https.onRequest(app);

通过此设置,我可以向/openpage端点发出请求,一切正常,然后将浏览器端点存储到Firebase实时数据库。但是,当我尝试通过调用/screenshot恢复会话时,收到一个错误,即在browser.connect()方法上连接被拒绝。我应该采取其他方法吗?这是Firebase的限制吗?还是我缺少有关在Puppeteer中如何重新建立连接的信息?

错误消息:Error: connect ECONNREFUSED 127.0.0.1:62222

另一方面,您必须在package.json中添加"engines": { "node": "8" },才能使用Firebase Functions运行Puppeteer。

1 个答案:

答案 0 :(得分:1)

这是因为您要使用await browser.close();行关闭浏览器。这将断开连接并关闭浏览器,您将无法再次连接。

您应该改用browser.disconnect()