【问题标题】:Screenshot for each DOM node每个 DOM 节点的屏幕截图
【发布时间】:2019-04-14 14:36:26
【问题描述】:

如何为任何站点中的每个 DOM 节点创建屏幕截图?

我尝试使用无头浏览器(puppeteer),它仅在我知道某个元素的 XPath 或 Selector 时才有效。 但是如何才能接收所有元素的 XPath 或 Selector?

async function screenshotDOMElement(opts = {}) {
const padding = 'padding' in opts ? opts.padding : 0;
const path = 'path' in opts ? opts.path : null;
const selector = opts.selector;

if (!selector)
    throw Error('Please provide a selector.');

const rect = await page.evaluate(selector => {
    const element =
     document.evaluate(selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    if (!element)
        return null;
    const {x, y, width, height} = element.getBoundingClientRect();
    console.log (x,y,width,height)
    return {left: x, top: y, width, height, id: element.id};
}, selector);

if (!rect)
    throw Error(`Could not find element that matches selector: ${selector}.`);

return await page.screenshot({
    path,
    clip: {
        x: rect.left - padding,
        y: rect.top - padding,
        width: rect.width + padding * 2,
        height: rect.height + padding * 2
    }
});
}

我还尝试使用HtmlAgilityPack (C#) 并通过 XPath 枚举 HtmlDocument 中的每个节点,但是这个 XPath 不能与 puppeteer 一起使用

我需要使用 puppeteer,因为它是 XPath 或 Selector 进行屏幕截图任务的最佳工具

谁能帮帮我?

【问题讨论】:

  • 您的问题质量很低,您使用的是哪个库? page 是什么?我想帮忙,但我觉得我做不到,因为我错过了很多信息。如果page.evaluate 循环遍历每个项目,为什么不在其中page.screenshot 呢?
  • @Tvde1 可能是。页面是万维网中的任何网页。您需要尝试创建 page.evaluate 循环并为其调用屏幕截图。这是常见且未解决的问题(获取任何网页上每个可用元素的屏幕截图) 上个月我试图获得结果 最后我的一步是“puppeteer”无头浏览器。请不要减少问题点。
  • 说真的,page 是什么?你如何创建对象?它是一串HTML吗?是图书馆的吗?

标签: javascript node.js web


【解决方案1】:

使用 puppeteer,您不再需要使用整个页面截图,因为它有 elementHandle.screenshot([options])。您可以执行以下操作:

const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto('https://example.com');

// get a list of all elements - same as document.querySelectorAll('*')
const elements = await page.$$('*')

for (let i = 0; i < elements.length; i++) {
  try {
    // get screenshot of a particular element
    await elements[i].screenshot({path: `${i}.png`})
  } catch(e) {
    // if element is 'not visible', spit out error and continue
    console.log(`couldnt take screenshot of element with index: ${i}. cause: `,  e)
  }
}
await browser.close();

请注意,puppeteer 无法获取某些不可见或被其他元素覆盖的元素的屏幕截图等。在这种情况下,您需要捕获错误并继续前进。

【讨论】:

  • 我不知道它是如何工作的,但是当页面有很多元素时,这个循环会停止而没有错误,它只会等待一些东西......
  • 尝试为 youtube 执行它
  • @МаратЗимнуров 刚刚尝试过 - 在 youtube 上为我工作。 node count: 1695 successful: 1094 not visible: 601 other: 0。似乎不是代码的问题。
  • @МаратЗимнуров 是相同的代码加上一点日志记录:gist.github.com/shkaper/5421a9135f26ab57d368ae8bb39dcd22
  • 我尝试运行您的代码,但它在下一刻停止:ibb.co/bTrRZq
猜你喜欢
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2022-07-14
  • 2018-10-28
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多