79 lines
3.1 KiB
TypeScript
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);
|
|
});
|
|
});
|