15
15
*/
16
16
17
17
import { baseTest } from '../config/baseTest' ;
18
- import { chromium } from 'playwright' ;
18
+ import { chromium , type BrowserContext } from 'playwright' ;
19
19
import { expect , type PageTestFixtures , type PageWorkerFixtures } from '../page/pageTestApi' ;
20
20
import type { TraceViewerFixtures } from '../config/traceViewerFixtures' ;
21
21
import { traceViewerFixtures } from '../config/traceViewerFixtures' ;
@@ -24,7 +24,13 @@ import http from 'node:http';
24
24
import path from 'node:path' ;
25
25
import { AddressInfo } from 'node:net' ;
26
26
27
- export const extensionTest = baseTest . extend < TraceViewerFixtures > ( traceViewerFixtures ) . extend < PageTestFixtures , PageWorkerFixtures > ( {
27
+ export type ExtensionTestFixtures = {
28
+ persistentContext : BrowserContext ;
29
+ relayServer : http . Server ;
30
+ } ;
31
+
32
+
33
+ export const extensionTest = baseTest . extend < TraceViewerFixtures > ( traceViewerFixtures ) . extend < PageTestFixtures , PageWorkerFixtures & ExtensionTestFixtures > ( {
28
34
browserVersion : [ ( { browser } , use ) => use ( browser . version ( ) ) , { scope : 'worker' } ] ,
29
35
browserMajorVersion : [ ( { browserVersion } , use ) => use ( Number ( browserVersion . split ( '.' ) [ 0 ] ) ) , { scope : 'worker' } ] ,
30
36
isAndroid : [ false , { scope : 'worker' } ] ,
@@ -33,9 +39,16 @@ export const extensionTest = baseTest.extend<TraceViewerFixtures>(traceViewerFix
33
39
isWebView2 : [ false , { scope : 'worker' } ] ,
34
40
isHeadlessShell : [ false , { scope : 'worker' } ] ,
35
41
36
- browser : [ async ( { playwright } , use , testInfo ) => {
42
+ relayServer : [ async ( { } , use ) => {
37
43
const httpServer = http . createServer ( ) ;
38
44
await new Promise < void > ( resolve => httpServer . listen ( 0 , resolve ) ) ;
45
+ const { CDPRelayServer } = await import ( '../../../playwright-mcp/src/cdpRelay.ts' ) ;
46
+ new CDPRelayServer ( httpServer ) ;
47
+ await use ( httpServer ) ;
48
+ httpServer . close ( ) ;
49
+ } , { scope : 'worker' } ] ,
50
+
51
+ persistentContext : [ async ( { } , use ) => {
39
52
const pathToExtension = path . join ( __dirname , '../../../playwright-mcp/extension' ) ;
40
53
const context = await chromium . launchPersistentContext ( '' , {
41
54
executablePath : process . env . CRPATH ,
@@ -46,28 +59,45 @@ export const extensionTest = baseTest.extend<TraceViewerFixtures>(traceViewerFix
46
59
] ,
47
60
channel : 'chromium' ,
48
61
} ) ;
49
- const { CDPRelayServer } = await import ( '../../../playwright-mcp/src/cdpRelay.ts' ) ;
50
- new CDPRelayServer ( httpServer ) ;
51
- const origin = `ws://localhost:${ ( httpServer . address ( ) as AddressInfo ) . port } ` ;
52
- await expect . poll ( ( ) => context ?. serviceWorkers ( ) ) . toHaveLength ( 1 ) ;
53
- await context . pages ( ) [ 0 ] . goto ( new URL ( '/popup.html' , context . serviceWorkers ( ) [ 0 ] . url ( ) ) . toString ( ) ) ;
54
- await context . pages ( ) [ 0 ] . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . clear ( ) ;
55
- await context . pages ( ) [ 0 ] . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . fill ( `${ origin } /extension` ) ;
56
- await context . pages ( ) [ 0 ] . getByRole ( 'button' , { name : 'Share This Tab' } ) . click ( ) ;
57
- await context . pages ( ) [ 0 ] . goto ( 'about:blank' ) ;
58
- const browser = await playwright . chromium . connectOverCDP ( `${ origin } /cdp` ) ;
59
62
context . on ( 'dialog' , dialog => {
60
63
// Make sure the dialog is not dismissed automatically.
61
64
} ) ;
65
+ await use ( context ) ;
66
+ await context . close ( ) ;
67
+ } , { scope : 'worker' } ] ,
68
+
69
+ browser : [ async ( { persistentContext, relayServer, playwright } , use , testInfo ) => {
70
+ const origin = `ws://localhost:${ ( relayServer . address ( ) as AddressInfo ) . port } ` ;
71
+ await expect . poll ( ( ) => persistentContext . serviceWorkers ( ) ) . toHaveLength ( 1 ) ;
72
+ await persistentContext . pages ( ) [ 0 ] . goto ( new URL ( '/popup.html' , persistentContext . serviceWorkers ( ) [ 0 ] . url ( ) ) . toString ( ) ) ;
73
+ await persistentContext . pages ( ) [ 0 ] . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . clear ( ) ;
74
+ await persistentContext . pages ( ) [ 0 ] . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . fill ( `${ origin } /extension` ) ;
75
+ await persistentContext . pages ( ) [ 0 ] . getByRole ( 'button' , { name : 'Share This Tab' } ) . click ( ) ;
76
+ await persistentContext . pages ( ) [ 0 ] . goto ( 'about:blank' ) ;
77
+ const browser = await playwright . chromium . connectOverCDP ( `${ origin } /cdp` ) ;
62
78
await use ( browser ) ;
63
- httpServer . close ( ) ;
64
79
} , { scope : 'worker' } ] ,
65
80
66
81
context : async ( { browser } , use ) => {
67
82
await use ( browser . contexts ( ) [ 0 ] ) ;
68
83
} ,
69
84
70
- page : async ( { browser } , use ) => {
71
- await use ( browser . contexts ( ) [ 0 ] . pages ( ) [ 0 ] ) ;
85
+ page : async ( { persistentContext, relayServer, playwright } , use ) => {
86
+ const page = await persistentContext . newPage ( ) ;
87
+ const origin = `ws://localhost:${ ( relayServer . address ( ) as AddressInfo ) . port } ` ;
88
+ await expect . poll ( ( ) => persistentContext . serviceWorkers ( ) ) . toHaveLength ( 1 ) ;
89
+ await page . goto ( new URL ( '/popup.html' , persistentContext . serviceWorkers ( ) [ 0 ] . url ( ) ) . toString ( ) ) ;
90
+ await page . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . clear ( ) ;
91
+ await page . getByRole ( 'textbox' , { name : 'Bridge Server URL:' } ) . fill ( `${ origin } /extension` ) ;
92
+ await page . getByRole ( 'button' , { name : 'Share This Tab' } ) . click ( ) ;
93
+ await page . goto ( 'about:blank' ) ;
94
+ const browser = await playwright . chromium . connectOverCDP ( `${ origin } /cdp` ) ;
95
+ const pages = browser . contexts ( ) [ 0 ] . pages ( ) ;
96
+ const remotePage = pages [ pages . length - 1 ] ;
97
+ await use ( remotePage ) ;
98
+ // Disconnect from the tab.
99
+ await browser . close ( ) ;
100
+ // Close the page.
101
+ await page . close ( ) ;
72
102
}
73
103
} ) ;
0 commit comments