2

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.

Sergey Litvinov
  • 7,408
  • 5
  • 46
  • 67
lincher
  • 45
  • 1
  • 1
  • 7
  • So what's the issue? You've got the code above, great, what's the issue with it? – Arran Oct 31 '14 at 14:28
  • It doesn't authenticate with username:password. I get a popup box in the chrome window to enter login info to use the proxy. – lincher Oct 31 '14 at 14:46

7 Answers7

5

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

  • It worked great for me! The only issue are the error messages I'm getting in console window: `DevTools listening on ws://127.0.0.1:22181/devtools/browser/e8645bd1-cf29-43d4-88d8-bbc3082006c3`, `[32116:13020:0820/192007.167:ERROR:device_event_log_impl.cc(214)] [19:20:07.166] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)` and `[26420:27692:0820/192024.445:ERROR:ssl_client_socket_impl.cc(981)] handshake failed; returned -1, SSL error code 1, net_error -113` Just ignore them? – ShamilS Aug 20 '21 at 16:31
  • 2
    It gives an error: "- unknown error: failed to wait for extension background page to load: chrome-extension://nkafcmingnfckmeoffkalgicjckfghaj/_generated_background_page.html from unknown error: page could not be found: chrome-extension://nkafcmingnfckmeoffkalgicjckfghaj/_generated_background_page.html" – JM217 Oct 02 '21 at 05:19
  • 1
    Found the reason why it fails on mine: it uses a plugin. Make sure not to use an option --incognito and --disable-extensions. – JM217 Oct 02 '21 at 05:23
  • useless in headless mode, same as @DavidPiao, background page to load: chrome-extension://nkafcmingnfckmeoffkalgicjckfghaj/_generated_background_page.html from unknown error: page could not be found – Alex Sham Aug 27 '22 at 19:08
2

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.

  • I've also had success with AutoIT, but found AutoIT has limitations when it comes to running on Selenium Grid. If you aren't parallel-izing your test runs, @TheBear's solution should get you on track. – tim-slifer Nov 11 '14 at 04:58
1

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.

XavierAM
  • 1,627
  • 1
  • 14
  • 30
1

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();
}
Erol444
  • 615
  • 5
  • 12
  • Hi! I used it so at first-time chrome blocked me saying you want to proceed? Advanced but I just couldn't get to the site. But the second third time site returns an empty value. Could you please help @Erik Kokalj – Priyanka Arora Jan 22 '21 at 19:55
  • @PriyankaArora what do you mean chrome blocked you? If you don't need headless feature you can try to use the chrome extension for proxy auth – Erol444 Jan 23 '21 at 20:03
0

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);
Community
  • 1
  • 1
0

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}");
Adi Kusuma
  • 45
  • 1
  • 5
0

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

Main idea - use Selenium 4.0 and BiDi APIs.

Evgeny Ivanov
  • 504
  • 6
  • 14