如何停止 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()
})()
const page = await browser.newPage()
page.setJavaScriptEnabled(false)
如果您想冻结页面并仍然可以调用 evaluate
,您可以
- 导航到页面,等待它加载(也许让它 JavaScript 进行一些 DOM 转换),
- 获取 HTML 页面快照,
- 禁用JavaScript,
- 静态重新加载页面(不会发生 DOM 转换,因为 JavaScript 已禁用),
- 利润(在保证保持不变的 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
我希望能够在页面加载后阻止任何脚本在 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()
})()
const page = await browser.newPage()
page.setJavaScriptEnabled(false)
如果您想冻结页面并仍然可以调用 evaluate
,您可以
- 导航到页面,等待它加载(也许让它 JavaScript 进行一些 DOM 转换),
- 获取 HTML 页面快照,
- 禁用JavaScript,
- 静态重新加载页面(不会发生 DOM 转换,因为 JavaScript 已禁用),
- 利润(在保证保持不变的 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