如何在c#selenium chrome驱动程序中验证(用户/密码)代理

时间:2014-10-31 14:08:44

标签: c# google-chrome selenium

我有一个HTTP / HTTPS代理,需要使用用户名和密码进行身份验证。我如何使用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;

选项是我分配给驱动程序的ChromeOptions类。

6 个答案:

答案 0 :(得分:1)

我找到的唯一成功方法是使用AutoIT(https://www.autoitscript.com/site/autoit)。

我为所有主流浏览器设置了代理身份验证,但这应该适用于Chrome。 我是通过记忆在手机上写的。如果它没有工作让我知道,我会纠正。

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

使用AutoIT,将其创建为脚本,将其编译为exe,将其保存在某处并使用以下内容引用该文件(Java代码):

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

我发现在调用触发代理身份验证的URL之前,最好先调用代理脚本。

答案 1 :(得分:0)

这适用于Firefox,但最重要的答案可能会有所帮助。

C# Selenium WebDriver FireFox Profile - using proxy with Authentication

您可以做的是创建配置文件并将身份验证数据保存在其中。如果您的个人资料被称为" webdriver"您可以在初始化中从代码中选择它:

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

答案 2 :(得分:0)

2019更新

经过多次不幸的尝试,最简单的解决方案是按照this帖子中Mike的解释为Chrome创建扩展程序。

这听起来很怪异,但实际上确实很简单。

答案 3 :(得分:0)

2020更新

我已经在C#的my code on Github中实现了代理身份验证。我尝试了其他多种解决方案,但均无效果。

答案 4 :(得分:0)

如今,Chrome 不允许您使用任何扩展程序进行 selenium 网络测试。而且 selenium 没有任何内置的用于代理的用户名和密码输入。

我找到的唯一解决方案是使用 AutoIt。它将自动执行 Windows 级别的操作。而 selenium 只会自动执行浏览器级别的操作。

将用户名和密码传递给代理对话框是一个 WINDOWS 级别的操作。

要下载和安装 AutoIt,您可以访问:https://www.guru99.com/use-autoit-selenium.html

我写了一个简单的 AutoIt 脚本如下:

; 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

将脚本编译为可执行程序,如ProxyAuth.exe

程序将接收两个参数:用户名和密码。 通过参数,您可以在 C# 脚本中使用动态用户名和密码。

然后你需要在 C# 代码中使用该程序,如下所示:

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();

您将需要使用 OpenQA.SeleniumOpenQA.Selenium.ChromeSystem.Diagnostics 命名空间。

** 编辑 **

如果您对使用 AutoIt 感兴趣,也可以在 NuGet 中使用他们的库。只需在“管理 NuGet 包”中搜索:AutoIt。选择显示的唯一一个 AutoIt 包并安装它。

使用此库,您无需如上所述创建 ProxyAuth.exe 应用程序。

您可以使用 AutoIt 库并在 C# 代码中进行修改:

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}");

答案 5 :(得分:0)

我为您的问题创建了一个小包 (https://github.com/RDavydenko/OpenQA.Selenium.Chrome.ChromeDriverExtensions)

安装包:

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

用于您的 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

使用代理的参数代替 PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD