Javascript 保持相同的木偶演员页面打开nodeJS
我正在开发一个API,在puppeter中打开的页面上运行一些JS,但我不想一直打开/关闭&等待页面加载,因为它是一个内容繁重的页面 是否可以在启动页面并使其永久打开的节点脚本上运行Javascript 保持相同的木偶演员页面打开nodeJS,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我正在开发一个API,在puppeter中打开的页面上运行一些JS,但我不想一直打开/关闭&等待页面加载,因为它是一个内容繁重的页面 是否可以在启动页面并使其永久打开的节点脚本上运行永久启动,然后在需要在此页面上运行javascript时调用单独的节点脚本 我尝试了以下操作,但页面似乎无法保持打开状态: keepopen.js 'use strict'; const puppeteer = require('puppeteer'); (async() => { const sta
永久启动
,然后在需要在此页面上运行javascript时调用单独的节点脚本
我尝试了以下操作,但页面似乎无法保持打开状态:
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();
})();
'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();
})();
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.newPage();
await page.goto('https://www.bigwebsite.com/', {"waitUntil" : "networkidle0"});
const end = +new Date();
console.log(end - start);
//await browser.close();
})();
'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();
})();
我运行以下命令:永远启动keepopen.js
,然后运行runjs.js
,但我得到了错误:
(node:1642) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null
您可以使用node运行一个http服务器,其中puppeter
页面
对象在启动时创建一次,然后通过将该代码放在您创建的http服务器的(所谓的“路由”函数(这只是一个服务于web请求的函数)中来启动当前脚本
只要页面
对象是在包含您的代码的路由功能范围之外创建的,那么路由功能将在多个web请求之间保持对相同页面
对象的访问
您可以反复使用相同的页面
对象,而不必像当前一样为每次调用重新加载它。但是,您需要一个服务来在请求/调用之间持久化页面
对象
您可以创建自己的http服务器(使用node的内置http包),也可以使用
express
(除了可以使用express
,还有许多其他基于http的包)。这样的两个node.js脚本之间不可能共享资源。您需要一个保持浏览器打开的服务器
代码示例
下面是一个使用库启动服务器的示例。调用/start browser
启动浏览器,并将浏览器和页面对象存储在当前函数之外。这样,第二个函数(在访问/run
时调用)可以使用页面
对象在其中运行代码
const express=require('express');
常量app=express();
让浏览器,页面;
app.get('/start browser',异步函数(req,res){
browser=wait puppeter.launch({args:['--no sandbox']});
page=wait browser.newPage();
res.end(“浏览器已启动”);
});
app.get('/run',异步函数(req,res){
等待页面。评估(()=>{
// ....
});
res.end('Done');//您也可以在此处返回结果
});
app.listen(3000);
请记住,这是一个简单的例子,让你开始。在现实世界中,您需要捕获错误,可能还需要不时重新启动浏览器