Почему я не могу поместить данные в массив внутри страницы блока. Оценить искатель кукловода?

var codes = [];    
await page.evaluate((codes) => {
    $(".offers-details").each(function (i, e) {
        if ($(e).find('.coupon-code').length > 0) {
            console.log($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
            codes.push($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
        }
    });
}, codes);

Как использовать jQuery вне page.evaluate () в handlePageFunction? Я хочу использовать здесь только jQuery.
Он не работает, когда я использую его в handlePageFunction. Как это решить?


person Vũ Đức Thạch    schedule 21.09.2020    source источник


Ответы (1)


page.evaluate - это функция Puppeteer, которая выполняется внутри браузера, именно так вы получаете доступ к глобальной переменной $ (которая прикреплена к переменной window).

Хотя вы не можете использовать jQuery вне браузера, вы можете использовать все функции селекторов из Puppeteer: https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-pageselector

Включает в себя:

  • page.$ для отдельных элементов (возвращает null, если не найден)
  • page.$$ для нескольких элементов (всегда возвращать массив)

Вы можете манипулировать / читать / взаимодействовать с типами, возвращаемыми этими функциями, в вашем случае это будет примерно так (не проверено!):

  const offersDetails = await page.$$(".offers-details");
  const codes = [];

  for (const offerDetail of offersDetails) {
     const couponCode = await offerDetail.$('.coupon-code');

     if (couponCode) {
       const cpText = await couponCode.$eval('.btn-copy', (el) => el.attributes('data-clipboard-text'));
       console.log(cpText);
       codes.push(cpText);
     }
  }

обратите внимание, что все page функции являются асинхронными и должны быть awaited.

Второй способ сделать это - вернуть массивы из page.evaluate, что проще.

const codes = await page.evaluate(() => {
   const codes = [];
   // code here
   return codes;
});
person pocesar    schedule 21.09.2020
comment
Я попробую использовать page. $ И page. $$. Второй способ сделать это, я думаю, не сработает, если я хочу получить два массива из двух элементов, когда я использую каждую функцию jQuery для получения всех элементов. Если я воспользуюсь вторым способом, мне придется выполнять повторяющийся код, и он не идеален. - person Vũ Đức Thạch; 21.09.2020