在 Puppeteer .evaluate() 函数之外定义的变量始终未定义

时间:2021-02-27 03:55:37

标签: javascript node.js puppeteer

我有一些 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 变量中获取其值。

1 个答案:

答案 0 :(得分:0)

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

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