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:
@@ -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++;
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user