87 lines
2.1 KiB
JavaScript
87 lines
2.1 KiB
JavaScript
import puppeteer from 'puppeteer';
|
||
|
||
// Browser实例
|
||
let browserList = [];
|
||
|
||
// 不用的浏览器
|
||
let unusedBrowser = [];
|
||
|
||
// 创建浏览器实例
|
||
const createBrowser = async () => {
|
||
|
||
const browser = await puppeteer.launch({
|
||
headless: true,
|
||
args: [
|
||
"--disable-gpu",
|
||
"--disable-dev-shm-usage",
|
||
"--disable-setuid-sandbox",
|
||
"--no-first-run",
|
||
"--no-sandbox",
|
||
"--no-zygote",
|
||
"--single-process",
|
||
],
|
||
});
|
||
|
||
// 记录该浏览器实例打开的页面数
|
||
let pageCount = 0;
|
||
|
||
// 监听到打开了一个新窗口
|
||
browser.on("targetcreated", () => {
|
||
pageCount++;
|
||
});
|
||
|
||
// 监听到窗口关闭
|
||
browser.on("targetdestroyed", () => {
|
||
pageCount--;
|
||
|
||
if (pageCount === 0 && unusedBrowser.includes(browser)) {
|
||
console.log("命中unusedBrowser");
|
||
delBrowser(browser);
|
||
}
|
||
});
|
||
browserList.push(browser);
|
||
};
|
||
|
||
// 从browserList和unusedBrowser中删除
|
||
const delBrowser = (browser) => {
|
||
browserList = browserList.filter((item) => item !== browser);
|
||
unusedBrowser = unusedBrowser.filter((item) => item !== browser);
|
||
|
||
browser.close().then(() => {
|
||
browser = null;
|
||
console.log("删除浏览器", browserList.length, unusedBrowser.length);
|
||
});
|
||
};
|
||
|
||
// 始终返回最后一个浏览器实例
|
||
const getBrowser = () => {
|
||
console.log(browserList)
|
||
return browserList[browserList.length - 1];
|
||
};
|
||
|
||
// 定时任务
|
||
const scheduledTask = () => {
|
||
createBrowser()
|
||
// 每隔20秒去创建一个新的Browser实例,并销毁第一个实例
|
||
setInterval(() => {
|
||
createBrowser().then(() => {
|
||
// 把第一个浏览器置为不可用
|
||
const firstBrower = browserList[0];
|
||
firstBrower.pages().then((pages) => {
|
||
console.log(`第一个浏览器实例打开的页面数为${pages.length}`);
|
||
|
||
// 如果当前没有打开的页面,创建Browser实例时会默认初始化一个页面,所以这里判断的是<=1
|
||
if (pages.length <= 1) {
|
||
delBrowser(firstBrower);
|
||
} else {
|
||
unusedBrowser.push(browserList[0]);
|
||
}
|
||
});
|
||
});
|
||
}, 20 * 1000);
|
||
};
|
||
|
||
export {
|
||
scheduledTask,
|
||
getBrowser
|
||
} |