From b5faf58b1a4eb5e049c12789988aaf378440ec72 Mon Sep 17 00:00:00 2001 From: qwsdcvghyu89 <61093706+qwsdcvghyu89@users.noreply.github.com> Date: Fri, 14 Nov 2025 04:36:03 +1100 Subject: [PATCH] feat: add support for remote WebDriver and improve StealthConfig browser logic - Added `RemoteAddress` property to `StealthConfig` for remote WebDriver support. - Refactored browser driver creation logic with `DriverDefinition` for enhanced consistency. - Improved error handling in browser fallback mechanism. - Incremented project version to 2.4.6. --- Beam.Stealth/StealthConfig.cs | 31 +++++++++++++++++++----------- aeqw89.Beam/aeqw89.Beam.csproj | 4 ++-- aeqw89.Beam/aeqw89.Beam.csproj.bak | 4 ++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Beam.Stealth/StealthConfig.cs b/Beam.Stealth/StealthConfig.cs index c0642fb..5c9c376 100644 --- a/Beam.Stealth/StealthConfig.cs +++ b/Beam.Stealth/StealthConfig.cs @@ -5,13 +5,14 @@ using OpenQA.Selenium; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Edge; +using OpenQA.Selenium.Remote; namespace Beam.Stealth { public enum Browser { Firefox = 0, Chrome = 1, Chromium = 2, - Edge = 3 + Edge = 3, } public sealed class StealthConfig : IDisposable { @@ -21,6 +22,8 @@ namespace Beam.Stealth { public ILogger? Logger { get; init; } public required IWebDriver Driver { get; init; } + public string? RemoteAddress { get; init; } + private StealthConfig(string downloadDir) => DownloadsDirectory = downloadDir; /* ---------- browser-specific option builders ---------- */ @@ -68,12 +71,13 @@ namespace Beam.Stealth { } /* ---------- factory ---------- */ - + private record DriverDefinition(Func Factory, DriverOptions Options); public static StealthConfig Create( bool showBrowser = false, string? downloadDir = null, TimeSpan? timeOut = null, Browser preferredBrowser = Browser.Firefox, + string? remoteAddress = null, ILogger? logger = null) { // pick or create a dedicated download folder downloadDir ??= Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); @@ -82,24 +86,29 @@ namespace Beam.Stealth { bool headless = !showBrowser; IWebDriver? driver = null; List? errors = []; - + while (preferredBrowser <= Browser.Edge) { try { - driver = preferredBrowser switch { - Browser.Chrome or Browser.Chromium - => new ChromeDriver(GetChromeOptions(downloadDir, headless)), - Browser.Edge - => new EdgeDriver(GetEdgeOptions(downloadDir, headless)), - Browser.Firefox or _ - => new FirefoxDriver(GetFirefoxOptions(downloadDir, headless)), + DriverDefinition def = preferredBrowser switch { + Browser.Chrome or Browser.Chromium + => new((DriverOptions opts) => new ChromeDriver(opts as ChromeOptions), GetChromeOptions(downloadDir, headless)), + Browser.Edge + => new((DriverOptions opts) => new EdgeDriver(opts as EdgeOptions), GetEdgeOptions(downloadDir, headless)), + Browser.Firefox or _ + => new((DriverOptions opts) => new FirefoxDriver(opts as FirefoxOptions), GetFirefoxOptions(downloadDir, headless)), }; + + if (remoteAddress is not null) + driver = new RemoteWebDriver(new Uri(remoteAddress), def.Options); + else + driver = def.Factory(def.Options); break; } catch (Exception e) { if (preferredBrowser != Browser.Edge) logger?.LogWarning(e, "Failed to create driver for browser {Browser}, falling back to {Fallback}", preferredBrowser, Enum.GetName(preferredBrowser + 1)); else { - logger?.LogCritical(e, "Failed to create driver for browser {Browser}, no more fallback remaining!", preferredBrowser); + logger?.LogCritical(e, "Failed to create driver for browser {Browser}, no more fallbacks remaining!", preferredBrowser); } preferredBrowser++; diff --git a/aeqw89.Beam/aeqw89.Beam.csproj b/aeqw89.Beam/aeqw89.Beam.csproj index 933028d..a738cb3 100644 --- a/aeqw89.Beam/aeqw89.Beam.csproj +++ b/aeqw89.Beam/aeqw89.Beam.csproj @@ -7,12 +7,12 @@ Beam aeqw89 qwsdcvghyu - 2.4.5 + 2.4.6 A library for downloading internet resources https://github.com/qwsdcvghyu89/Beam https://github.com/qwsdcvghyu89/Beam aeqw89.Beam - 2.4.5 + 2.4.6 diff --git a/aeqw89.Beam/aeqw89.Beam.csproj.bak b/aeqw89.Beam/aeqw89.Beam.csproj.bak index 6244b80..933028d 100644 --- a/aeqw89.Beam/aeqw89.Beam.csproj.bak +++ b/aeqw89.Beam/aeqw89.Beam.csproj.bak @@ -7,12 +7,12 @@ Beam aeqw89 qwsdcvghyu - 2.4.4 + 2.4.5 A library for downloading internet resources https://github.com/qwsdcvghyu89/Beam https://github.com/qwsdcvghyu89/Beam aeqw89.Beam - 2.4.4 + 2.4.5