2024-08-04 08:28:19 +08:00
|
|
|
import assert from 'node:assert';
|
2024-09-09 18:07:22 +08:00
|
|
|
import { PuppeteerWebPage } from '@/puppeteer';
|
2024-08-04 08:28:19 +08:00
|
|
|
import puppeteer, { type Viewport } from 'puppeteer';
|
2024-07-28 08:49:57 +08:00
|
|
|
|
|
|
|
export async function launchPage(
|
|
|
|
url: string,
|
|
|
|
opt?: {
|
|
|
|
viewport?: Viewport;
|
2024-08-26 11:08:50 +08:00
|
|
|
headless?: boolean;
|
2024-07-28 08:49:57 +08:00
|
|
|
},
|
|
|
|
) {
|
|
|
|
const browser = await puppeteer.launch({
|
2024-08-26 11:08:50 +08:00
|
|
|
headless: typeof opt?.headless === 'boolean' ? opt.headless : true,
|
2024-12-08 20:12:17 +08:00
|
|
|
args: [
|
|
|
|
'--no-sandbox',
|
|
|
|
'--disable-features=PasswordLeakDetection',
|
|
|
|
'--disable-save-password-bubble',
|
|
|
|
],
|
2024-07-28 08:49:57 +08:00
|
|
|
});
|
2024-09-05 20:05:19 +08:00
|
|
|
const originPage = (await browser.pages())[0];
|
2024-07-28 08:49:57 +08:00
|
|
|
const viewportConfig = {
|
|
|
|
width: opt?.viewport?.width || 1920,
|
|
|
|
height: opt?.viewport?.height || 1080,
|
|
|
|
deviceScaleFactor: opt?.viewport?.deviceScaleFactor || 1,
|
|
|
|
};
|
2024-09-05 20:05:19 +08:00
|
|
|
await originPage.setViewport(viewportConfig);
|
2024-12-08 20:12:17 +08:00
|
|
|
await originPage.setUserAgent(
|
|
|
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
|
|
|
|
);
|
2024-11-25 16:05:01 +08:00
|
|
|
const response = await originPage.goto(url);
|
|
|
|
await originPage.waitForNetworkIdle();
|
|
|
|
if (response?.status) {
|
|
|
|
assert(response.status() <= 399, `Page load failed: ${response.status()}`);
|
|
|
|
}
|
2024-09-29 17:16:07 +08:00
|
|
|
const page = new PuppeteerWebPage(originPage);
|
2024-07-28 08:49:57 +08:00
|
|
|
|
2024-08-21 17:24:32 +08:00
|
|
|
return {
|
|
|
|
page,
|
2024-09-29 17:16:07 +08:00
|
|
|
originPage,
|
2024-08-21 17:24:32 +08:00
|
|
|
reset: async () => {
|
2024-09-29 17:16:07 +08:00
|
|
|
const pages = await browser.pages();
|
|
|
|
await Promise.all(pages.map((page) => page.close()));
|
2024-08-21 17:24:32 +08:00
|
|
|
await browser.close();
|
|
|
|
},
|
|
|
|
};
|
2024-07-28 08:49:57 +08:00
|
|
|
}
|