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

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

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

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

1 Ответ

0 голосов
/ 07 апреля 2019

Концепция

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

Пример кода

Для простоты в этом примере используется 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.

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