如何停止 Puppeteer 中的所有 JS 脚本

How to stop all JS scripts in Puppeteer

我希望能够在页面加载后阻止任何脚本在 puppeteer 中 运行。这样做的原因是停止旋转木马图像和延迟加载图像,并从根本上让页面尽可能静态地运行,以启用图像未更改的屏幕截图等。

通过执行 page.evaluate('debugger;') 可以暂停整个脚本,但这不会让您继续截屏,因为 evaluate 函数在您退出调试器之前不会退出 (如果启用了 gui)

如果您想在页面加载后禁用 JavaScript,您可以使用 debugger:

await page.evaluate(() => {
  debugger;
});

使用调试器后我可以截图了。

或者,您可以用其克隆替换每个原始节点以删除附加到每个元素的事件:

await page.evaluate(() => {
  document.querySelectorAll('*').forEach(element => {
    element.parentNode.replaceChild(element.cloneNode(true), element);
  });
});

您还可以在类似于上述循环的循环中使用 removeEventListener() 来删除附加到节点的特定事件。

否则,如果您可以在页面加载之前禁用 JavaScript,则可以在导航到该页面之前使用 page.setJavaScriptEnabled()

await page.setJavaScriptEnabled(false);

给朋友打电话后,以下似乎有效:

await page.evaluate('document.body.innerHTML = document.body.innerHTML')

更好的解决方案是阻止所有类型等于 script:

的请求
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setRequestInterception(true);

  page.on("request", request => {
    if (request.resourceType() === "script") {
      request.abort()
    } else {
      request.continue()
    }
  })

  await page.goto("https://whosebug.com/")
  await browser.close()
})()

来源:Disabling JavaScript Using Puppeteer

const page = await browser.newPage()
page.setJavaScriptEnabled(false)

如果您想冻结页面并仍然可以调用 evaluate,您可以

  1. 导航到页面,等待它加载(也许让它 JavaScript 进行一些 DOM 转换),
  2. 获取 HTML 页面快照,
  3. 禁用JavaScript,
  4. 静态重新加载页面(不会发生 DOM 转换,因为 JavaScript 已禁用),
  5. 利润(在保证保持不变的 DOM 上进行任意数量的 evaluate 或屏幕截图)。
await page.goto('<url>', { waitUntil: 'networkidle0' }); // 1
const html = await page.content(); // 2
page.setJavaScriptEnabled(false); // 3
await page.setContent(html, { waitUntil: 'networkidle0' }); // 4