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.
This commit is contained in:
qwsdcvghyu89
2025-11-14 04:36:03 +11:00
parent 76cf78006b
commit b5faf58b1a
3 changed files with 24 additions and 15 deletions
+20 -11
View File
@@ -5,13 +5,14 @@ using OpenQA.Selenium;
using OpenQA.Selenium.Firefox; using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Edge; using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Remote;
namespace Beam.Stealth { namespace Beam.Stealth {
public enum Browser { public enum Browser {
Firefox = 0, Firefox = 0,
Chrome = 1, Chrome = 1,
Chromium = 2, Chromium = 2,
Edge = 3 Edge = 3,
} }
public sealed class StealthConfig : IDisposable { public sealed class StealthConfig : IDisposable {
@@ -21,6 +22,8 @@ namespace Beam.Stealth {
public ILogger? Logger { get; init; } public ILogger? Logger { get; init; }
public required IWebDriver Driver { get; init; } public required IWebDriver Driver { get; init; }
public string? RemoteAddress { get; init; }
private StealthConfig(string downloadDir) => DownloadsDirectory = downloadDir; private StealthConfig(string downloadDir) => DownloadsDirectory = downloadDir;
/* ---------- browser-specific option builders ---------- */ /* ---------- browser-specific option builders ---------- */
@@ -68,12 +71,13 @@ namespace Beam.Stealth {
} }
/* ---------- factory ---------- */ /* ---------- factory ---------- */
private record DriverDefinition(Func<DriverOptions, IWebDriver> Factory, DriverOptions Options);
public static StealthConfig Create( public static StealthConfig Create(
bool showBrowser = false, bool showBrowser = false,
string? downloadDir = null, string? downloadDir = null,
TimeSpan? timeOut = null, TimeSpan? timeOut = null,
Browser preferredBrowser = Browser.Firefox, Browser preferredBrowser = Browser.Firefox,
string? remoteAddress = null,
ILogger? logger = null) { ILogger? logger = null) {
// pick or create a dedicated download folder // pick or create a dedicated download folder
downloadDir ??= Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); downloadDir ??= Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
@@ -82,24 +86,29 @@ namespace Beam.Stealth {
bool headless = !showBrowser; bool headless = !showBrowser;
IWebDriver? driver = null; IWebDriver? driver = null;
List<Exception>? errors = []; List<Exception>? errors = [];
while (preferredBrowser <= Browser.Edge) { while (preferredBrowser <= Browser.Edge) {
try { try {
driver = preferredBrowser switch { DriverDefinition def = preferredBrowser switch {
Browser.Chrome or Browser.Chromium Browser.Chrome or Browser.Chromium
=> new ChromeDriver(GetChromeOptions(downloadDir, headless)), => new((DriverOptions opts) => new ChromeDriver(opts as ChromeOptions), GetChromeOptions(downloadDir, headless)),
Browser.Edge Browser.Edge
=> new EdgeDriver(GetEdgeOptions(downloadDir, headless)), => new((DriverOptions opts) => new EdgeDriver(opts as EdgeOptions), GetEdgeOptions(downloadDir, headless)),
Browser.Firefox or _ Browser.Firefox or _
=> new FirefoxDriver(GetFirefoxOptions(downloadDir, headless)), => 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; break;
} }
catch (Exception e) { catch (Exception e) {
if (preferredBrowser != Browser.Edge) if (preferredBrowser != Browser.Edge)
logger?.LogWarning(e, "Failed to create driver for browser {Browser}, falling back to {Fallback}", preferredBrowser, Enum.GetName(preferredBrowser + 1)); logger?.LogWarning(e, "Failed to create driver for browser {Browser}, falling back to {Fallback}", preferredBrowser, Enum.GetName(preferredBrowser + 1));
else { 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++; preferredBrowser++;
+2 -2
View File
@@ -7,12 +7,12 @@
<Title>Beam</Title> <Title>Beam</Title>
<Authors>aeqw89</Authors> <Authors>aeqw89</Authors>
<Company>qwsdcvghyu</Company> <Company>qwsdcvghyu</Company>
<Version>2.4.5</Version> <Version>2.4.6</Version>
<Description>A library for downloading internet resources</Description> <Description>A library for downloading internet resources</Description>
<PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl> <PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl>
<RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl> <RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl>
<PackageId>aeqw89.Beam</PackageId> <PackageId>aeqw89.Beam</PackageId>
<PackageVersion>2.4.5</PackageVersion> <PackageVersion>2.4.6</PackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Beam.Api\Beam.Api.csproj"> <ProjectReference Include="..\Beam.Api\Beam.Api.csproj">
+2 -2
View File
@@ -7,12 +7,12 @@
<Title>Beam</Title> <Title>Beam</Title>
<Authors>aeqw89</Authors> <Authors>aeqw89</Authors>
<Company>qwsdcvghyu</Company> <Company>qwsdcvghyu</Company>
<Version>2.4.4</Version> <Version>2.4.5</Version>
<Description>A library for downloading internet resources</Description> <Description>A library for downloading internet resources</Description>
<PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl> <PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl>
<RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl> <RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl>
<PackageId>aeqw89.Beam</PackageId> <PackageId>aeqw89.Beam</PackageId>
<PackageVersion>2.4.4</PackageVersion> <PackageVersion>2.4.5</PackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Beam.Api\Beam.Api.csproj"> <ProjectReference Include="..\Beam.Api\Beam.Api.csproj">