Refactor data providers and update abstractions

- Removed obsolete data providers: `AnchorCollectionDataProvider`, `ContentsDataProvider`, and others, consolidating logic into new composable providers.
- Added `ComposeDataProviders`, `SelectDataProvider`, and `RelationalDataProvider` for improved flexibility and reusability.
- Introduced `IManySelectionComposableDataProvider` interface to support multiple-node selection.
- Enhanced `UnitDownloader` with more robust progress tracking.
- Updated package references and project dependencies for consistency.
- Improved error handling in `StealthConfig` initialization for better fallback on browser drivers.
- Incremented project version to 2.4.5.
This commit is contained in:
qwsdcvghyu89
2025-11-14 03:41:13 +11:00
parent 2958a26e4f
commit 18c5ad83da
27 changed files with 510 additions and 248 deletions
+32 -13
View File
@@ -8,10 +8,10 @@ using OpenQA.Selenium.Edge;
namespace Beam.Stealth {
public enum Browser {
Firefox,
Chrome,
Chromium,
Edge
Firefox = 0,
Chrome = 1,
Chromium = 2,
Edge = 3
}
public sealed class StealthConfig : IDisposable {
@@ -73,23 +73,42 @@ namespace Beam.Stealth {
bool showBrowser = false,
string? downloadDir = null,
TimeSpan? timeOut = null,
Browser browser = Browser.Firefox,
Browser preferredBrowser = Browser.Firefox,
ILogger? logger = null) {
// pick or create a dedicated download folder
downloadDir ??= Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(downloadDir);
bool headless = !showBrowser;
IWebDriver? driver = null;
List<Exception>? errors = [];
IWebDriver driver = browser 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)),
};
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)),
};
}
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);
}
preferredBrowser++;
errors.Add(e);
}
}
if (driver is null)
throw new AggregateException(errors);
return new StealthConfig(downloadDir) {
ShowBrowser = showBrowser,
TimeOut = timeOut ?? Timeout.InfiniteTimeSpan,