2017-10-19 4 views
0

Ich verwende page.$eval in Puppeteer und ich weiß nicht, warum ein pageFunction ein leeres Objekt zurückgeben würde, wenn das Objekt nicht leer ist. Hier ist ein Codebeispiel:pageFunction in Puppeteer gibt leeres Objekt zurück

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(); 
})(); 

Wie bekomme ich das gesamte Element in result2 zurück?

Antwort

0

Ich habe nicht verstanden, dass die pageFunction Funktion in Chromium selbst ausgeführt wird, also im zweiten Beispiel, in dem es elem => elem zurückgibt, gibt es tatsächlich eine Live NodeList Sammlung zu Puppeteer zurück.

Die Rückgabe einer Live-NodeList-Sammlung von Chromium an Puppenspieler ist jedoch nicht möglich, da die Art und Weise, wie Puppeteer Daten an und von Chromium weitergibt, über JSON.stringify/JSON.parse serialisierbar sein muss. Wenn der Puppenspieler JSON.stringify auf einer Live-NodeList ausführt, glaube ich, dass er ein leeres Objekt zurückgibt.

0

Nun, wie Sie oben gesagt haben.Sie können den Dom-Knoten in der Funktion evaluate.But erhalten, wenn Sie den DOM-Knoten von Evaluate-Funktion zurückgeben, Puppenspieler wird die Daten, die Sie zurückgegeben. So können Sie nicht die Adjektivdaten erhalten .

Verwandte Themen