如何在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类。
我为您的问题创建了一个小程序包(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.Senium、OpenQA.Senium.Chrome和System.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。