javascript - 保持相同的 Puppeteer 页面打开 NodeJS

标签 javascript node.js puppeteer

我正在开发一个 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/

相关文章:

javascript - 使用 Puppeteer 从 iframe 中的 <p> 标记中提取文本

javascript - 将模块隐藏在闭包中的原因是什么?

javascript - 当手指稍微移动时,点击事件不会在触摸屏上触发

javascript - 将 Angular 库导入 Lotus Domino 数据库

javascript - 自定义模块express js :Cannot find module name error when modules folder in root directory

python - centos 上的 node-gyp 构建错误

javascript - 阻止 puppeteer 上的视频请求

javascript - phpcoding特殊字符

javascript - 在 puppeteer 中获取具有特定类的图像 src

javascript - Puppeteer:page.screenshot 调整视口(viewport)大小