UnhandledPromiseRejectionWarning: ошибка: оценка не удалась: 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.info(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
         };

но я получаю сообщение об ошибке, что параметры не определены, и я получаю ту же ошибку с 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"

}}]

Заранее спасибо :)

🤔 А знаете ли вы, что...
JavaScript активно развивается, и новые версии языка регулярно включают новые функции и улучшения.


1 958
2

Ответы:

Решено

Код, к которому вы пытаетесь добавить options[i], — это клиентский код, который Puppeteer запускает в автономном браузере («функция страницы»). options там не существует.

Согласно документации, Puppeteer может передать это значение функции страницы в качестве аргумента, поэтому:

    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.info(frame);
    }
    await browser.close();

Объяснение: передать URL и объект в качестве дополнительных аргументов $$eval