Как сохранить объект страницы для последующего использования?

#javascript #node.js #puppeteer

#javascript #node.js #кукловод

Вопрос:

У моего кукловода будет доступ к нему нескольких пользователей, но после того, как они это сделают или до того, как они запустятся, я хочу отслеживать, какую страницу они открыли, если они хотят выполнить больше действий или нет. Закройте страницу через 30 минут, если какое-либо действие не выполняется.

Есть ли какой-либо идентификатор страницы или что-то, что я могу использовать, я видел, что есть browser.pages для получения индекса, но не знаю, как использовать эту функцию.

мое приложение — это сервер REST, где пользователь отправит запрос, а кукловод выполнит какую-то задачу.

Комментарии:

1. Вы хотите предоставить другим пользователям возможность подключаться из своего скрипта puppeteer к вашему пулу экземпляров браузера или вы хотите выполнить одну задачу по запросу пользователя (например, сделать снимок экрана)? Что неясно в browser.pages ?

2. Просто выполните одну задачу, 1-я задача — зарегистрировать курс, 2-я задача (необязательно и длится только 30 минут), чтобы удалить текущую регистрацию. Для browser.page я не очень разбирался в этом, просто знаю, что существует метод.

Ответ №1:

Концепция

Когда поступает запрос, вызывается функция, которая создает страницу для идентификатора пользователя и сохраняет эту страницу на карте для последующего использования. Затем, когда поступает второй запрос, вы берете существующую страницу с карты, выполняете задачу «завершение» и закрываете страницу впоследствии.

Пример кода

Для простоты в этом примере используется express. Код запускает сервер и регистрирует две функции:

  • /open?userid=XXX вызовет начальную задачу для данного идентификатора пользователя
  • /close?userid=XXX вызовет задачу завершения для данного идентификатора пользователя

Это минимальный пример без обработки ошибок или крайних случаев (например, что произойдет, если вы дважды вызовете функцию open без вызова close).

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

// contains the open pages (per userid)
const openPages = new Map();

// setup task, creates page
async function openTask(userid, browser) {
    // create page and save in our map
    const page = await browser.newPage();
    openPages.set(userid, page);

    // execute start task on page
    await page.goto('http://www.google.com/');
    // ...

    // always call closeTask after 30min
    setTimeout(() => closeTask(userid), 30 * 60 * 1000);
}

// end task, closes page
async function closeTask(userid) {
    const page = openPages.get(userid);
    if (!page) {
        return;
    }

    // execute end task on page and close page after that
    // ...
    await page.close();
}

(async () => {
    const browser = await puppeteer.launch();

    // Called like this: /open?userid=123
    app.get('/open', async function (req, res) {
        const userid = req.query.userid;
        await openTask(userid, browser);
        res.end(`open finished for userid ${userid}`);
    });

    // Called like this: /close?userid=123
    app.get('/close', async function (req, res) {
        const userid = req.query.userid;
        await closeTask(userid, browser);
        res.end(`close finished for userid ${userid}`);
    });

    app.listen(3000);
})();
  

Страницы, контексты, браузеры

В зависимости от вашей задачи вам следует подумать о том, имеет ли смысл использовать браузеры или контексты вместо страниц. Это сделало бы задачи более независимыми друг от друга, то есть, если один браузер выйдет из строя, это не повлияет ни на одну из других задач. Кроме того, использование страниц также приведет к тому, что все задачи будут совместно использовать файлы cookie.

Комментарии:

1. да, я обнаружил, что сохранить браузер было лучшим выбором, чем сохранить страницу