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.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<DriverOptions, IWebDriver> 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());
|
||||
@@ -85,21 +89,26 @@ namespace Beam.Stealth {
|
||||
|
||||
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++;
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
<Title>Beam</Title>
|
||||
<Authors>aeqw89</Authors>
|
||||
<Company>qwsdcvghyu</Company>
|
||||
<Version>2.4.5</Version>
|
||||
<Version>2.4.6</Version>
|
||||
<Description>A library for downloading internet resources</Description>
|
||||
<PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl>
|
||||
<PackageId>aeqw89.Beam</PackageId>
|
||||
<PackageVersion>2.4.5</PackageVersion>
|
||||
<PackageVersion>2.4.6</PackageVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Beam.Api\Beam.Api.csproj">
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
<Title>Beam</Title>
|
||||
<Authors>aeqw89</Authors>
|
||||
<Company>qwsdcvghyu</Company>
|
||||
<Version>2.4.4</Version>
|
||||
<Version>2.4.5</Version>
|
||||
<Description>A library for downloading internet resources</Description>
|
||||
<PackageProjectUrl>https://github.com/qwsdcvghyu89/Beam</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/qwsdcvghyu89/Beam</RepositoryUrl>
|
||||
<PackageId>aeqw89.Beam</PackageId>
|
||||
<PackageVersion>2.4.4</PackageVersion>
|
||||
<PackageVersion>2.4.5</PackageVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Beam.Api\Beam.Api.csproj">
|
||||
|
||||
Reference in New Issue
Block a user