javascript - 在托管环境中重新连接到以前的 Puppeteer 会话
问题描述
我目前正在开发一个使用 Puppeteer 控制无头 chrome 的项目。现在我正在使用 Firebase 函数托管我的应用程序。如果我必须在一个会话中完成所有浏览,这很有效,但如果我必须稍后返回,我将无法重新建立连接并从中断的地方恢复。
这是我当前的脚本。
const express = require('express');
const functions = require('firebase-functions');
const puppeteer = require('puppeteer');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.database();
const app = express();
app.get('/openpage', async (req, res) => {
try {
const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
const page = await browser.newPage();
const url = 'https://www.reddit.com/';
await page.goto(url, { waitUntil: 'networkidle2' });
await page.evaluate(() => {
document.querySelector('input[name="q"]').value = 'dog';
document.querySelector('[action="/search"]').submit();
});
// Here I want to save the current state of the browser
const endpoint = browser.wsEndpoint();
console.log('Endpoint', endpoint);
db.ref('test/').update({ endpoint });
await browser.close();
} catch (err) {
console.log(err);
}
res.send('Finished');
});
app.get('/screenshot', async (req, res) => {
try {
const endpoint = await db.ref('test/endpoint').once('value').then(snap => snap.val());
const browser = await puppeteer.connect({ browserWSEndpoint: endpoint }); // This is where it fails
const pages = await browser.pages();
const page = pages[0];
await page.screenshot({ path: 'picture' });
await browser.close();
} catch (err) {
console.error(err);
}
res.send('Finished');
})
exports.test = functions.runWith({ memory: '2GB', timeoutSeconds: 60 }).https.onRequest(app);
通过此设置,我可以向/openpage
端点发出请求,一切正常,并将浏览器端点存储到 firebase 实时数据库。但是当我尝试通过调用来恢复会话时,/screenshot
我收到一个错误,即在 browser.connect() 方法上连接被拒绝。我应该以不同的方式解决这个问题吗?这是火力基地的限制,还是我错过了有关如何在 Puppeteer 中重新建立连接的信息?
错误信息:Error: connect ECONNREFUSED 127.0.0.1:62222
在旁注中,您必须添加"engines": { "node": "8" },
到您的 package.json 才能使用 Firebase 函数运行 Puppeteer。
解决方案
这是因为您正在使用此行关闭浏览器,await browser.close();
. 这将断开并关闭浏览器,您将无法再次连接。
你应该browser.disconnect()
改用。
推荐阅读
- c# - 以非常快速的方式将大型 Excel 工作表转换为数据表
- python - 是否可以从另一个 python 脚本中运行 python 脚本?
- corda - java.lang.NoSuchFieldException: 目标 - 从命令外壳启动流时出现异常 [errorCode=g3v6fv]
- c++ - 开发C++应用程序,目标服务器有不同的std lib版本,什么是最佳实践
- hybris - 多产品多买促销
- soapui - 肥皂用户界面的问题
- shell - 如何在 Groovy 中执行 shell 命令并获取返回码 $?
- c++ - 如何在 VS2017 中将运行时库设置为多线程(/MT)?
- ios - 为什么 UIImage 超越了 UIImageView?
- hdfs - 重命名多个数据文件