javascript - ElementHandle 与 DOM 元素有何不同?

标签 javascript puppeteer

关于 page.$(selector) 的文档说它返回一个包含 ElementHandle 的 promise 。

但是 ElementHandle 上的文档有点欠缺。

它说它“代表一个 DOM 元素”,但这到底是什么意思?如果确实代表 DOM,为什么不能检查 ElementHandle 的内容?

它还说,“除非句柄被释放,否则防止 DOM 元素被垃圾回收。”如果浏览器仍在页面上,为什么 DOM 元素会被垃圾回收?


这是因为我认为从页面上的元素中获取文本很简单,所以我尝试了,

const text = await page.$('#text').textContent;

返回 undefined。所以我尝试了,

const text = await page.$('#text').textContent();

这引发了错误。

原来正确的做法是

const text = await page.evaluate(() => document.querySelector('#text').textContent);

最佳答案

使用 ElementHandle,您仍然可以访问 textContent 之类的属性,但是是以“Puppeteer 方式”。 首先你必须 .getProperty()ElementHandle ,然后将其转换为 .jsonValue() .请记住,所有这些操作都会返回 poromises,因此您应该像这样对所有这些操作await:

await (await (await page.$('#text')).getProperty('textContent')).jsonValue();

这是完整的工作示例:

const puppeteer = require('puppeteer');

const html = `
<html>
  <body>
    <div id="text">Sample content</div>
  </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`data:text/html,${html}`);

  const text = await page.evaluate(() => document.querySelector('#text').textContent);
  const text2 = await (await (await page.$('#text')).getProperty('textContent')).jsonValue();

  console.log(text);
  console.log(text2);

  await browser.close();
})();

关于javascript - ElementHandle 与 DOM 元素有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242653/

相关文章:

javascript - 在单词的前 n 个字符下划线

javascript - show() 一个用 children() 隐藏的 div(拖放)

node.js - 为什么 Puppeteer 需要 --no-sandbox 在 Cloud Functions 中启动 Chrome

node.js - 如何使用 mouse.wheel 在 puppeteer 5.1.0 中向右滚动?

javascript - 如何在不重新加载/刷新数据的情况下使 html 页面可打印?

javascript - 如何从外部服务器向本地主机发出请求

javascript - 使用 Javascript 将某些单词替换为定义链接

javascript - 如何将变量传递给评估函数?

node.js - 从 ElementHandle 获取属性

node.js - Puppeteer 输入未输入所有字符