生成性能报告
const puppeteer = require("puppeteer");
const lighthouse = require("lighthouse");
const { URL } = require("url");
const fs = require("fs");
const path = require("path");
const Run = async (url, reportOutputPath) => {
let browser;
try {
browser = await puppeteer.launch({
headless: false,
defaultViewport: null,
});
} catch (error) {
console.log("浏览器启动失败:\n", error);
return;
}
const port = new URL(browser.wsEndpoint()).port;
let report;
try {
report = await lighthouse(url, {
port,
output: "html",
formFactor: "desktop",
throttling: {
rttMs: 40,
throughputKbps: 10 * 1024,
cpuSlowdownMultiplier: 1,
requestLatencyMs: 0,
downloadThroughputKbps: 0,
uploadThroughputKbps: 0,
},
screenEmulation: {
mobile: false,
width: 1350,
height: 940,
deviceScaleFactor: 1,
disabled: false,
},
emulatedUserAgent:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
});
} catch (error) {
console.log("性能测试失败:\n", error);
await browser.close();
return;
}
const outputFileDir = path.dirname(reportOutputPath);
if (!fs.existsSync(outputFileDir)) {
fs.mkdirSync(outputFileDir, { recursive: true });
}
try {
fs.writeFileSync(reportOutputPath, report.report);
} catch (error) {
console.log("写入文件失败:\n", error);
}
console.log(
`Lighthouse 分数: ${report.lhr.categories.performance.score * 100}`
);
await browser.close();
};
Run("https://juejin.cn/post/xxxx", "性能报告.html");
截长图
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
headless: "new",
});
const page = await browser.newPage();
await page.setViewport({
width: 1200,
height: 800,
});
await page.goto("https://juejin.cn/post/xxxx", {
waitUntil: "networkidle0",
});
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 100;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100);
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".article-suspended-panel");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".sidebar");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".column-container");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".jj-comment-list-container");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".recommended-area");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".bottom-login-guide");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.screenshot({
path: "fullpage_screenshot.png",
fullPage: true,
});
await browser.close();
})();
生成 PDF
const puppeteer = require("puppeteer");
const Run = async () => {
const browser = await puppeteer.launch({
headless: "new",
});
const page = await browser.newPage();
await page.setViewport({
width: 1200,
height: 800,
});
await page.goto("https://juejin.cn/post/xxxx", {
waitUntil: "networkidle0",
});
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 100;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100);
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".main-header-box");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".article-suspended-panel");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".sidebar");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".column-container");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".jj-comment-list-container");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".recommended-area");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.evaluate(() => {
let elements = document.querySelectorAll(".bottom-login-guide");
elements.forEach((element) => {
element.style.display = "none";
});
});
await page.pdf({
path: "掘金.pdf",
format: "A4",
});
await browser.close();
};
Run();
对应源代码链接