Как я могу передать обратный вызов в качестве переменной для page.evaluate в puppeteer? - PullRequest
0 голосов
/ 16 мая 2019

ОБНОВЛЕНИЕ Я работаю в докере и использую версию кукловода 1.11.0, так как это последняя версия , которая поддерживается Alpine Linux . Я также бегу с --no-sandbox

Просто ради организации кода, я бы хотел сделать это в кукловоде ...

async function crawler(url, evaluater) {
    const browser = await puppeteer.launch(...)
    const page = await browser.newPage()
    await page.goto(url)
    const result = await page.evaluate(evaluater)
    return result

}

crawler('https://website.com', () => {
    return document.querySelectorAll(...)
})

Но я получаю следующую ошибку ....

Error: Evaluation failed: TypeError: Cannot read property 
'querySelectorAll' of undefined

Я предполагаю, что функция-оценщик фактически передана eval, поэтому я ожидаю, что в этом случае будет работать ниже

const result = await page.evaluate(evaluater.toString())

Это тоже не работает. Сообщение об ошибке отсутствует, но возвращается undefined. Если я переместу функцию в строку, данные вернутся.

Есть ли способ, которым я могу предоставить обратный вызов page.evaluate, который не определен внутри строки, но передан как переменная?

1 Ответ

1 голос
/ 16 мая 2019

Ваш код выглядит нормально, он работает в моей среде. Возможно, ваша проблема связана с puppeteer версией - пусть удаляют node_modules и переустанавливают их,

Ваш веб-сайт, который вы хотите, чтобы сканер был отключен шпионским гусеничным механизмом, - Пусть тестируют с другим веб-сайтом.

Это мой код, вы можете попробовать его в env:

const puppeteer = require('puppeteer');
async function crawler(url, evaluator) {
  const browser = await puppeteer.launch({
    headless: false,
  });
  const page = await browser.newPage()
  await page.goto(url)
  const result = await page.evaluate(evaluator)
  // await browser.close();
  return result

}

(async () => {
  let result = await crawler('https://google.com', () => {
    const nodes = Array.from(document.querySelectorAll('a'));
    return nodes.map(({ innerText }) => innerText)
  });
  console.log(result);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...