public static void ChromedriverDispose(ChromeDriverHelper helper) { string ids = string.Join(", ", helper.AttachedProcessesIds); try { helper.ChromeDriver.Quit(); helper.AttachedProcessesIds.ForEach(s => { try { var proc = Process.GetProcessById(int.Parse(s)); killProc(proc); } catch { } }); helper.AttachedProcessesIds = new List <string>(); File.WriteAllLines(Directory.GetCurrentDirectory() + "\\drivers.txt", chromeDriversIds); ChromeDriverHelpers.Remove(helper); helper = null; } catch (Exception e) { throw new Exception("ids(" + ids + "): " + e.Message); } }
/// <summary> /// Returns a new chromedriver instance with given parameters, and saves its information. /// Each set_up must be followed by dispose or disposeAll. /// It's possible that some other chrome tabs(even in normal browsers) created during execution of this function are closed at later disposal /// It's better off launching projects with this function as administrator. /// To force so: create app.manifest and set it there: tag + "requestedExecutionLevel level = "requireAdministrator" uiAccess="false" />" /// /**/ /// </summary> /// <param name="visible">False if chrome must run silently</param> /// <param name="ignoreSetificateErrors"></param> /// <param name="proxyServer">IPAddress:Port</param> /// <param name="proxyWithAuthentication"></param> /// <param name="extensionPaths">Leave it empty or null not to use a consistant chrome profile</param> /// <returns></returns> public static ChromeDriverHelper ChromedriverSetUp(ChromeDriverSetUpOptions setUpOptions) { try { #region create service and options //create instance var service = ChromeDriverService.CreateDefaultService(); service.HideCommandPromptWindow = true; var options = new ChromeOptions(); #region set options try { options.AddArgument("--enable-extensions"); options.AddArgument("--start-maximized"); #region proxy if (setUpOptions.ProxyServer != "") { Proxy proxy = new Proxy() { Kind = ProxyKind.Manual, IsAutoDetect = false, SocksUserName = setUpOptions.ProxyLogin != null ? setUpOptions.ProxyLogin : "", SocksPassword = setUpOptions.ProxyPassword != null ? setUpOptions.ProxyPassword : "", HttpProxy = setUpOptions.ProxyServer, //"127.0.0.1:3330", SslProxy = setUpOptions.ProxyServer //"127.0.0.1:3330" }; options.Proxy = proxy; } #endregion #region set visibility try { if (!setUpOptions.Visible) { options.AddArgument("headless"); } } catch (Exception e) { throw new Exception("Can't set visibility. " + e.Message); } #endregion #region set extensions try { if (setUpOptions.ExtensionsPaths != null) { foreach (var extension in setUpOptions.ExtensionsPaths) { if (!string.IsNullOrEmpty(extension)) { options.AddArgument("--load-extension=" + extension); } } } //options.AddExtension(extension); } catch (Exception e) { throw new Exception("Can't set chrome extensions: " + e.Message); } #endregion #region set ignore sertificate errors try { if (setUpOptions.IgnoreSertivicateErrors) { options.AddArgument("ignore-certificate-errors"); } } catch (Exception e) { throw new Exception("Can't set ignore certificate errors. " + e.Message); } #endregion } catch (Exception e) { throw new Exception("Can't set options: " + e.Message); } #endregion #endregion var chromeRelatedIds = getChromeRelatedProcesses(); //WaitSmoothly.Do(1.5); //initialize chromedriver ChromeDriver chrome = new ChromeDriver(service, options, new TimeSpan(0, 1, 0)); //chrome.Manage().Cookies.DeleteAllCookies(); Wait.Do(1.5); //get chrome related processes after initialization. Can throw error that access denied. Dealt away with running as administaror var latestChromeRelatedIds = getChromeRelatedProcesses(); Wait.Do(1.5); //save newly created processes' ids to list lastCreatedDriverIds = new List <string>(); lastCreatedDriverIds = latestChromeRelatedIds .Where(s => !chromeRelatedIds.Any(a => a.Id == s.Id)) .Select(s => s.Id.ToString()) .ToList(); //save new helper to list var lastHelper = new ChromeDriverHelper() { ChromeDriver = chrome, AttachedProcessesIds = lastCreatedDriverIds }; ChromeDriverHelpers.Add(lastHelper); //save newly created processees' ids to a file File.AppendAllLines(Directory.GetCurrentDirectory() + "\\drivers.txt", lastCreatedDriverIds); return(lastHelper); } catch (Exception e) { throw new Exception(e.Message); } }