Skip to content

Commit 3ac5847

Browse files
author
rocketraccoon
committed
feat(mcp-tools): fix open new brauser after close
1 parent e2fa3b3 commit 3ac5847

File tree

3 files changed

+20
-93
lines changed

3 files changed

+20
-93
lines changed

src/browser-context.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ export interface BrowserOptions {
88
export class BrowserContext {
99
protected _browser: WdioBrowser | null = null;
1010
protected _options: BrowserOptions;
11-
protected _session: SessionOptions | undefined;
11+
protected _session: SessionOptions | null;
1212

13-
constructor(options: BrowserOptions = {}, session?: SessionOptions) {
13+
constructor(options: BrowserOptions = {}, session: SessionOptions | null = null) {
1414
this._options = options;
1515
this._session = session;
1616
}
@@ -49,6 +49,7 @@ export class BrowserContext {
4949
console.error("Error closing browser session:", error);
5050
} finally {
5151
this._browser = null;
52+
this._session = null;
5253
}
5354
}
5455
}

src/tools/utils/attach-to-browser-schema.ts

Lines changed: 2 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -9,58 +9,12 @@ export const attachToBrowserSchema = {
99
.describe(
1010
"Pid of webdriver process, need for close browser correct, necessarily provide it if it exist",
1111
)
12-
.optional(),
12+
.default(0),
1313
sessionCaps: z
1414
.object({
15-
acceptInsecureCerts: z
16-
.boolean()
17-
.describe("Whether the session accepts insecure certificates")
18-
.optional(),
1915
browserName: z.string().describe("Name of the browser being automated"),
2016
browserVersion: z.string().describe("Version of the browser"),
21-
chrome: z
22-
.object({
23-
chromedriverVersion: z.string().describe("Version of ChromeDriver being used"),
24-
userDataDir: z.string().describe("Path to Chrome's user data directory"),
25-
})
26-
.describe("Chrome-specific capabilities")
27-
.optional(),
28-
"fedcm:accounts": z.boolean().describe("FedCM accounts API support flag").optional(),
29-
"goog:chromeOptions": z
30-
.object({
31-
debuggerAddress: z.string().describe("Address for Chrome debugger"),
32-
})
33-
.describe("Chrome options")
34-
.optional(),
35-
networkConnectionEnabled: z.boolean().describe("Network connection capability flag").optional(),
36-
pageLoadStrategy: z.string().describe("Strategy for page loading").optional(),
37-
platformName: z.string().describe("Name of the platform").optional(),
38-
proxy: z.object({}).describe("Proxy configuration").optional(),
3917
setWindowRect: z.boolean().describe("Window resizing capability flag"),
40-
strictFileInteractability: z.boolean().describe("Strict file interaction flag").optional(),
41-
timeouts: z
42-
.object({
43-
implicit: z.number().describe("Implicit wait timeout in ms"),
44-
pageLoad: z.number().describe("Page load timeout in ms"),
45-
script: z.number().describe("Script execution timeout in ms"),
46-
})
47-
.describe("Timeout configurations")
48-
.optional(),
49-
unhandledPromptBehavior: z.string().describe("Behavior for unhandled prompts").optional(),
50-
"webauthn:extension:credBlob": z
51-
.boolean()
52-
.describe("WebAuthn credBlob extension support")
53-
.optional(),
54-
"webauthn:extension:largeBlob": z
55-
.boolean()
56-
.describe("WebAuthn largeBlob extension support")
57-
.optional(),
58-
"webauthn:extension:minPinLength": z
59-
.boolean()
60-
.describe("WebAuthn minPinLength extension support")
61-
.optional(),
62-
"webauthn:extension:prf": z.boolean().describe("WebAuthn prf extension support").optional(),
63-
"webauthn:virtualAuthenticators": z.boolean().describe("Virtual authenticators support").optional(),
6418
})
6519
.describe("Session capabilities"),
6620
sessionOpts: z
@@ -69,50 +23,8 @@ export const attachToBrowserSchema = {
6923
hostname: z.string().describe("Hostname for WebDriver server"),
7024
port: z.number().describe("Port for WebDriver server"),
7125
path: z.string().describe("Base path for WebDriver endpoints"),
72-
queryParams: z.object({}).describe("Additional query parameters").optional(),
73-
capabilities: z
74-
.object({
75-
browserName: z.string().describe("Requested browser name"),
76-
"wdio:enforceWebDriverClassic": z
77-
.boolean()
78-
.describe("Flag to enforce classic WebDriver protocol")
79-
.optional(),
80-
"goog:chromeOptions": z
81-
.object({
82-
binary: z.string().describe("Path to Chrome binary").optional(),
83-
})
84-
.describe("Chrome-specific options")
85-
.optional(),
86-
})
87-
.describe("Requested capabilities")
88-
.optional(),
89-
logLevel: z.string().describe("Logging level").optional(),
90-
connectionRetryTimeout: z.number().describe("Connection retry timeout in ms").optional(),
91-
connectionRetryCount: z.number().describe("Maximum connection retry attempts").optional(),
92-
enableDirectConnect: z.boolean().describe("Flag for direct connection to browser").optional(),
93-
strictSSL: z.boolean().describe("Strict SSL verification flag"),
94-
requestedCapabilities: z
95-
.object({
96-
browserName: z.string().describe("Originally requested browser name"),
97-
"wdio:enforceWebDriverClassic": z
98-
.boolean()
99-
.describe("Originally requested protocol enforcement")
100-
.optional(),
101-
"goog:chromeOptions": z
102-
.object({
103-
binary: z.string().describe("Originally requested Chrome binary path").optional(),
104-
})
105-
.optional(),
106-
})
107-
.describe("Originally requested capabilities")
108-
.optional(),
109-
automationProtocol: z.string().describe("Automation protocol being used").optional(),
110-
baseUrl: z.string().describe("Base URL for tests").optional(),
111-
waitforInterval: z.number().describe("Wait interval in ms").optional(),
112-
waitforTimeout: z.number().describe("Wait timeout in ms").optional(),
11326
})
114-
.describe("Session options")
115-
.optional(),
27+
.describe("Session options"),
11628
})
11729
.describe("Attach to browser json object from console after --keep-browser testplane run"),
11830
};

test/tools/attach-to-browser.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ describe(
6868
hostname: "127.0.0.1",
6969
port: 49426,
7070
path: "/",
71-
strictSSL: true,
7271
},
7372
},
7473
},
@@ -134,6 +133,21 @@ describe(
134133

135134
// Check that browser process doesn't exist
136135
expect(checkProcessExists(driverPid)).toBe(false);
136+
137+
// Check that after close session and call navigate we run new browser
138+
const url = "https://example.com";
139+
const navigateResult = await client.callTool({ name: "navigate", arguments: { url } });
140+
const navigateContent = navigateResult.content as Array<{ type: string; text: string }>;
141+
142+
expect(navigateResult.isError).toBe(false);
143+
expect(navigateContent[0].type).toBe("text");
144+
expect(navigateContent[0].text).toContain("✅ Successfully navigated to https://example.com");
145+
146+
// Call closeBrowser tool
147+
await client.callTool({
148+
name: "closeBrowser",
149+
arguments: {},
150+
});
137151
});
138152
});
139153
},

0 commit comments

Comments
 (0)