javascript - 如何保存页面对象以供以后使用?

标签 javascript node.js puppeteer

我的 puppeteer 操纵者将有多个用户访问它,但在他们访问之后或开始之前,我想跟踪他们打开的页面,如果他们想要执行更多操作或不想执行更多操作。如果没有执行任何操作,请在 30 分钟内关闭页面。

有没有页面ID或者我可以使用的东西,我看到有browser.pages来获取索引,但不知道如何使用这个功能。

我的应用程序是一个 REST 服务器,用户将在其中发布请求,puppeteer 将执行一些任务。

最佳答案

概念

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

示例代码

为简单起见,此示例使用 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 是否更有意义或contexts而不是页面。这将使任务彼此更加独立,这意味着如果一个浏览器崩溃,不会影响任何其他任务。另外,使用页面也会使所有任务共享cookie。

关于javascript - 如何保存页面对象以供以后使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55552451/

相关文章:

javascript - 不能在 fetch api 中使用变量

javascript - 如何将 ResultSet 转换为 JSON 对象

node.js - 将 ant-design 与 next.js 集成

node.js - 如何使用 gruntJS 运行测试

puppeteer - 使用 Puppeteer 如何获取 DOMContentLoaded、加载时间

javascript - 在不上传的情况下获取本地文件的内容

javascript - 检查包含对象作为数组的数组中的重复项

node.js - 端口 9200 拒绝连接?

javascript - 使用 puppeteer js 按标题查找元素

javascript - 如何使用 Puppeteer 获取请求的原始下载大小?