javascript - Puppeteer - 评估方法中的异步函数引发错误
问题描述
我正在尝试检查og:image
源是否存在。如果我想在评估函数中调用异步方法,我会得到Error: Evaluation failed: [object Object]
错误。
Error: Evaluation failed: [object Object]
at ExecutionContext._evaluateInternal (.../node_modules/puppeteer/lib/ExecutionContext.js:122:13)
at processTicksAndRejections (internal/process/task_queues.js:89:5)
at async ExecutionContext.evaluate (.../node_modules/puppeteer/lib/ExecutionContext.js:48:12)
-- ASYNC --
at ExecutionContext.<anonymous> (.../node_modules/puppeteer/lib/helper.js:111:15)
at DOMWorld.evaluate (.../node_modules/puppeteer/lib/DOMWorld.js:112:20)
at processTicksAndRejections (internal/process/task_queues.js:89:5)
-- ASYNC --
at Frame.<anonymous> (.../node_modules/puppeteer/lib/helper.js:111:15)
at Page.evaluate (.../node_modules/puppeteer/lib/Page.js:827:43)
at Page.<anonymous> (.../node_modules/puppeteer/lib/helper.js:112:23)
at run (/Users/andrejgajdos/devel/link-preview/app.js:195:28)
at processTicksAndRejections (internal/process/task_queues.js:89:5)
应用程序.sj
const puppeteer = require("puppeteer");
const util = require('util');
const urlExists = util.promisify(require('url-exists'));
const run = async () => {
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://www.onepeloton.com/', { waitUntil: 'domcontentloaded' });
const img = await page.evaluate(async () => {
const ogImg = document.querySelector('meta[property="og:image"]');
if (ogImg != null && ogImg.content.length > 0) {
const isExists = await urlExists(ogImg.content);
return isExists;
}
});
console.log(img);
await browser.close()
} catch (e) {
console.log(e);
}
}
run();
解决方案
里面的所有代码evaluate
都在 Chromium 端执行。
由于urlExists
在节点端导入,您将无法从浏览器访问该功能。
除非您使用page.exposeFunction公开它。一旦你公开了那个函数,铬就可以调用urlExists
.
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://www.onepeloton.com/', { waitUntil: 'domcontentloaded' });
await page.exposeFunction('urlExists', urlExists);
const img = await page.evaluate(async () => {
const ogImg = document.querySelector('meta[property="og:image"]');
if (ogImg != null && ogImg.content.length > 0) {
const isExists = await urlExists(ogImg.content);
return isExists;
}
});
console.log(img);
await browser.close()
推荐阅读
- dataframe - Apache Spark 数据帧的随机分裂问题
- php - laravel 中使用 ajax 的注释
- azure-devops - 如何在 Azure DevOps 中安排 Python 脚本的执行(成功构建后)?
- android - 此组件的样式要求您的应用主题为 Theme.AppCompat
- r - 在 R 中保存 rgl 图像时遇到问题
- ios - 重用的自定义 CollectionViewCells 保留旧的大小属性
- wordpress - 使用代码更改 woocommerce 网站上的文本
- python - 在网站上运行 Python 脚本(在后台)
- python - Python 'print' 函数 'sep' 参数未按预期工作
- python - pysyft torch.jit. 脚本 RuntimeError:未定义的值 _Reduction