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