【问题标题】:Variable Defined Outside Puppeteer .evaluate() Function Always Undefined [duplicate]在 Puppeteer .evaluate() 函数外部定义的变量始终未定义 [重复]
【发布时间】:2021-02-27 03:55:37
【问题描述】:

我有一些 URL 参数需要通过查询字符串传递给 Puppeteer。除非我在调用 .evaluate() 函数之前定义必要的变量,否则一切正常。例如,如果我获取 URL 的参数,为特定参数创建一个变量,运行 .evaluate(),然后尝试访问其中返回未定义的变量。

这是一个例子

const testurl = 'https://example.com/app.js?&url=https://example.com/pagetocrawl.html&elements=.links'
const params = new URLSearchParams(testurl);
const url = params.get('url');
const elements = params.get('elements');
const networkidle = 'networkidle2';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, {waitUntil: networkidle});
pageitems = await page.evaluate(() => {
let results;
let items = document.querySelectorAll(elements);
items.forEach((item) => {
results += item.innerHTML;
});
return results;
});

上面的代码总是返回一个错误,指出元素变量未定义。如果我尝试在 evaluate() 调用中声明它,那么它会说 params 是未定义的,所以除非我知道要查找的元素而不必从 URL 中获取它,否则我无法抓取页面。我尝试将评估(()=>更改为评估((参数)=>,然后声明元素变量,但这导致错误提示“无法读取未定义的属性'get'。”如何在评估之外定义变量( ) 函数并能够在其中访问它们?现在我能想到的下一件事是再次调用以获取 evaluate() 函数中的当前 URL,基于此创建一个新的 params 变量,然后创建一个新的元素变量,它从新的 params 变量中获取其值。

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    您只需提供变量的值作为evaluate() 的参数(参见page.evaluate()):

    pageitems = await page.evaluate((selector) => {
      let results;
      let items = document.querySelectorAll(selector);
      items.forEach((item) => {
        results += item.innerHTML;
      });
      return results;
    }, elements);
    

    【讨论】:

    • 我发现类似的东西适用于变量,但现在我还需要传递一个函数。我有一个名为 getContent() 的函数,我需要将参数从 evaluate() 中的 foreach 循环传递给它,但是如果我尝试使用该语法例如传递函数: page.evaluae((getContent()) => 它不会工作。如何使函数在其中可访问?
    • 不幸的是,您只能将可序列化的值作为参数传输,而函数不可序列化。所以你需要把这个函数作为evaluate()中main函数的代码的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2020-06-04
    • 2020-08-19
    • 1970-01-01
    • 2021-11-06
    • 2021-08-20
    相关资源
    最近更新 更多