【问题标题】:How to use .$$eval function如何使用 .$$eval 函数
【发布时间】:2018-10-27 22:26:49
【问题描述】:

我正在尝试运行此代码:

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

但是我收到了一个错误。

因此,我尝试打印“列表”中的项目(因为我认为问题存在),我尝试了以下代码:

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

我收到“aaa”是空的。

知道可能是什么问题吗?

【问题讨论】:

  • 你收到了什么错误?
  • 除了您收到的错误之外,您还应该扩大上下文。请您扩展您的代码示例并使其不那么抽象。
  • 您是否尝试过类似:await page.$$eval('li', (list, value) => list.find(e => e.innerText === value), val)

标签: eval puppeteer


【解决方案1】:

您正在尝试从 page.$$eval() 返回 DOM 元素,这将返回 undefined,因为 DOM 元素不是 serializable

如果您想返回 ElementHandle 数组,请尝试使用 page.$$()

看看下面的Puppeteer Documentation for page.$$eval()

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

  • selector string> 一个selector 用于查询页面
  • pageFunction function> 要在浏览器上下文中评估的函数
  • ...args <... href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description" rel="nofollow" target="_blank">Serializable|JSHandle> 传递给pageFunction的参数
  • 返回:PromiseSerializable>> Promise 解析为 pageFunction 的返回值

此方法在页面内运行Array.from(document.querySelectorAll(selector)),并将其作为第一个参数传递给pageFunction

如果pageFunction 返回Promise,则page.$$eval 将等待承诺解决并返回其值。

例子:

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

【讨论】:

    【解决方案2】:

    只需尝试将您的数组映射到更可序列化的数组。

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多