lincher
lincher

Reputation: 65

How to authenticate (user/password) proxy in c# selenium chrome driver

I have a HTTP/HTTPS proxy which need to authenticate using username and password. How do I do that using C# selenium chrome webdriver?

string host = proxies[count].Split(':')[0];
int port = Convert.ToInt32(proxies[count].Split(':')[1]) + 1;

string prox = host + ":" + port.ToString();

OpenQA.Selenium.Proxy proxy = new OpenQA.Selenium.Proxy();
proxy.HttpProxy = prox;
proxy.SslProxy = prox;
options.Proxy = proxy;

options is the ChromeOptions class which I assign to the driver.

Upvotes: 4

Views: 17502

Answers (7)

Evgeny Ivanov
Evgeny Ivanov

Reputation: 534

Answered in another thread C# Selenium Proxy Authentication with Chrome Driver.

Main idea - use Selenium 4.0 and BiDi APIs.

Upvotes: 0

Davydenko Roman
Davydenko Roman

Reputation: 116

I created little package for yor problem (https://github.com/RDavydenko/OpenQA.Selenium.Chrome.ChromeDriverExtensions)

Install Package:

Install-Package OpenQA.Selenium.Chrome.ChromeDriverExtensions -Version 1.2.0

Use for your ChromeOptions:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Chrome.ChromeDriverExtensions;
...
var options = new ChromeOptions();

// Add your HTTP-Proxy
options.AddHttpProxy(PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD);

var driver = new ChromeDriver(options); // or new ChromeDriver(AppDomain.CurrentDomain.BaseDirectory, options);

driver.Navigate().GoToUrl("https://whatismyipaddress.com/"); // Check your IP

Instead of PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD, use the parameters of your proxy

Upvotes: 6

Adi Kusuma
Adi Kusuma

Reputation: 45

Chrome won't let you use any extension for selenium web testing these days. And selenium doesn't have any built in username & password input for proxies.

The only solution I found is using AutoIt. It will automates windows level actions. While selenium only automates browser level actions.

Passing username and password to the proxy dialog box is A WINDOWS LEVEL ACTION.

To download and install AutoIt, you can go to : https://www.guru99.com/use-autoit-selenium.html

I wrote a simple AutoIt script as below :

; option to read substring in a window title
Opt("WinTitleMatchMode", 2)

; wait for proxy username & password dialog box
WinWait("- Google Chrome","","10")

; if the box shows up, write the username and password
; username & password are passed as program parameters
If WinExists("- Google Chrome","") Then
    WinActivate("- Google Chrome")

    ; $CmdLine is a special array that holds parameters
    if $CmdLine[0] = 2 Then
        Send($CmdLine[1] & "{TAB}")
        Send($CmdLine[2] & "{ENTER}")
    EndIf

    ; any request dialog to save credential?
    WinWait("Save password for ","","10")

    ; if any, close it
    If WinExists("Save password for ","") Then
        WinActivate("Save password for ")
        Send("{TAB}")
        Send("{SPACE}")
    EndIf
EndIf

Exit

Compile the script to be an executable program as ProxyAuth.exe.

The program will receive two parameters : username and password. With parameters, you can use dynamic username & password in your C# script.

Then you need to use the program in C# code as below :

ChromeOptions ChromeOptions = new ChromeOptions();

Proxy proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.SslProxy = $"{ProxyIP}:{ProxyPort}";
proxy.HttpProxy = $"{ProxyIP}:{ProxyPort}";
ChromeOptions.Proxy = proxy;
ChromeOptions.AddArgument("ignore-certificate-errors");

Driver = new ChromeDriver(ChromeOptions);
Driver.Navigate().GoToUrl(Url);

string cmd = string.Format($"{ProxyUsername} {ProxyPassword}");
Process proc = new Process();
proc.StartInfo.FileName = "ProxyAuth.exe";
proc.StartInfo.Arguments = cmd;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;

proc.Start();

You will need to use OpenQA.Selenium, OpenQA.Selenium.Chrome, and System.Diagnostics namespaces.

** EDIT **

If you interested in using AutoIt, you can also use their library in NuGet. Just search in "Manage NuGet Packages" : AutoIt. Choose the one and only one AutoIt package shown and install it.

With this library, you don't need to create ProxyAuth.exe application as described above.

You can use the AutoIt library and make modifications in the C# code :

ChromeOptions ChromeOptions = new ChromeOptions();

Proxy proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.SslProxy = $"{ProxyIP}:{ProxyPort}";
proxy.HttpProxy = $"{ProxyIP}:{ProxyPort}";
ChromeOptions.Proxy = proxy;
ChromeOptions.AddArgument("ignore-certificate-errors");

Driver = new ChromeDriver(ChromeOptions);
Driver.Navigate().GoToUrl(Url);

// use the AutoIt library
AutoItX.AutoItSetOption("WinTitleMatchMode", 2);

AutoItX.WinWaitActive("- Google Chrome", "", 10);
AutoItX.WinActivate("- Google Chrome");

AutoItX.Send(ProxyUsername);
AutoItX.Send("{TAB}");
AutoItX.Send(ProxyPassword);
AutoItX.Send("{ENTER}");

// dismiss save password prompt
AutoItX.WinWaitActive("Save password for ", "", 10);
AutoItX.WinActivate("Save password for ");

AutoItX.Send("{TAB}");
AutoItX.Send("{SPACE}");

Upvotes: 0

Erol444
Erol444

Reputation: 695

2021 Update

I have created a simple library (nuget package) that helps you with selenium proxy authentication. You can check the source at Github repo. It also works when using driver headless.

Usage:

public void Test()
{  
    // Create a local proxy server
    var proxyServer = new SeleniumProxyAuth();

    // Don't await, have multiple drivers at once using the local proxy server
    TestSeleniumProxyServer(proxyServer, new ProxyAuth("123.123.123.123", 80, "prox-username1", "proxy-password1"));
    TestSeleniumProxyServer(proxyServer, new ProxyAuth("11.22.33.44", 80, "prox-username2", "proxy-password2"));
    TestSeleniumProxyServer(proxyServer, new ProxyAuth("111.222.222.111", 80, "prox-username3", "proxy-password3"));

    while (true) { }
}

private async Task TestSeleniumProxyServer(SeleniumProxyAuth proxyServer, ProxyAuth auth)
{
    // Add a new local proxy server endpoint
    var localPort = proxyServer.AddEndpoint(auth);

    ChromeOptions options = new ChromeOptions();
    //options1.AddArguments("headless");

    // Configure the driver's proxy server to the local endpoint port
    options.AddArgument($"--proxy-server=127.0.0.1:{localPort}");

    // Optional
    var service = ChromeDriverService.CreateDefaultService();
    service.HideCommandPromptWindow = true;

    // Create the driver
    var driver = new ChromeDriver(service, options);

    // Test if the driver is working correctly
    driver.Navigate().GoToUrl("https://www.myip.com/");
    await Task.Delay(5000);
    driver.Navigate().GoToUrl("https://amibehindaproxy.com/");
    await Task.Delay(5000);

    // Dispose the driver
    driver.Dispose();
}

Upvotes: 1

XavierAM
XavierAM

Reputation: 1775

2019 Update

After multiple unfortunate attempts, the easiest solution is to create an extension for Chrome as explained by Mike in this post.

It sounds freaky, but it is actually really straightforward.

Upvotes: 1

user3821521
user3821521

Reputation:

The only successful approach I have found is to use AutoIT ( https://www.autoitscript.com/site/autoit ).

I have mine setup for proxy authentication for all of the major browsers, but this should work for Chrome. I wrote this on my phone from memory. If it doesn't work let me know and I'll correct.

WinWait("data:, - Google Chrome","","10")
If WinExists("data:, - Google Chrome","")Then
WinActivate("data:, - Google Chrome")
Send("USERNAMEGOESHERE"{TAB}")
Send("USERPASSWORDGOESHERE"{ENTER}")

Using AutoIT, create this as a script, compile it to exe, save it somewhere and reference the file with the following (Java code):

Runtime.getRuntime().exec("C:\\users\\USERID\\desktop\\FILENAME.exe");

I find it best to call the proxy script a step BEFORE you call the URL that triggers the proxy auth.

Upvotes: 2

Nathan Surfus
Nathan Surfus

Reputation: 23

This is for firefox but the top answer might help.

C# Selenium WebDriver FireFox Profile - using proxy with Authentication

What you can do is to create a profile and save the authentication data in it. If your profile is called "webdriver" you can select it from your code in the initialization:

ProfilesIni allProfiles = new ProfilesIni(); 
FirefoxProfile profile = allProfiles.getProfile("WebDriver"); 
profile.setPreferences("foo.bar",23);
WebDriver driver = new FirefoxDriver(profile);

Upvotes: 0

Related Questions