如何保存页面对象以备后用?

How to save the page object for later use?

我的人偶操纵者将有多个用户访问它,但在他们访问之后或开始之前,我想跟踪他们打开了哪个页面,以确定他们是否想执行更多操作。如果没有执行任何操作,请在 30 分钟后关闭页面。

有没有page ID之类的,我看到有browser.pages可以获取索引,但是不知道怎么用

我的应用程序是一个 REST 服务器,用户将在其中 post 发出请求,而人偶操纵者将执行一些任务。

概念

当收到请求时,会调用一个函数,该函数会为用户 ID 创建页面并将该页面存储在 Map 中供以后使用。然后当第二个请求命中时,您从 Map 中获取现有页面,执行 "finishing" 任务并随后关闭页面。

示例代码

为简单起见,此示例使用 express。代码启动一个服务器并注册两个函数:

  • /open?userid=XXX 将调用给定用户 ID 的启动任务
  • /close?userid=XXX 将调用给定用户 ID 的完成任务

这是一个没有错误处理或边缘情况的最小示例(比如如果您两次调用 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);
})();

页面、上下文、浏览器

根据您的任务,您应该考虑使用 browsers or contexts 代替页面是否更有意义。这将使任务彼此更加独立,这意味着如果一个浏览器崩溃,它不会影响任何其他任务。另外,使用pages也会让所有任务共享cookies。