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

Rex*_*zle 10 google-chrome-devtools puppeteer

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

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

Gra*_*ler 7

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

await page.evaluate(() => {
  debugger;
});
Run Code Online (Sandbox Code Playgroud)

使用调试器后,我能够截取屏幕截图。

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

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

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

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

await page.setJavaScriptEnabled(false);
Run Code Online (Sandbox Code Playgroud)


Jul*_*nec 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()
})()
Run Code Online (Sandbox Code Playgroud)

来源:使用 Puppeteer 禁用 JavaScript

  • 仍会评估/运行内联脚本 (4认同)

小智 5

const page = await browser.newPage()
page.setJavaScriptEnabled(false)
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可能是解决方案,但[包括解释](https://meta.stackoverflow.com/questions/392712/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您建议代码的原因。 (2认同)

Rex*_*zle -2

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

await page.evaluate('document.body.innerHTML = document.body.innerHTML')
Run Code Online (Sandbox Code Playgroud)