Skip to content

Instantly share code, notes, and snippets.

@BashkaMen
Created August 26, 2021 19:15
Show Gist options
  • Save BashkaMen/f025133366de750ab57581a08b38eb70 to your computer and use it in GitHub Desktop.
Save BashkaMen/f025133366de750ab57581a08b38eb70 to your computer and use it in GitHub Desktop.
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