未处理的PromiseRejectionWarning:错误:评估失败:ReferenceError:未定义选项


const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const options = ["iframe"]
const url = 'https://www.loungeincomfort.com.au/'
const page = await browser.newPage();
await page.goto(url);
for (var i = 0; i < options.length; i++) {
const frame = await page.$$eval(options[i], e => e.map(a => {
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = {};
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i])
}
return test;
}))
console.log(frame);
}
await browser.close();
})();

输出如下:

[
{
"width": "640",
"height": "360",
"src": "https://www.youtube.com/embed/ZJPsDBCD4XU",
"frameborder": "0",
"allow": "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
"allowfullscreen": ""
}
]

我想把选项[I]和url添加到输出中,我已经在我的代码中添加了这个

const test = {
"object": options[i],
"page": url
};

但我得到了一个选项未定义的错误,如果我删除了";对象":选项[i],

我应该如何解决此错误?

所以我的输出有另一个问题

输出如下:

[{
"width": "1170",
"height": "490",
"style": "visibility: visible; width: 100%; margin-left: 0px; height: 301.538px; margin-top: -3.26923px; position: absolute;"
}]

我想把样式输出分离成对象,就像这个一样

我对此做了一些研究,但找不到任何有用的

[{
"width": "1170",
"height": "490",
"style": {
"visibility": "visible",
"width": "100%",
"margin-left": "0px",
"height": "301.538px",
"margin-top": "-3.26923px",
"position": "absolute"
}}]

提前感谢:(

您试图添加options[i]的代码是客户端代码Puppeter在无头浏览器中运行("页面功能"(。options在那里不存在。

根据文档,您可以让Puppeter将该值作为参数传递给页面函数,因此:

const frame = await page.$$eval(options[i], (e, object, page) => e.map(a => {
//                                              ^ ^^^^^^^^^^^^^^
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = {object, page};
//                    ^^^^^^^^^^^^
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i])
}
return test;
}), options[i], url)
//    ^^^^^^^^^^^^^^^^^

这应该可以解决您的问题:

const browser = await puppeteer.launch();
const options = ["iframe"];
const url = "https://www.loungeincomfort.com.au/";
const page = await browser.newPage();
await page.goto(url);
for (var i = 0; i < options.length; i++) {
const object = options[i];
const frame = await page.$$eval(
options[i],
(e, { url, object }) =>
e.map((a) => {
const attrs = a.getAttributeNames();
const len = attrs.length;
const test = { object, page: url };
for (var i = 0; i < len; i++) {
//test[attrs[i]].push({ label: "Hello World" })
test[attrs[i]] = a.getAttribute(attrs[i]);
}
return test;
}),
{ url, object }
);
console.log(frame);
}
await browser.close();

说明:将url和object作为附加参数传递给$$eval

最新更新