我正在开发一个 API,该 API 是围绕在 Puppeteer 打开的页面上运行一些 JS 开发的,但我不想保持打开/关闭状态并等待页面加载,因为它是一个内容繁重的页面。
是否可以在 Node 脚本上运行永久启动
来启动页面并使其永远打开,然后在需要在此页面上运行一些 javascript 时调用单独的 Node 脚本?
我已尝试以下操作,但页面似乎未保持打开状态:
keepopen.js
'use strict';
const puppeteer = require('puppeteer');
(async() => {
const start = +new Date();
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
await page.goto('https://www.bigwebsite.com/', {"waitUntil" : "networkidle0"});
const end = +new Date();
console.log(end - start);
//await browser.close();
})();
runjs.js
'use strict';
const puppeteer = require('puppeteer');
(async() => {
const start = +new Date();
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.targets()[browser.targets().length-1].page();
const hash = await page.evaluate(() => {
return runFunction();
});
const end = +new Date();
console.log(hash);
console.log(end - start);
//await browser.close();
})();
我运行以下命令:forever start keepopen.js
,然后runjs.js
,但我收到错误:
(node:1642) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null
最佳答案
不可能在两个 Node.js 脚本之间共享资源。您需要一个使浏览器保持打开状态的服务器。
代码示例
下面是一个使用库 express 的示例启动服务器。调用 /start-browser
启动浏览器并将浏览器和页面对象存储在当前函数之外。这样,第二个函数(在访问 /run
时调用)就可以使用 page
对象来运行其中的代码。
const express = require('express');
const app = express();
let browser, page;
app.get('/start-browser', async function (req, res) {
browser = await puppeteer.launch({args: ['--no-sandbox']});
page = await browser.newPage();
res.end('Browser started');
});
app.get('/run', async function (req, res) {
await page.evaluate(() => {
// ....
});
res.end('Done.'); // You could also return results here
});
app.listen(3000);
请记住,这是一个帮助您入门的最小示例。在现实场景中,您需要捕获错误,并且可能还需要不时重新启动浏览器。
关于javascript - 保持相同的 Puppeteer 页面打开 NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048447/