Puppeteer page.evaluate querySelectorAll return empty objects

前端 未结 3 1903
清酒与你
清酒与你 2020-12-10 11:38

I am trying out Puppeteer. This is a sample code that you can run on: https://try-puppeteer.appspot.com/

The problem is this code is returning an array of empty obje

相关标签:
3条回答
  • 2020-12-10 12:00

    I faced the similar problem and i solved it like this;

     await page.evaluate(() => 
           Array.from(document.querySelectorAll('.title'), 
           e => e.href));
    
    0 讨论(0)
  • 2020-12-10 12:11

    The values returned from evaluate function should be json serializeable. https://github.com/GoogleChrome/puppeteer/issues/303#issuecomment-322919968

    the solution is to extract the href values from the elements and return it.

     await this.page.evaluate((sel) => {
            let elements = Array.from(document.querySelectorAll(sel));
            let links = elements.map(element => {
                return element.href
            })
            return links;
        }, sel);
    
    0 讨论(0)
  • 2020-12-10 12:22

    Problem:

    The return value for page.evaluate() must be serializable.

    According to the Puppeteer documentation, it says:

    If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined. DevTools Protocol also supports transferring some additional values that are not serializable by JSON: -0, NaN, Infinity, -Infinity, and bigint literals.

    In other words, you cannot return an element from the page DOM environment back to the Node.js environment because they are separate.

    Solution:

    You can return an ElementHandle, which is a representation of an in-page DOM element, back to the Node.js environment.

    Use page.$$() to obtain an ElementHandle array:

    let list = await page.$$('.title');
    

    Otherwise, if you want to to extract the href values from the elements and return them, you can use page.$$eval():

    let list = await page.$$eval('.title', a => a.href);
    
    0 讨论(0)
提交回复
热议问题