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

问题描述 投票:0回答:5

我希望能够在页面加载后阻止任何脚本在 puppeteer 中运行。这样做的原因是停止轮播图像和延迟加载图像,并本质上让页面尽可能静态地运行,以在图像不发生变化的情况下启用屏幕截图等。

通过执行

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

google-chrome-devtools puppeteer
5个回答
9
投票
const page = await browser.newPage()
await page.setJavaScriptEnabled(false)

Page.setJavaScriptEnabled
文档


7
投票

如果您想在页面加载后禁用 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);

5
投票

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

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://stackoverflow.com/")
  await browser.close()
})()

来源:使用 Puppeteer 禁用 JavaScript


1
投票

如果您想冻结页面并仍然能够在其上调用

evaluate
,您可以

  1. 导航到页面,等待其加载(也许让其 JavaScript 进行一些 DOM 转换),
  2. 获取页面的 HTML 快照,
  3. 禁用JavaScript,
  4. 静态重新加载页面(由于禁用了 JavaScript,因此不会发生 DOM 转换),
  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

-2
投票

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

await page.evaluate('document.body.innerHTML = document.body.innerHTML')
© www.soinside.com 2019 - 2024. All rights reserved.