Переподключиться к предыдущей сессии кукловода в размещенной среде - PullRequest
0 голосов
/ 26 августа 2018

В настоящее время я работаю над проектом, который использует 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 () отказывается в соединении.Есть ли другой способ, которым я должен идти об этом?Это ограничение пожарной базы, или я что-то упускаю из-за того, как восстанавливаются соединения в Puppeteer?

Сообщение об ошибке: Error: connect ECONNREFUSED 127.0.0.1:62222

В примечании вы должны добавить "engines": { "node": "8" }, к вашемуpackage.json для запуска Puppeteer с функциями Firebase.

1 Ответ

0 голосов
/ 27 августа 2018

Это потому, что вы закрываете браузер этой строкой, await browser.close();.Это отключит и закроет браузер, и вы не сможете подключиться снова.

Вместо этого следует использовать browser.disconnect().

...