Сохранение той же страницы кукловода, открытого узлаJS - PullRequest
1 голос
/ 22 сентября 2019

Я работаю над API, разработанным для запуска некоторых JS на странице, открытой в Puppeteer, но я не хочу продолжать открывать / закрывать и ждать загрузки страницы, так как это тяжелая страница контента.

Можно ли запустить forever start на сценарии узла, который запускает страницу и сохраняет ее открытой навсегда, а затем вызывать отдельный сценарий узла, когда это необходимо для запуска некоторого JavaScript на этой странице?

IВы пытались сделать следующее, но кажется, что страница не открыта:

keepopen.js

'use strict';
const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.newPage();
    await page.goto('https://www.bigwebsite.com/', {"waitUntil" : "networkidle0"});
    const end =  +new Date();
    console.log(end - start);
    //await browser.close();
})();

runjs.js

'use strict';

const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.targets()[browser.targets().length-1].page();
    const hash = await page.evaluate(() => {
        return runFunction();
    });
    const end =  +new Date();
    console.log(hash);
    console.log(end - start);
    //await browser.close();
})();

Я запускаю следующее: forever start keepopen.js, а затем runjs.js, но я получаю сообщение об ошибке:

(node:1642) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Невозможно разделить ресурс между двумя такими скриптами Node.js.Вам нужен сервер, который поддерживает браузер открытым.

Пример кода

Ниже приведен пример использования библиотеки express для запуска сервера.Вызов /start-browser запускает браузер и сохраняет браузер и объект страницы за пределами текущей функции.Таким образом, вторая функция (вызывается при обращении к /run) может использовать объект page для запуска кода внутри него.

const express = require('express');
const app = express();

let browser, page;

app.get('/start-browser', async function (req, res) {
    browser = await puppeteer.launch({args: ['--no-sandbox']});
    page = await browser.newPage();
    res.end('Browser started');
});

app.get('/run', async function (req, res) {
    await page.evaluate(() => {
        // ....
    });
    res.end('Done.'); // You could also return results here
});

app.listen(3000);

Имейте в виду, что это минимальный пример для начала работы,В реальном мире вам нужно будет отлавливать ошибки и, возможно, время от времени перезапускать браузер.

0 голосов
/ 22 сентября 2019

Вы можете запустить http-сервер, используя узел, где объект кукловода page создается один раз при запуске, а затем запустить текущий скрипт, поместив этот код в (так называемую) функцию «маршрутизации» (которая простофункция, которая обслуживает веб-запрос) созданного вами http-сервера.

Пока объект page создается прямо вне области действия функции маршрутизации, которая содержит ваш код, вашу функцию маршрутизациибудет поддерживать доступ к одному и тому же объекту page между многочисленными веб-запросами.

Вы сможете многократно использовать один и тот же объект page вместо того, чтобы перезагружать его для каждого вызова, как будто выв настоящее время делает.Однако вам нужен сервис для сохранения объекта page между запросами / вызовами.

Вы можете создать свой собственный http-сервер (используя встроенный http-пакет узла) или использовать express (и таммножество других пакетов на основе http, кроме express, которые вы можете использовать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...