Created
August 26, 2021 19:15
-
-
Save BashkaMen/f025133366de750ab57581a08b38eb70 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Runtime.CompilerServices; | |
using System.Threading.Tasks; | |
using OpenQA.Selenium; | |
using OpenQA.Selenium.Chrome; | |
using OpenQA.Selenium.Remote; | |
namespace SeleniumExt | |
{ | |
enum DriverStep | |
{ | |
SetupProxy, | |
SetupAntiCaptcha, | |
SetupTimeouts, | |
} | |
public class DriverBuilder | |
{ | |
private readonly Dictionary<DriverStep, Func<RemoteWebDriver, Task>> _steps = new(); | |
private readonly ChromeOptions _options = new(); | |
public DriverBuilder() | |
{ | |
_options.AddAdditionalCapability("enableVNC", true, true); | |
_options.AddAdditionalCapability("screenResolution", "1920x1080x24", true); | |
_options.AddArgument("no-sandbox"); | |
_options.AddArgument("no-first-run"); | |
_options.AddArgument("ignore-certificate-errors"); | |
} | |
public async Task<IWebDriver> Build() | |
{ | |
var driver = new ChromeDriver(_options); | |
driver.Manage().Window.Maximize(); | |
var steps = _steps.OrderBy(s => s.Key).Select(s => s.Value); | |
foreach (var step in steps) | |
{ | |
await step(driver); | |
} | |
return driver; | |
} | |
public DriverBuilder WithProxy(string address, string port, string login, string pass) | |
{ | |
_options.AddExtension("data/Proxy-Auto-Auth_v2.0.crx"); | |
_options.AddArgument($"--proxy-server={address}:{port}"); | |
_steps[DriverStep.SetupProxy] = async (driver) => | |
{ | |
await Task.Delay(500); | |
while (driver.WindowHandles.Count > 1) | |
{ | |
driver.SwitchTo().Window(driver.WindowHandles.First()); | |
driver.Close(); | |
} | |
driver.SwitchTo().Window(driver.WindowHandles.First()); | |
driver.Navigate().GoToUrl("chrome-extension://cklagoffpkflepjbjnhjkibfjdkldaol/options.html"); | |
var loginTxt = await driver.FindActive(By.CssSelector("#login")); | |
var passTxt = await driver.FindActive(By.CssSelector("#password")); | |
var saveBtn = await driver.FindActive(By.CssSelector("#save")); | |
loginTxt.Clear(); | |
passTxt.Clear(); | |
loginTxt.SendKeys(login); | |
passTxt.SendKeys(pass); | |
saveBtn.Click(); | |
await Task.Delay(500); | |
}; | |
return this; | |
} | |
public DriverBuilder WithAntiCaptcha(string apiKey) | |
{ | |
_options.AddExtension("data/anticaptcha-plugin_v0.53.crx"); | |
_steps[DriverStep.SetupAntiCaptcha] = async (driver) => | |
{ | |
driver.Navigate().GoToUrl("chrome-extension://lncaoejhfdpcafpkkcddpjnhnodcajfg/options.html"); | |
var keyTxt = await driver.FindActive(By.CssSelector("input[name='account_key']")); | |
var saveBtn = await driver.FindActive(By.CssSelector(".save_button")); | |
keyTxt.SendKeys(apiKey); | |
saveBtn.Click(); | |
}; | |
return this; | |
} | |
public DriverBuilder WithSessionName(string name) | |
{ | |
_options.AddAdditionalCapability("name", name, true); | |
return this; | |
} | |
public DriverBuilder WithTimeouts(TimeSpan findElement, TimeSpan pageLoad) | |
{ | |
_steps[DriverStep.SetupTimeouts] = async (driver) => | |
{ | |
driver.Manage().Timeouts().PageLoad = pageLoad; | |
driver.Manage().Timeouts().ImplicitWait = findElement; | |
}; | |
return this; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment