How to use .$$eval function

一世执手 提交于 2019-12-11 16:42:36

问题


I'm trying to run this code:

var aaa = await page.$$eval(selector, list => (list, value) => 
    {
        return resolve(list.find(element => element.textContent === value));
    }
    ,value);

But I received an error.

Therefore, I tried to print the items in "list" (because I assumed that the problem is there), I tried this code:

var aaa = await page.$$eval(selector, list => list);

And I received that "aaa" is empty.

Any idea what may be the problem?


回答1:


You are attempting to return DOM elements from page.$$eval(), which will return undefined because DOM elements are not serializable.

Try using page.$$() instead if you would like to return an ElementHandle array.

Take a look at the Puppeteer Documentation for page.$$eval() below:

page.$$eval(selector, pageFunction[, ...args])

  • selector <string> A selector to query page for
  • pageFunction <function> Function to be evaluated in browser context
  • ...args <...Serializable|JSHandle> Arguments to pass to pageFunction
  • returns: <Promise<Serializable>> Promise which resolves to the return value of pageFunction

This method runs Array.from(document.querySelectorAll(selector)) within the page and passes it as the first argument to pageFunction.

If pageFunction returns a Promise, then page.$$eval would wait for the promise to resolve and return its value.

Examples:

const divsCounts = await page.$$eval('div', divs => divs.length);



回答2:


Just try to map your array to more serializable one.

For example:

const links = await page.$$eval('h1 > a', e=>e.map((a)=>a.href))


来源:https://stackoverflow.com/questions/51280984/how-to-use-eval-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!