From 2f7893a2ecf9da44ff9c879cb5ee7bd974a6256a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Kondratiuk?= Date: Mon, 16 Feb 2026 16:22:14 -0300 Subject: [PATCH] Add Browser.CreateCDPSessionAsync() for browser-level CDP commands (#2638) Expose CreateCDPSessionAsync on IBrowser to allow sending CDP commands at the browser level (e.g., Storage, Browser domains) without requiring a page-specific session. Co-Authored-By: Claude Opus 4.6 --- .../BrowserTests/CreateCDPSessionTests.cs | 22 +++++++++++++++++++ lib/PuppeteerSharp/Browser.cs | 3 +++ lib/PuppeteerSharp/IBrowser.cs | 6 +++++ 3 files changed, 31 insertions(+) create mode 100644 lib/PuppeteerSharp.Tests/BrowserTests/CreateCDPSessionTests.cs diff --git a/lib/PuppeteerSharp.Tests/BrowserTests/CreateCDPSessionTests.cs b/lib/PuppeteerSharp.Tests/BrowserTests/CreateCDPSessionTests.cs new file mode 100644 index 000000000..0056a441a --- /dev/null +++ b/lib/PuppeteerSharp.Tests/BrowserTests/CreateCDPSessionTests.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using NUnit.Framework; +using PuppeteerSharp.Nunit; + +namespace PuppeteerSharp.Tests.BrowserTests +{ + public class CreateCDPSessionTests : PuppeteerBrowserBaseTest + { + [Test, Retry(2), PuppeteerTest("puppeteer-sharp", "Browser.CreateCDPSessionAsync", "should work")] + public async Task ShouldWork() + { + var session = await Browser.CreateCDPSessionAsync(); + Assert.That(session, Is.Not.Null); + + var response = await session.SendAsync("Browser.getVersion"); + Assert.That(response, Is.Not.Null); + Assert.That(response.Value.GetProperty("product").GetString(), Is.Not.Empty); + + await session.DetachAsync(); + } + } +} diff --git a/lib/PuppeteerSharp/Browser.cs b/lib/PuppeteerSharp/Browser.cs index ba41d4890..e7c28fcef 100644 --- a/lib/PuppeteerSharp/Browser.cs +++ b/lib/PuppeteerSharp/Browser.cs @@ -172,6 +172,9 @@ public void UnregisterCustomQueryHandler(string name) public void ClearCustomQueryHandlers() => CustomQuerySelectorRegistry.Default.ClearCustomQueryHandlers(); + /// + public Task CreateCDPSessionAsync() => Target.CreateCDPSessionAsync(); + /// public abstract Task GetWindowBoundsAsync(string windowId); diff --git a/lib/PuppeteerSharp/IBrowser.cs b/lib/PuppeteerSharp/IBrowser.cs index a0aa3b2f9..7392d2ef3 100644 --- a/lib/PuppeteerSharp/IBrowser.cs +++ b/lib/PuppeteerSharp/IBrowser.cs @@ -267,5 +267,11 @@ public interface IBrowser : IDisposable, IAsyncDisposable /// A task that completes when the screen is removed. /// Only supported in headless mode. Fails if the primary screen ID is specified. Task RemoveScreenAsync(string screenId); + + /// + /// Creates a Chrome Devtools Protocol session attached to the browser. + /// + /// A task that returns a . + Task CreateCDPSessionAsync(); } }