我的 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。
我是一名优秀的程序员,十分优秀!