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

本文关键字:用户 密码 代理 验证 驱动程序 | 更新日期: 2023-09-27 18:28:41

我有一个HTTP/HTTPS代理,需要使用用户名和密码进行身份验证。如何使用C#硒铬网络驱动程序实现这一点?

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是我分配给驱动程序的ChromeOptions类。

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

我为您的问题创建了一个小程序包(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

我发现的唯一成功的方法是使用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之前先调用代理脚本一步。

2019更新

经过多次不幸的尝试,最简单的解决方案是为Chrome创建一个扩展,正如Mike在本文中所解释的那样。

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

2021更新

我创建了一个简单的库(nuget包),它可以帮助您进行selenium代理身份验证。您可以在Github repo上查看源代码。当使用无头驱动程序时,它也能工作。

用法:

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

这是针对firefox的,但最重要的答案可能会有所帮助。

C#Selenium WebDriver FireFox配置文件-使用带有身份验证的代理

你可以做的是创建一个配置文件并将身份验证数据保存在其中。如果你的配置文件被称为"网络驱动程序",你可以在初始化时从代码中选择它:

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

Chrome现在不允许您使用任何扩展来进行硒网络测试。硒没有任何内置的用户名&代理的密码输入。

我找到的唯一解决方案是使用AutoIt。它将自动执行窗口级别的操作。而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.SeniumOpenQA.Senium.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}");

在另一个线程中用Chrome驱动程序进行C#Selenium代理身份验证。

主要思想-使用Selenium 4.0和BiDi API。