【问题标题】:Why does get getElementsByClassName() return undefined, when using puppeteer?为什么 getElementsByClassName() 在使用 puppeteer 时返回 undefined?
【发布时间】:2019-12-25 22:11:42
【问题描述】:

现在我正在尝试使用 puppeteer 获取一些元素,以获取一些类项(div)。我知道 getElementsByClassName 返回一个列表,您必须对其进行解析。然而对我来说,这个函数只是说未定义,即使我在浏览器中尝试它(最新版本的 chrome)。

这是代码(顺便说一句打字稿):

private async getElementsFromBrowser(url : string) : Promise<any[]>{
  const page : Page = await goToPage(url)
  const result = await page.evaluate( arr => {
    //this is where the error comes in
    let setOfElements = document.getElementsByClassName('classnamethatexists');

    arr = setOfElements;
    return arr;
  }
  return Promise.resolve(result);
}

和html:

<div class='classnamethatexists'>"This is an example of the text I want to get"</div>
<div class='classnamethatexists'>"This is an example of the text I want to get"</div>
<div class='classnamethatexists'>"This is an example of the text I want to get"</div>
<div class='classnamethatexists'>"This is an example of the text I want to get"</div>

有没有办法让函数不返回未定义;

【问题讨论】:

  • 问题一是“这段代码什么时候运行”?您是否记得将其标记为 defer 以便它在 DOM 完成后运行,或者缺少它,使其在 DOMContentLoaded 发出信号后运行?
  • 代码在函数中运行,promise 被放入任何类型的数组中。所以就像`arrayOfElements = await getElementsFromBrowser。不,我没有使用延迟,应该吗?

标签: javascript html node.js typescript puppeteer


【解决方案1】:

您的代码有很多问题。

page.evaluate 无法返回 HTMLCollection

page.evaluate 只能返回可序列化的数据,即可以从浏览器上下文通过JSON.stringify 发送到 Node.js 上下文的数据。 document.getElementsByClassName 返回一个 HTMLCollection,无法序列化。

使用page.$page.$$ 返回元素句柄

要查询具有特定类的元素,最好将page.$$ 函数与class selector 结合使用。这将返回一个element handle,可用于在 Node.js 执行上下文中进一步执行。

异步返回值

由于您已经将函数声明为async,因此任何结果都将隐含地成为 Promise 的结果。因此,返回值时不需要使用Promise.resolve


结果代码

将它们放在一起,生成的代码如下所示:

private async getElementsFromBrowser(url : string) : Promise<any[]>{
  const page = await goToPage(url); // I imagine this calls page.goto and returns the page
  const elements = await page.$$('.classnamethatexists');
  return elements;
}

【讨论】:

  • 嘿,所以我知道我说过它有效,但是如果我有多个对象,我将如何使用页面解析它们。$$?在信息中没有任何关于那里有其他对象的信息。
  • 这是一个元素句柄数组。你可以遍历它们:for (const el of elements) { await el... }
猜你喜欢
  • 2022-01-03
  • 2019-07-03
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多