如何保存页面对象以备后用?
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。
我的人偶操纵者将有多个用户访问它,但在他们访问之后或开始之前,我想跟踪他们打开了哪个页面,以确定他们是否想执行更多操作。如果没有执行任何操作,请在 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。