Page.evaluate () кукловода всегда возвращает пустой объект при использовании в Electron - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать пользовательский интерфейс в Electron для скребка в Puppeteer. Каждый раз, когда я использую page.evaluate (), он возвращает пустой объект [объект Object], вот пример:

const puppeteer = require('puppeteer');

const scrape = async () => {
  const browser = await puppeteer.launch({
    executablePath: '/usr/bin/google-chrome',
    headless: true,
  });

  const page = await browser.newPage();

  await page.goto("https://google.com/", {
    waitUntil: 'networkidle2',
    timeout: 90000
  });

  const length = await page.evaluate(`selector => {
    return Array.from(document.querySelectorAll(selector)).length;
  }`, 'div');

  await page.close();
  await browser.close();

  return length;
}

document.querySelector("button").addEventListener("click", async function() {
  const divs_len =  await scrape();
  const par = document.querySelector('#par');
  par.innerText = divs_len;
});

// par shows [object Object]

EDIT

Я использовал следующий ресурс для исправления примера кода: https://github.com/puppeteer/puppeteer/issues/4221#issuecomment -478780545

А вот рабочая версия:

const puppeteer = require('puppeteer');

const scrape = async () => {
  const browser = await puppeteer.launch({
    executablePath: '/usr/bin/google-chrome',
    headless: true,
  });

  const page = await browser.newPage();

  await page.goto("https://google.com/", {
    waitUntil: 'networkidle2',
    timeout: 90000
  });

  const functionToBeEvaluated = selector => {
    return Array.from(document.querySelectorAll(selector)).length;
  }

  const result = await page.evaluate('(' + functionToBeEvaluated.toString() + ')("div");');

  await page.close();
  await browser.close();

  return result;
}

document.querySelector("button").addEventListener("click", async function() {
  const divs_len =  await scrape();
  const par = document.querySelector('#par');
  par.innerText = divs_len;
});

1 Ответ

0 голосов
/ 25 марта 2020

В аргументе page.evaluate() вы можете использовать вызываемое выражение функции или строку с прямым кодом, который будет выполнен. Если вы отправляете выражение функции в виде строки, page.evaluate() возвращает просто ссылку на эту функцию, которая становится пустым объектом, поскольку функции не сериализуемы. Попробуйте это:

  const length = await page.evaluate(selector => {
    return Array.from(document.querySelectorAll(selector)).length;
  }, 'div');
...