From f66928bc2b70285209b34763d9c89f0b9989dd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Kondratiuk?= Date: Mon, 1 Apr 2024 17:30:46 -0300 Subject: [PATCH 1/3] Introduce protocol in launch options --- .github/workflows/dotnet.yml | 36 ++++++++++++++++- .../PuppeteerTestAttribute.cs | 3 +- lib/PuppeteerSharp.Tests/TestConstants.cs | 2 + lib/PuppeteerSharp/ConnectOptions.cs | 19 +-------- lib/PuppeteerSharp/IBrowserOptions.cs | 5 +++ lib/PuppeteerSharp/LaunchOptions.cs | 16 ++------ lib/PuppeteerSharp/ProtocolType.cs | 39 +++++++++++++++++++ 7 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 lib/PuppeteerSharp/ProtocolType.cs diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index f8231e106..bc882891b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -20,7 +20,7 @@ env: jobs: build: - name: build-${{ matrix.browser }}-${{ matrix.mode }}-${{ matrix.os }} + name: build-${{ matrix.browser }}-${{ matrix.mode }}-${{ matrix.os }}-${{ matrix.protocol }} runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -29,33 +29,63 @@ jobs: - os: ubuntu-latest browser: CHROME mode: headless + protocol: cdp - os: ubuntu-latest browser: CHROME mode: headful + protocol: cdp - os: ubuntu-latest browser: CHROME mode: headless-shell + protocol: cdp - os: ubuntu-latest browser: FIREFOX mode: headless + protocol: cdp - os: ubuntu-latest browser: FIREFOX mode: headful + protocol: cdp - os: windows-latest browser: CHROME mode: headless + protocol: cdp - os: windows-latest browser: CHROME mode: headful + protocol: cdp - os: windows-latest browser: CHROME mode: headless-shell + protocol: cdp - os: windows-latest browser: FIREFOX mode: headless + protocol: cdp - os: windows-latest browser: FIREFOX mode: headful + protocol: cdp + - os: ubuntu-latest + browser: CHROME + mode: headless + protocol: webdriverbidi + - os: ubuntu-latest + browser: CHROME + mode: headful + protocol: webdriverbidi + - os: ubuntu-latest + browser: CHROME + mode: headless-shell + protocol: webdriverbidi + - os: ubuntu-latest + browser: FIREFOX + mode: headless + protocol: webdriverbidi + - os: ubuntu-latest + browser: FIREFOX + mode: headful + protocol: webdriverbidi steps: - uses: actions/checkout@v3 - name: Setup .NET Core @@ -83,7 +113,7 @@ jobs: New-SelfSignedCertificate -Subject "localhost" -FriendlyName "Puppeteer" -CertStoreLocation "cert:\CurrentUser\My" Get-ChildItem -Path cert:\CurrentUSer\my | where { $_.friendlyname -eq "Puppeteer" } | Export-Certificate -FilePath $env:GITHUB_WORKSPACE\lib\PuppeteerSharp.TestServer\testCert.cer - name: Check formatting - if: ${{ matrix.os == 'ubuntu-latest' && matrix.browser == 'CHROME' && matrix.mode == 'headless' }} + if: ${{ matrix.os == 'ubuntu-latest' && matrix.browser == 'CHROME' && matrix.mode == 'headless' && matrix.protocol == 'cdp' }} run: dotnet format ./lib/PuppeteerSharp.sln --verify-no-changes - name: Build working-directory: lib @@ -93,6 +123,7 @@ jobs: env: PRODUCT: ${{ matrix.browser }} HEADLESS_MODE: ${{ matrix.mode }} + PROTOCOL: ${{ matrix.protocol }} run: | Xvfb :1 -screen 5 1024x768x8 & export DISPLAY=:1.5 @@ -103,6 +134,7 @@ jobs: env: PRODUCT: ${{ matrix.browser }} HEADLESS_MODE: ${{ matrix.mode }} + PROTOCOL: ${{ matrix.protocol }} run: | cd .\lib\PuppeteerSharp.Tests dotnet test -s test.runsettings --blame-hang-timeout 300000 diff --git a/lib/PuppeteerSharp.Nunit/PuppeteerTestAttribute.cs b/lib/PuppeteerSharp.Nunit/PuppeteerTestAttribute.cs index e16a717d9..e0c8054f1 100644 --- a/lib/PuppeteerSharp.Nunit/PuppeteerTestAttribute.cs +++ b/lib/PuppeteerSharp.Nunit/PuppeteerTestAttribute.cs @@ -21,8 +21,7 @@ public class PuppeteerTestAttribute : NUnitAttribute, IApplyToTest private static TestExpectation[] _localExpectations; private static TestExpectation[] _upstreamExpectations; public static readonly bool IsChrome = Environment.GetEnvironmentVariable("PRODUCT") != "FIREFOX"; - // TODO: Change implementation when we implement Webdriver Bidi - public static readonly bool IsCdp = true; + public static readonly bool IsCdp = Environment.GetEnvironmentVariable("PROTOCOL") != "webdriverbidi"; public static readonly HeadlessMode Headless = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HEADLESS_MODE")) ? (System.Diagnostics.Debugger.IsAttached ? HeadlessMode.False : HeadlessMode.True) : diff --git a/lib/PuppeteerSharp.Tests/TestConstants.cs b/lib/PuppeteerSharp.Tests/TestConstants.cs index 9b1ded441..6231c91b7 100644 --- a/lib/PuppeteerSharp.Tests/TestConstants.cs +++ b/lib/PuppeteerSharp.Tests/TestConstants.cs @@ -48,6 +48,7 @@ public static class TestConstants EnqueueAsyncMessages = Convert.ToBoolean(Environment.GetEnvironmentVariable("ENQUEUE_ASYNC_MESSAGES") ?? "false"), Timeout = 0, LogProcess = true, + Protocol = PuppeteerTestAttribute.IsCdp ? ProtocolType.Cdp : ProtocolType.WebdriverBiDi, #if NETCOREAPP EnqueueTransportMessages = false #else @@ -58,6 +59,7 @@ public static class TestConstants public static LaunchOptions BrowserWithExtensionOptions() => new() { Headless = false, + Protocol = PuppeteerTestAttribute.IsCdp ? ProtocolType.Cdp : ProtocolType.WebdriverBiDi, Args = new[] { $"--disable-extensions-except={ExtensionPath.Quote()}", diff --git a/lib/PuppeteerSharp/ConnectOptions.cs b/lib/PuppeteerSharp/ConnectOptions.cs index d11a525db..c89d476ca 100644 --- a/lib/PuppeteerSharp/ConnectOptions.cs +++ b/lib/PuppeteerSharp/ConnectOptions.cs @@ -15,12 +15,6 @@ public class ConnectOptions : IBrowserOptions, IConnectionOptions /// public bool IgnoreHTTPSErrors { get; set; } - /// - /// If set to true, sets Headless = false, otherwise, enables automation. - /// - [Obsolete("No longer required and usages should be removed")] - public bool AppMode { get; set; } - /// /// A browser websocket endpoint to connect to. /// @@ -37,12 +31,6 @@ public class ConnectOptions : IBrowserOptions, IConnectionOptions /// public int SlowMo { get; set; } - /// - /// Keep alive value. - /// - [Obsolete("Chromium doesn't support pings yet (see: https://bugs.chromium.org/p/chromium/issues/detail?id=865002)")] - public int KeepAliveInterval { get; set; } = 0; - /// /// Optional factory for implementations. /// If is set this property will be ignored. @@ -55,11 +43,8 @@ public class ConnectOptions : IBrowserOptions, IConnectionOptions /// The default Viewport. public ViewPortOptions DefaultViewport { get; set; } = ViewPortOptions.Default; - /// - /// Optional connection transport. - /// - [Obsolete("Use " + nameof(TransportFactory) + " instead")] - public IConnectionTransport Transport { get; set; } + /// + public ProtocolType Protocol { get; set; } = ProtocolType.Cdp; /// /// Optional factory for implementations. diff --git a/lib/PuppeteerSharp/IBrowserOptions.cs b/lib/PuppeteerSharp/IBrowserOptions.cs index 902b3c9e1..ab4f8a95a 100644 --- a/lib/PuppeteerSharp/IBrowserOptions.cs +++ b/lib/PuppeteerSharp/IBrowserOptions.cs @@ -15,5 +15,10 @@ public interface IBrowserOptions /// /// The default Viewport. ViewPortOptions DefaultViewport { get; set; } + + /// + /// Protocol type.. + /// + ProtocolType Protocol { get; set; } } } diff --git a/lib/PuppeteerSharp/LaunchOptions.cs b/lib/PuppeteerSharp/LaunchOptions.cs index 0c1ab4ab4..a9ada297f 100644 --- a/lib/PuppeteerSharp/LaunchOptions.cs +++ b/lib/PuppeteerSharp/LaunchOptions.cs @@ -91,12 +91,6 @@ public bool Devtools } } - /// - /// Keep alive value. - /// - [Obsolete("Chromium doesn't support pings yet (see: https://bugs.chromium.org/p/chromium/issues/detail?id=865002)")] - public int KeepAliveInterval { get; set; } = 0; - /// /// Logs process counts after launching chrome and after exiting. /// @@ -151,12 +145,6 @@ public string[] IgnoredDefaultArgs /// public WebSocketFactory WebSocketFactory { get; set; } - /// - /// Optional connection transport. - /// - [Obsolete("Use " + nameof(TransportFactory) + " instead")] - public IConnectionTransport Transport { get; set; } - /// /// Optional factory for implementations. /// @@ -168,6 +156,10 @@ public string[] IgnoredDefaultArgs /// The default Viewport. public ViewPortOptions DefaultViewport { get; set; } = ViewPortOptions.Default; + + /// + public ProtocolType Protocol { get; set; } + /// /// If not is set this will be use to determine is the default will enqueue messages. /// diff --git a/lib/PuppeteerSharp/ProtocolType.cs b/lib/PuppeteerSharp/ProtocolType.cs new file mode 100644 index 000000000..3e8afb781 --- /dev/null +++ b/lib/PuppeteerSharp/ProtocolType.cs @@ -0,0 +1,39 @@ +// * MIT License +// * +// * Copyright (c) DarĂ­o Kondratiuk +// * +// * Permission is hereby granted, free of charge, to any person obtaining a copy +// * of this software and associated documentation files (the "Software"), to deal +// * in the Software without restriction, including without limitation the rights +// * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// * copies of the Software, and to permit persons to whom the Software is +// * furnished to do so, subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included in all +// * copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// * SOFTWARE. + +namespace PuppeteerSharp; + +/// +/// Protocol used to communicate with the browser. +/// +public enum ProtocolType +{ + /// + /// Chrome DevTools Protocol. + /// + Cdp = 0, + + /// + /// Webdriver Bidi. + /// + WebdriverBiDi, +} From 3f84a05b017280d5ab7699a95c644ba7a94a76e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Kondratiuk?= Date: Mon, 1 Apr 2024 17:32:38 -0300 Subject: [PATCH 2/3] code style --- lib/PuppeteerSharp/LaunchOptions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/PuppeteerSharp/LaunchOptions.cs b/lib/PuppeteerSharp/LaunchOptions.cs index a9ada297f..65765910e 100644 --- a/lib/PuppeteerSharp/LaunchOptions.cs +++ b/lib/PuppeteerSharp/LaunchOptions.cs @@ -156,7 +156,6 @@ public string[] IgnoredDefaultArgs /// The default Viewport. public ViewPortOptions DefaultViewport { get; set; } = ViewPortOptions.Default; - /// public ProtocolType Protocol { get; set; } From 4e23bace5982c0c9503d27b7077f7d04c4c72f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Kondratiuk?= Date: Mon, 1 Apr 2024 17:51:41 -0300 Subject: [PATCH 3/3] Add protocol to browser class --- .../BrowserContextTests.cs | 3 +- .../BrowserTests/IsConnectedTests.cs | 7 +- .../BrowserTests/ProcessTests.cs | 9 ++- .../LauncherTests/BrowserCloseTests.cs | 32 +++++---- .../LauncherTests/BrowserDisconnectTests.cs | 6 +- .../BrowserEventsDisconnectedTests.cs | 6 +- .../LauncherTests/PuppeteerConnectTests.cs | 65 +++++++++---------- lib/PuppeteerSharp/Browser.cs | 4 +- lib/PuppeteerSharp/Cdp/CdpBrowser.cs | 3 + 9 files changed, 72 insertions(+), 63 deletions(-) diff --git a/lib/PuppeteerSharp.Tests/BrowserContextTests/BrowserContextTests.cs b/lib/PuppeteerSharp.Tests/BrowserContextTests/BrowserContextTests.cs index a0bc42360..87153b9a3 100644 --- a/lib/PuppeteerSharp.Tests/BrowserContextTests/BrowserContextTests.cs +++ b/lib/PuppeteerSharp.Tests/BrowserContextTests/BrowserContextTests.cs @@ -142,7 +142,8 @@ public async Task ShouldWorkAcrossSessions() var remoteBrowser = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = Browser.WebSocketEndpoint + BrowserWSEndpoint = Browser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, }); var contexts = remoteBrowser.BrowserContexts(); Assert.AreEqual(2, contexts.Length); diff --git a/lib/PuppeteerSharp.Tests/BrowserTests/IsConnectedTests.cs b/lib/PuppeteerSharp.Tests/BrowserTests/IsConnectedTests.cs index eda270251..1f274359e 100644 --- a/lib/PuppeteerSharp.Tests/BrowserTests/IsConnectedTests.cs +++ b/lib/PuppeteerSharp.Tests/BrowserTests/IsConnectedTests.cs @@ -6,16 +6,13 @@ namespace PuppeteerSharp.Tests.BrowserTests { public class IsConnectedTests : PuppeteerBrowserBaseTest { - public IsConnectedTests() : base() - { - } - [Test, Retry(2), PuppeteerTest("browser.spec", "Browser.isConnected", "should set the browser connected state")] public async Task ShouldSetTheBrowserConnectedState() { var newBrowser = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = Browser.WebSocketEndpoint + BrowserWSEndpoint = Browser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, }); Assert.True(newBrowser.IsConnected); newBrowser.Disconnect(); diff --git a/lib/PuppeteerSharp.Tests/BrowserTests/ProcessTests.cs b/lib/PuppeteerSharp.Tests/BrowserTests/ProcessTests.cs index ae482b1c2..8e2b7e16e 100644 --- a/lib/PuppeteerSharp.Tests/BrowserTests/ProcessTests.cs +++ b/lib/PuppeteerSharp.Tests/BrowserTests/ProcessTests.cs @@ -6,8 +6,6 @@ namespace PuppeteerSharp.Tests.BrowserTests { public class ProcessTests : PuppeteerBrowserBaseTest { - public ProcessTests() : base() { } - [Test, Retry(2), PuppeteerTest("browser.spec", "Browser.process", "should return child_process instance")] public void ShouldReturnProcessInstance() { @@ -20,7 +18,12 @@ public async Task ShouldNotReturnChildProcessForRemoteBrowser() { var browserWSEndpoint = Browser.WebSocketEndpoint; var remoteBrowser = await Puppeteer.ConnectAsync( - new ConnectOptions { BrowserWSEndpoint = browserWSEndpoint }, TestConstants.LoggerFactory); + new ConnectOptions + { + BrowserWSEndpoint = browserWSEndpoint, + Protocol = ((Browser)Browser).Protocol, + }, + TestConstants.LoggerFactory); Assert.Null(remoteBrowser.Process); remoteBrowser.Disconnect(); } diff --git a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserCloseTests.cs b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserCloseTests.cs index bba2de405..a94276747 100644 --- a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserCloseTests.cs +++ b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserCloseTests.cs @@ -6,30 +6,28 @@ namespace PuppeteerSharp.Tests.BrowserTests.Events { public class BrowserCloseTests : PuppeteerBrowserBaseTest { - public BrowserCloseTests() : base() - { - } - [Test, Retry(2), PuppeteerTest("launcher.spec", "Launcher specs Browser.close", "should terminate network waiters")] public async Task ShouldTerminateNetworkWaiters() { - await using (var browser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions())) - await using (var remote = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = browser.WebSocketEndpoint })) + await using var browser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions()); + await using var remote = await Puppeteer.ConnectAsync(new ConnectOptions { - var newPage = await remote.NewPageAsync(); - var requestTask = newPage.WaitForRequestAsync(TestConstants.EmptyPage); - var responseTask = newPage.WaitForResponseAsync(TestConstants.EmptyPage); + BrowserWSEndpoint = browser.WebSocketEndpoint, + Protocol = ((Browser)browser).Protocol, + }); + var newPage = await remote.NewPageAsync(); + var requestTask = newPage.WaitForRequestAsync(TestConstants.EmptyPage); + var responseTask = newPage.WaitForResponseAsync(TestConstants.EmptyPage); - await browser.CloseAsync(); + await browser.CloseAsync(); - var exception = Assert.ThrowsAsync(() => requestTask); - StringAssert.Contains("Target closed", exception.Message); - StringAssert.DoesNotContain("Timeout", exception.Message); + var exception = Assert.ThrowsAsync(() => requestTask); + StringAssert.Contains("Target closed", exception.Message); + StringAssert.DoesNotContain("Timeout", exception.Message); - exception = Assert.ThrowsAsync(() => responseTask); - StringAssert.Contains("Target closed", exception.Message); - StringAssert.DoesNotContain("Timeout", exception.Message); - } + exception = Assert.ThrowsAsync(() => responseTask); + StringAssert.Contains("Target closed", exception.Message); + StringAssert.DoesNotContain("Timeout", exception.Message); } } } diff --git a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserDisconnectTests.cs b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserDisconnectTests.cs index 681b3d26e..64055b426 100644 --- a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserDisconnectTests.cs +++ b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserDisconnectTests.cs @@ -15,7 +15,8 @@ public async Task ShouldRejectNavigationWhenBrowserCloses() await using var browser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions()); var remote = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = browser.WebSocketEndpoint + BrowserWSEndpoint = browser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, }); var page = await remote.NewPageAsync(); var navigationTask = page.GoToAsync(TestConstants.ServerUrl + "/one-style.html", new NavigationOptions @@ -41,7 +42,8 @@ public async Task ShouldRejectWaitForSelectorWhenBrowserCloses() await using var browser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions()); var remote = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = browser.WebSocketEndpoint + BrowserWSEndpoint = browser.WebSocketEndpoint, + Protocol = ((Browser)browser).Protocol, }); var page = await remote.NewPageAsync(); var watchdog = page.WaitForSelectorAsync("div", new WaitForSelectorOptions { Timeout = 60000 }); diff --git a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserEventsDisconnectedTests.cs b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserEventsDisconnectedTests.cs index bd3c0da32..e90b39933 100644 --- a/lib/PuppeteerSharp.Tests/LauncherTests/BrowserEventsDisconnectedTests.cs +++ b/lib/PuppeteerSharp.Tests/LauncherTests/BrowserEventsDisconnectedTests.cs @@ -14,7 +14,11 @@ public BrowserEventsDisconnectedTests() : base() public async Task ShouldEmittedWhenBrowserGetsClosedDisconnectedOrUnderlyingWebsocketGetsClosed() { var originalBrowser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions(), TestConstants.LoggerFactory); - var connectOptions = new ConnectOptions { BrowserWSEndpoint = originalBrowser.WebSocketEndpoint }; + var connectOptions = new ConnectOptions + { + BrowserWSEndpoint = originalBrowser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, + }; var remoteBrowser1 = await Puppeteer.ConnectAsync(connectOptions, TestConstants.LoggerFactory); var remoteBrowser2 = await Puppeteer.ConnectAsync(connectOptions, TestConstants.LoggerFactory); diff --git a/lib/PuppeteerSharp.Tests/LauncherTests/PuppeteerConnectTests.cs b/lib/PuppeteerSharp.Tests/LauncherTests/PuppeteerConnectTests.cs index 73603b4ee..8172fc62c 100644 --- a/lib/PuppeteerSharp.Tests/LauncherTests/PuppeteerConnectTests.cs +++ b/lib/PuppeteerSharp.Tests/LauncherTests/PuppeteerConnectTests.cs @@ -1,4 +1,3 @@ -using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Connections.Features; @@ -11,16 +10,13 @@ namespace PuppeteerSharp.Tests.LauncherTests { public class PuppeteerConnectTests : PuppeteerBrowserBaseTest { - public PuppeteerConnectTests() : base() - { - } - [Test, Retry(2), PuppeteerTest("launcher.spec", "Launcher specs Puppeteer Puppeteer.connect", "should be able to connect multiple times to the same browser")] public async Task ShouldBeAbleToConnectMultipleTimesToSameBrowser() { var options = new ConnectOptions() { - BrowserWSEndpoint = Browser.WebSocketEndpoint + BrowserWSEndpoint = Browser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, }; var browser = await Puppeteer.ConnectAsync(options, TestConstants.LoggerFactory); await using (var page = await browser.NewPageAsync()) @@ -55,30 +51,29 @@ await Task.WhenAll( [Test, Retry(2), PuppeteerTest("launcher.spec", "Launcher specs Puppeteer Puppeteer.connect", "should support ignoreHTTPSErrors option")] public async Task ShouldSupportIgnoreHTTPSErrorsOption() { - await using (var originalBrowser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions())) - await using (var browser = await Puppeteer.ConnectAsync(new ConnectOptions + await using var originalBrowser = await Puppeteer.LaunchAsync(TestConstants.DefaultBrowserOptions()); + await using var browser = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = originalBrowser.WebSocketEndpoint, - IgnoreHTTPSErrors = true - })) - await using (var page = await browser.NewPageAsync()) - { - var requestTask = HttpsServer.WaitForRequest( - "/empty.html", - request => request?.HttpContext?.Features?.Get()?.Protocol); - var responseTask = page.GoToAsync(TestConstants.HttpsPrefix + "/empty.html"); - - await Task.WhenAll( - requestTask, - responseTask).WithTimeout(Puppeteer.DefaultTimeout); - - var response = responseTask.Result; - Assert.True(response.Ok); - Assert.NotNull(response.SecurityDetails); - Assert.AreEqual( - TestUtils.CurateProtocol(requestTask.Result.ToString()), - TestUtils.CurateProtocol(response.SecurityDetails.Protocol)); - } + IgnoreHTTPSErrors = true, + Protocol = ((Browser)Browser).Protocol, + }); + await using var page = await browser.NewPageAsync(); + var requestTask = HttpsServer.WaitForRequest( + "/empty.html", + request => request?.HttpContext.Features.Get()?.Protocol); + var responseTask = page.GoToAsync(TestConstants.HttpsPrefix + "/empty.html"); + + await Task.WhenAll( + requestTask, + responseTask).WithTimeout(Puppeteer.DefaultTimeout); + + var response = responseTask.Result; + Assert.True(response.Ok); + Assert.NotNull(response.SecurityDetails); + Assert.AreEqual( + TestUtils.CurateProtocol(requestTask.Result.ToString()), + TestUtils.CurateProtocol(response.SecurityDetails.Protocol)); } [Test, Retry(2), PuppeteerTest("launcher.spec", "Launcher specs Puppeteer Puppeteer.connect", "should support targetFilter option")] @@ -94,7 +89,8 @@ public async Task ShouldSupportTargetFilter() var remoteBrowser = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = browser.WebSocketEndpoint, - TargetFilter = (Target target) => !target.Url.Contains("should-be-ignored"), + TargetFilter = target => !target.Url.Contains("should-be-ignored"), + Protocol = ((Browser)browser).Protocol, }, TestConstants.LoggerFactory); var pages = await remoteBrowser.PagesAsync(); @@ -105,7 +101,7 @@ public async Task ShouldSupportTargetFilter() "about:blank", TestConstants.EmptyPage }, - pages.Select((IPage p) => p.Url).OrderBy(t => t)); + pages.Select(p => p.Url).OrderBy(t => t)); await page2.CloseAsync(); await page1.CloseAsync(); @@ -136,7 +132,8 @@ public async Task ShouldBeAbleToReconnectToADisconnectedBrowser() { var options = new ConnectOptions() { - BrowserWSEndpoint = Browser.WebSocketEndpoint + BrowserWSEndpoint = Browser.WebSocketEndpoint, + Protocol = ((Browser)Browser).Protocol, }; var url = TestConstants.ServerUrl + "/frames/nested-frames.html"; @@ -161,7 +158,8 @@ public async Task ShouldBeAbleToConnectToTheSamePageSimultaneously() var browserOne = await Puppeteer.LaunchAsync(new LaunchOptions()); var browserTwo = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = browserOne.WebSocketEndpoint + BrowserWSEndpoint = browserOne.WebSocketEndpoint, + Protocol = ((Browser)browserOne).Protocol, }); var tcs = new TaskCompletionSource(); async void TargetCreated(object sender, TargetChangedArgs e) @@ -192,7 +190,8 @@ public async Task ShouldBeAbleToReconnect() var browserTwo = await Puppeteer.ConnectAsync(new ConnectOptions { - BrowserWSEndpoint = browserWSEndpoint + BrowserWSEndpoint = browserWSEndpoint, + Protocol = ((Browser)browserOne).Protocol, }); var pages = await browserTwo.PagesAsync(); diff --git a/lib/PuppeteerSharp/Browser.cs b/lib/PuppeteerSharp/Browser.cs index 4c1a1a379..e6112af9a 100644 --- a/lib/PuppeteerSharp/Browser.cs +++ b/lib/PuppeteerSharp/Browser.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Net.Sockets; using System.Threading.Tasks; using PuppeteerSharp.Cdp; -using PuppeteerSharp.Cdp.Messaging; using PuppeteerSharp.Helpers; namespace PuppeteerSharp @@ -67,6 +67,8 @@ public abstract class Browser : IBrowser internal Func IsPageTargetFunc { get; set; } + internal abstract ProtocolType Protocol { get; } + /// public abstract Task NewPageAsync(); diff --git a/lib/PuppeteerSharp/Cdp/CdpBrowser.cs b/lib/PuppeteerSharp/Cdp/CdpBrowser.cs index b35b3a777..dc64645c9 100644 --- a/lib/PuppeteerSharp/Cdp/CdpBrowser.cs +++ b/lib/PuppeteerSharp/Cdp/CdpBrowser.cs @@ -24,6 +24,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Net.Sockets; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using PuppeteerSharp.Cdp.Messaging; @@ -103,6 +104,8 @@ public override bool IsClosed internal ITargetManager TargetManager { get; } + internal override ProtocolType Protocol => ProtocolType.Cdp; + /// public override Task NewPageAsync() => DefaultContext.NewPageAsync();