2017-10-19 161 views
0

我在page.$evalPuppeteer我不知道为什么pageFunction会返回一个空的对象时,该对象不是空的。以下是一个代码示例:page在Puppeteer函数返回空对象

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中?

回答

0

我不明白pageFunction函数在Chromium中运行,因此在第二个例子中,它返回elem => elem,它实际上是将一个活动的NodeList集合返回给Puppeteer。

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

0

那么,正如你上面所说的那样。你可以在评估函数中获得dom节点。但是当你从评估函数中返回dom节点时,puppeteer会处理你返回的数据。所以你不能得到形容词数据。