node.js - 无法在谷歌云功能中调试 Puppeteer 超时
问题描述
我已经进行了很多调试,阅读了文章,但无法弄清楚为什么我会得到一个
at Promise.then (/workspace/node_modules/puppeteer/lib/cjs/puppeteer/common/LifecycleWatcher.js:106:111) name: 'TimeoutError' }
对于下面的“goto”行,我尝试调整参数,并尝试将 package.json 中的 puppeteer 版本从版本 5 退回到 4 到 3。代码在本地运行良好,但在 Google Cloud Function 中不断超时. 我通过为 google.com 编写一个简单的 fetch 函数来验证我的 VPC 连接器正在工作,所以这纯粹是 GCF 问题中的 Puppeteer。
仅供参考,这是在 PubSub 主题上触发的。
const puppeteer = require('puppeteer')
const PUPPETEER_OPTIONS = {
headless: true,
args: [
'--disable-gpu',
'--disable-dev-shm-usage',
'--disable-setuid-sandbox',
'--no-first-run',
'--no-sandbox',
'--no-zygote',
'--single-process',
"--proxy-server='direct://'",
'--proxy-bypass-list=*',
],
};
const closeConnection = async (page, browser) => {
page && (await page.close());
browser && (await browser.close());
};
exports.runScraper = async (message, context) => {
const url = Buffer.from(message.data, 'base64').toString()
console.log( `triggered with ${url}`)
const browser = await puppeteer.launch(PUPPETEER_OPTIONS);
const page = await browser.newPage();
try // open url and get price and title
{
console.log( "awaiting goto")
await page.goto(url, { waitUntil: 'networkidle2' })
console.log( "awaiting evaluate")
let item = await page.evaluate( async () => {
let priceArray = document.querySelector('div.cAIbCF').innerText.split('.')
return {
title: document.querySelector('h1 > span').innerText,
whole: priceArray[0],
part: priceArray[1]
}
})
} // try
catch (error) {
console.log( error );
throw error;
} finally {
console.log( "finally closeConnection" );
await closeConnection(page, browser);
return;
}
}
解决方案
我遇到了类似的问题。我变了
await page.goto(url, { waitUntil: 'networkidle2' })
至
await page.goto(url, {
waitUntil: 'load',
timeout: 0
});
它奏效了。请随意使用它并告诉它是否有效。
推荐阅读
- javascript - 如何在我的列表中添加链接并检索数据?
- javascript - 本地化谷歌地图的搜索区域
- flask - 在模板中包含动态对象的更好方法
- javascript - Loopback 3.x - 通过 RoleMapping 的用户角色 M:M 关系
- spring - 使用 Spring SPEL 解析 JSON
- windows - 为 PostgreSQL 和 IIS 配置 PHP
- angular - 如何覆盖 Angular 2 中的 form.valid 设置
- jquery - 如何使用 jQuery 操作 ::before 伪元素?
- java - 一个调用另一个 Rest API 的 Rest API
- javascript - 在新选项卡中打开 pdf,而不是从函数中下载