在C#中为ChromeDriver配置带认证的多类型代理失败求助
Selenium ChromeDriver 带认证代理配置失败问题排查与解决
问题描述
在Selenium中配置带认证的HTTP、SOCKS4、SOCKS5代理时,Chrome能正常启动,但浏览器实际未使用指定代理,尝试了两种方法均失败:
第一种尝试代码
var options = new ChromeOptions(); var proxy = new Proxy { HttpProxy = $"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}", SslProxy = $"https://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}", IsAutoDetect = false, Kind = ProxyKind.Manual };
第二种尝试代码
var options = new ChromeOptions(); Proxy proxy = new Proxy(); proxy.Kind = ProxyKind.Manual; proxy.IsAutoDetect = false; proxy.HttpProxy = $"{proxy_host}:{proxy_port}"; proxy.SslProxy = $"{proxy_host}:{proxy_port}"; string proxyAuth = $"{proxy_username}:{proxy_password}"; options.AddArgument($"--proxy-auth={proxyAuth}");
核心启动代码
options.AddArgument("ignore-certificate-errors"); options.Proxy = proxy; options.BinaryLocation = path_to_chrome + @"\App\Chrome-bin\chrome.exe"; var chromeDriverService = ChromeDriverService.CreateDefaultService(path_to_chrome); chromeDriverService.HideCommandPromptWindow = true; driver = new ChromeDriver(chromeDriverService, options);
问题原因
- 第一种方法无效原因:ChromeDriver的
Proxy类不支持直接在HttpProxy/SslProxy字段中嵌入用户名:密码@的格式,这种写法会被驱动忽略,导致代理仅配置了地址端口但无认证信息,无法正常连接。 - 第二种方法无效原因:Chrome浏览器并不支持
--proxy-auth这个启动参数,该参数是无效的,所以认证信息没有被正确传递给浏览器,代理连接失败。
正确配置方案
ChromeDriver处理带认证的代理需要通过自定义扩展程序注入认证信息,针对不同代理类型的有效实现如下:
1. HTTP/HTTPS 带认证代理
var options = new ChromeOptions(); // 配置代理地址端口 var proxy = new Proxy { Kind = ProxyKind.Manual, IsAutoDetect = false, HttpProxy = $"{proxy_host}:{proxy_port}", SslProxy = $"{proxy_host}:{proxy_port}" }; options.Proxy = proxy; // 创建自定义扩展注入认证信息 var proxyAuthExtension = @" { ""version"": ""1.0.0"", ""manifest_version"": 3, ""name"": ""Proxy Auth"", ""permissions"": [""proxy"", ""tabs"", ""storage"", ""activeTab"", ""scripting""], ""background"": { ""service_worker"": ""background.js"" }, ""minimum_chrome_version"": ""109"" }"; var backgroundJs = $@" chrome.proxy.settings.set({{value: {{mode: ""fixed_servers"", rules: {{singleProxy: {{scheme: ""http"", host: ""{proxy_host}"", port: {proxy_port}}}}}}}}, scope: ""regular""}}, function() {{}}); chrome.webRequest.onAuthRequired.addListener( function(details) {{ return {{authCredentials: {{username: ""{proxy_username}"", password: ""{proxy_password}""}}}}; }}, {{urls: [""<all_urls>""]}}, [""blocking""] ); "; // 将扩展打包成临时文件并添加到ChromeOptions var tempDir = Path.Combine(Path.GetTempPath(), "ProxyAuthExt"); Directory.CreateDirectory(tempDir); File.WriteAllText(Path.Combine(tempDir, "manifest.json"), proxyAuthExtension); File.WriteAllText(Path.Combine(tempDir, "background.js"), backgroundJs); options.AddExtension(tempDir); // 启动ChromeDriver的核心代码保持不变 options.AddArgument("ignore-certificate-errors"); options.BinaryLocation = path_to_chrome + @"\App\Chrome-bin\chrome.exe"; var chromeDriverService = ChromeDriverService.CreateDefaultService(path_to_chrome); chromeDriverService.HideCommandPromptWindow = true; driver = new ChromeDriver(chromeDriverService, options);
2. SOCKS4 带认证代理
SOCKS4本身不支持标准用户名密码认证,仅部分服务商提供非标准支持。若你的SOCKS4代理需要认证,配置方式类似HTTP代理,只需修改代理类型:
var proxy = new Proxy { Kind = ProxyKind.Manual, IsAutoDetect = false, SocksProxy = $"{proxy_host}:{proxy_port}", SocksVersion = 4 }; options.Proxy = proxy; // 同样需要添加上述认证扩展(若代理要求认证)
3. SOCKS5 带认证代理
SOCKS5支持标准认证,配置时指定版本并配合扩展注入认证:
var proxy = new Proxy { Kind = ProxyKind.Manual, IsAutoDetect = false, SocksProxy = $"{proxy_host}:{proxy_port}", SocksVersion = 5 }; options.Proxy = proxy; // 添加上述认证扩展注入用户名密码
注意事项
- 确保Chrome版本与ChromeDriver版本严格匹配,版本不兼容可能导致代理配置失效。
- 部分代理服务商可能有特殊认证规则,若扩展注入方式无效,可联系服务商确认具体流程。
- 临时扩展目录会在程序运行后保留,可在程序结束时手动删除临时目录清理资源。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

