diff --git a/playwright/src/main/java/com/microsoft/playwright/BrowserType.java b/playwright/src/main/java/com/microsoft/playwright/BrowserType.java index 54864b3b..693bfd7c 100644 --- a/playwright/src/main/java/com/microsoft/playwright/BrowserType.java +++ b/playwright/src/main/java/com/microsoft/playwright/BrowserType.java @@ -67,6 +67,23 @@ class ConnectOptions { * Additional HTTP headers to be sent with web socket connect request. Optional. */ public Map headers; + /** + * Launch options to be passed to the browser being connected to. These options will be automatically + * serialized and sent via the {@code x-playwright-launch-options} header. + * + *

This is particularly useful when connecting to a browser with specific requirements, such as using + * a specific browser channel (e.g., "msedge" for Microsoft Edge). + * + *

Example: + *

{@code
+     * BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions()
+     *   .setChannel("msedge");
+     * BrowserType.ConnectOptions connectOptions = new BrowserType.ConnectOptions()
+     *   .setLaunchOptions(launchOptions);
+     * Browser browser = browserType.connect(wsEndpoint, connectOptions);
+     * }
+ */ + public LaunchOptions launchOptions; /** * Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on. * Defaults to 0. @@ -107,6 +124,26 @@ public ConnectOptions setHeaders(Map headers) { this.headers = headers; return this; } + /** + * Launch options to be passed to the browser being connected to. These options will be automatically + * serialized and sent via the {@code x-playwright-launch-options} header. + * + *

This is particularly useful when connecting to a browser with specific requirements, such as using + * a specific browser channel (e.g., "msedge" for Microsoft Edge). + * + *

Example: + *

{@code
+     * BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions()
+     *   .setChannel("msedge");
+     * BrowserType.ConnectOptions connectOptions = new BrowserType.ConnectOptions()
+     *   .setLaunchOptions(launchOptions);
+     * Browser browser = browserType.connect(wsEndpoint, connectOptions);
+     * }
+ */ + public ConnectOptions setLaunchOptions(LaunchOptions launchOptions) { + this.launchOptions = launchOptions; + return this; + } /** * Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on. * Defaults to 0. diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java index 47f85a09..ac39b600 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/BrowserTypeImpl.java @@ -76,6 +76,11 @@ public Browser connect(String wsEndpoint, ConnectOptions options) { headers.addProperty("x-playwright-browser", name()); } + if (options.launchOptions != null && !headers.has("x-playwright-launch-options")) { + String launchOptionsJson = new Gson().toJsonTree(options.launchOptions).toString(); + headers.addProperty("x-playwright-launch-options", launchOptionsJson); + } + Double timeout = options.timeout; if (timeout == null) { timeout = 0.0; diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserTypeConnect.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserTypeConnect.java index 618a3660..7f0cdd27 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserTypeConnect.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserTypeConnect.java @@ -174,6 +174,22 @@ void shouldSendExtraHeadersWithConnectRequest() throws Exception { } } + @Test + void shouldSendLaunchOptionsViaConnectOptions() throws Exception { + try (WebSocketServerImpl webSocketServer = WebSocketServerImpl.create()) { + try { + browserType.connect("ws://localhost:" + webSocketServer.getPort() + "/ws", + new BrowserType.ConnectOptions().setLaunchOptions( + new BrowserType.LaunchOptions().setChannel("msedge"))); + } catch (Exception e) { + } + assertNotNull(webSocketServer.lastClientHandshake); + String headerValue = webSocketServer.lastClientHandshake.getFieldValue("x-playwright-launch-options"); + assertNotNull(headerValue); + assertTrue(headerValue.contains("\"channel\":\"msedge\"")); + } + } + @Test void disconnectedEventShouldBeEmittedWhenBrowserIsClosedOrServerIsClosed() throws InterruptedException { // Launch another server to not affect other tests.