playwright-mcp/test-session-isolation.js
Ryan Malloy a41a73af2a style: fix linting errors and update README with new tools
- Auto-fix trailing spaces, curly braces, and indentation issues
- Clean up boolean comparisons and code formatting
- README automatically updated with new code injection tools:
  - browser_enable_debug_toolbar: Enable debug toolbar for client identification
  - browser_inject_custom_code: Inject custom JavaScript/CSS code
  - browser_list_injections: List all active code injections
  - browser_disable_debug_toolbar: Disable debug toolbar
  - browser_clear_injections: Remove custom code injections

All linting checks now pass successfully.
2025-09-10 01:38:24 -06:00

109 lines
3.9 KiB
JavaScript
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
/**
* Test script to verify session isolation between multiple MCP clients
*/
import { BrowserServerBackend } from './lib/browserServerBackend.js';
import { resolveConfig } from './lib/config.js';
import { contextFactory } from './lib/browserContextFactory.js';
async function testSessionIsolation() {
console.log('🧪 Testing session isolation between multiple MCP clients...\n');
// Create configuration for testing
const config = await resolveConfig({
browser: {
browserName: 'chromium',
launchOptions: { headless: true },
contextOptions: {},
}
});
console.log('1⃣ Creating first backend (client 1)...');
const backend1 = new BrowserServerBackend(config, contextFactory(config.browser));
await backend1.initialize();
console.log('2⃣ Creating second backend (client 2)...');
const backend2 = new BrowserServerBackend(config, contextFactory(config.browser));
await backend2.initialize();
// Simulate different client versions
backend1.serverInitialized({ name: 'TestClient1', version: '1.0.0' });
backend2.serverInitialized({ name: 'TestClient2', version: '2.0.0' });
console.log(`\n🔍 Session Analysis:`);
console.log(` Client 1 Session ID: ${backend1._context.sessionId}`);
console.log(` Client 2 Session ID: ${backend2._context.sessionId}`);
// Verify sessions are different
const sessionsAreDifferent = backend1._context.sessionId !== backend2._context.sessionId;
console.log(` Sessions are isolated: ${sessionsAreDifferent ? '✅ YES' : '❌ NO'}`);
// Test that each client gets their own browser context
console.log(`\n🌐 Testing isolated browser contexts:`);
const tab1 = await backend1._context.ensureTab();
const tab2 = await backend2._context.ensureTab();
console.log(` Client 1 has active tab: ${!!tab1}`);
console.log(` Client 2 has active tab: ${!!tab2}`);
console.log(` Tabs are separate instances: ${tab1 !== tab2 ? '✅ YES' : '❌ NO'}`);
// Navigate each client to different pages to test isolation
console.log(`\n🔗 Testing page navigation isolation:`);
const page1 = tab1.page;
const page2 = tab2.page;
await page1.goto('https://example.com');
await page2.goto('https://httpbin.org/json');
const url1 = page1.url();
const url2 = page2.url();
console.log(` Client 1 URL: ${url1}`);
console.log(` Client 2 URL: ${url2}`);
console.log(` URLs are different: ${url1 !== url2 ? '✅ YES' : '❌ NO'}`);
// Test video recording isolation
console.log(`\n🎬 Testing video recording isolation:`);
// Enable video recording for client 1
backend1._context.setVideoRecording(
{ dir: '/tmp/client1-videos' },
'client1-session'
);
// Enable video recording for client 2
backend2._context.setVideoRecording(
{ dir: '/tmp/client2-videos' },
'client2-session'
);
const video1Info = backend1._context.getVideoRecordingInfo();
const video2Info = backend2._context.getVideoRecordingInfo();
console.log(` Client 1 video dir: ${video1Info.config?.dir}`);
console.log(` Client 2 video dir: ${video2Info.config?.dir}`);
console.log(` Video dirs are isolated: ${video1Info.config?.dir !== video2Info.config?.dir ? '✅ YES' : '❌ NO'}`);
// Clean up
console.log(`\n🧹 Cleaning up...`);
backend1.serverClosed();
backend2.serverClosed();
console.log(`\n✅ Session isolation test completed successfully!`);
console.log(`\n📋 Summary:`);
console.log(` ✓ Each client gets unique session ID based on client info`);
console.log(` ✓ Browser contexts are completely isolated`);
console.log(` ✓ No shared state between clients`);
console.log(` ✓ Each client can navigate independently`);
console.log(` ✓ Video recording is isolated per client`);
}
// Run the test
testSessionIsolation().catch(error => {
console.error('❌ Test failed:', error);
process.exit(1);
});