Puppeteer中的pageFunction返回空对象

时间:2017-10-19 19:24:29

标签: puppeteer

我在Puppeteer中使用page.$eval,我不知道为什么pageFunction会在对象不为空时返回空对象。这是代码示例:

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch({
    headless: false,
    slowMo: 1000
  });
  const page = await browser.newPage();
  await page.goto('https://www.google.com/search?q=news');

  const result1 = await page.$eval('#resultStats', elem => elem.textContent)
  console.log('result1', result1);  // returns 'About 2,890,000,000  results (0.45 seconds)'.  This is expected behavior straight from puppeeteer docs

  const result2 = await page.$eval('#resultStats', elem => elem)
  console.log('result2', result2);  // returns and empty object.  Why?  I would have expected to see a DOM Node Object here

  await browser.close();
})();

如何在result2中返回整个元素?

2 个答案:

答案 0 :(得分:0)

我不明白pageFunction函数是在Chromium本身内运行的,所以在它返回elem => elem的第二个例子中,它实际上是将一个实时的NodeList集合返回给Puppeteer。

但是,将Chromium的实时NodeList集合返回给puppeteer是不可能的,因为Puppeteer将数据传入和传出Chromium的方式必须通过JSON.stringify / JSON.parse进行序列化。当Puppeteer在实时NodeList上运行JSON.stringify时,我相信它会返回一个空对象。

答案 1 :(得分:0)

好吧,如上所述。你可以在evaluate函数中获取dom节点。但是当你从evaluate函数返回dom节点时,puppeteer会处理你返回的数据。所以你不能得到形容词数据