我希望能够在页面加载后阻止任何脚本在 puppeteer 中运行。这样做的原因是停止轮播图像和延迟加载图像,并本质上让页面尽可能静态地运行,以在图像不发生变化的情况下启用屏幕截图等。
通过执行
page.evaluate('debugger;')
可以暂停整个脚本,但这不会让您继续截屏,因为 evaluate
函数不会退出,直到您退出调试器(如果启用了 gui)
const page = await browser.newPage()
await page.setJavaScriptEnabled(false)
Page.setJavaScriptEnabled
文档
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);
更好的解决方案是阻止所有类型等于
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()
})()
如果您想冻结页面并仍然能够在其上调用
evaluate
,您可以
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
给朋友打电话后,以下似乎有效:
await page.evaluate('document.body.innerHTML = document.body.innerHTML')