Files
2026-07-13 13:23:39 +08:00

79 lines
3.1 KiB
TypeScript

import { BrowserPool, PlaywrightPlugin } from '@crawlee/browser-pool';
import playwright from 'playwright';
describe('BrowserPool - Using multiple plugins', () => {
let browserPool: BrowserPool<{
browserPlugins: [PlaywrightPlugin, PlaywrightPlugin];
closeInactiveBrowserAfterSecs: 2;
retireInactiveBrowserAfterSecs: 30;
}>;
const chromePlugin = new PlaywrightPlugin(playwright.chromium);
const firefoxPlugin = new PlaywrightPlugin(playwright.firefox);
beforeEach(async () => {
vitest.clearAllMocks();
browserPool = new BrowserPool({
browserPlugins: [chromePlugin, firefoxPlugin],
closeInactiveBrowserAfterSecs: 2,
retireInactiveBrowserAfterSecs: 30,
});
});
afterEach(async () => {
await browserPool?.destroy();
});
test('should open new page in correct plugin', async () => {
const page = await browserPool.newPage({
browserPlugin: firefoxPlugin,
});
const controller = browserPool.getBrowserControllerByPage(page)!;
expect(controller.launchContext.browserPlugin).toBe(firefoxPlugin);
});
test('should loop through plugins round-robin', async () => {
const correctPluginOrder = [chromePlugin, firefoxPlugin];
const pagePromises = correctPluginOrder.map(async () => browserPool.newPage());
const pages = await Promise.all(pagePromises);
expect(pages).toHaveLength(correctPluginOrder.length);
expect(browserPool.activeBrowserControllers.size).toEqual(2);
for (const [idx, page] of pages.entries()) {
const controller = browserPool.getBrowserControllerByPage(page)!;
const { browserPlugin } = controller.launchContext;
const correctPlugin = correctPluginOrder[idx];
expect(browserPlugin).toBe(correctPlugin);
}
});
test('newPageWithEachPlugin should open all pages', async () => {
const [chromePage, firefoxPage] = await browserPool.newPageWithEachPlugin();
const chromeController = browserPool.getBrowserControllerByPage(chromePage)!;
const firefoxController = browserPool.getBrowserControllerByPage(firefoxPage)!;
expect(chromeController.launchContext.browserPlugin).toBe(chromePlugin);
expect(firefoxController.launchContext.browserPlugin).toBe(firefoxPlugin);
});
test('newPageWithEachPlugin should open in existing browsers', async () => {
vitest.spyOn(chromePlugin, 'launch');
vitest.spyOn(firefoxPlugin, 'launch');
// launch 2 browsers
await browserPool.newPage();
await browserPool.newPage();
expect(chromePlugin.launch).toHaveBeenCalledTimes(1);
expect(firefoxPlugin.launch).toHaveBeenCalledTimes(1);
expect(browserPool.activeBrowserControllers.size).toBe(2);
// Open more pages
await browserPool.newPageWithEachPlugin();
expect(chromePlugin.launch).toHaveBeenCalledTimes(1);
expect(firefoxPlugin.launch).toHaveBeenCalledTimes(1);
expect(browserPool.activeBrowserControllers.size).toBe(2);
});
});