C#中如何使用带账号密码的代理运行无头Selenium
在C#中实现无头Selenium结合带认证代理的方案
针对你遇到的浏览器代理认证弹窗无法绕过、且不想依赖外部工具的问题,我分享两个纯Selenium+浏览器扩展的可行方案,完全支持无头模式,不需要AutoIT这类第三方程序:
一、Chrome浏览器方案:自定义代理认证扩展
Chrome现在确实不再支持直接通过启动参数传递代理用户名密码,也不会把认证弹窗识别为Alert,但我们可以通过自定义Chrome扩展来自动拦截并填充认证信息。
步骤1:创建代理认证扩展
你需要创建一个简单的Chrome扩展,包含两个文件:
manifest.json(扩展配置文件):
{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth AutoFill", "permissions": ["proxy", "tabs", "storage", "webRequest", "webRequestBlocking"], "background": { "service_worker": "background.js" }, "host_permissions": ["<all_urls>"] }
background.js(后台脚本,处理代理配置和认证):
// 替换成你的代理信息 const PROXY_HOST = "your-proxy-host.com"; const PROXY_PORT = 8080; const PROXY_USER = "your-username"; const PROXY_PASS = "your-password"; // 拦截认证请求,自动填充凭据 chrome.webRequest.onAuthRequired.addListener( (details) => ({ authCredentials: { username: PROXY_USER, password: PROXY_PASS } }), { urls: ["<all_urls>"] }, ["blocking"] ); // 设置代理服务器 chrome.proxy.settings.set({ value: { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: PROXY_HOST, port: PROXY_PORT } } }, scope: "regular" });
把这两个文件打包成ZIP压缩包(注意不要包含外层文件夹,直接把两个文件放在ZIP根目录)。
步骤2:在C#中加载扩展并启动无头Chrome
using OpenQA.Selenium.Chrome; class ProxyAuthDemo { static void Main(string[] args) { var chromeOptions = new ChromeOptions(); // 启用无头模式(新版Chrome推荐--headless=new) chromeOptions.AddArgument("--headless=new"); // 加载我们的代理认证扩展 chromeOptions.AddExtension(@"C:\path\to\your\proxy-extension.zip"); // 初始化ChromeDriver并执行操作 using var driver = new ChromeDriver(chromeOptions); driver.Navigate().GoToUrl("https://example.com"); Console.WriteLine(driver.Title); // 这里可以添加你的业务逻辑 } }
二、Firefox浏览器方案:WebExtension实现自动认证
Firefox的处理思路和Chrome一致,通过WebExtension拦截认证请求并自动填充,同样支持无头模式。
步骤1:创建Firefox代理扩展
同样需要两个文件:
manifest.json(注意Firefox对Manifest V3的支持已经稳定,也可以用V2):
{ "version": "1.0.0", "manifest_version": 3, "name": "Firefox Proxy Auth", "permissions": ["proxy", "tabs", "storage", "webRequest", "webRequestBlocking"], "background": { "scripts": ["background.js"] }, "host_permissions": ["<all_urls>"] }
background.js(和Chrome类似,仅API前缀从chrome改为browser):
const PROXY_HOST = "your-proxy-host.com"; const PROXY_PORT = 8080; const PROXY_USER = "your-username"; const PROXY_PASS = "your-password"; browser.webRequest.onAuthRequired.addListener( (details) => ({ authCredentials: { username: PROXY_USER, password: PROXY_PASS } }), { urls: ["<all_urls>"] }, ["blocking"] ); browser.proxy.settings.set({ value: { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: PROXY_HOST, port: PROXY_PORT } } }, scope: "regular" });
步骤2:在C#中加载扩展并启动无头Firefox
using OpenQA.Selenium.Firefox; class FirefoxProxyDemo { static void Main(string[] args) { var firefoxOptions = new FirefoxOptions(); // 启用无头模式 firefoxOptions.AddArgument("--headless"); // 加载扩展(Firefox支持直接加载文件夹或打包后的XPI文件) firefoxOptions.AddExtension(@"C:\path\to\your\proxy-extension-folder"); using var driver = new FirefoxDriver(firefoxOptions); driver.Navigate().GoToUrl("https://example.com"); Console.WriteLine(driver.Title); // 业务逻辑... } }
补充说明
- 为什么这种方法可行:浏览器扩展拥有拦截网络请求的权限,可以在认证弹窗出现前自动注入凭据,完全绕过手动输入,且无头模式下扩展依然能正常工作。
- 不推荐的方案:将用户名密码嵌入代理URL(如
http://user:pass@proxy:port),现代浏览器出于安全考虑已经禁止这种方式,会直接忽略或报错。
内容的提问来源于stack exchange,提问作者tucotraff
相关产品推荐
相关产品推荐

