You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何使用带账号密码的代理运行无头Selenium

在C#中实现无头Selenium结合带认证代理的方案

针对你遇到的浏览器代理认证弹窗无法绕过、且不想依赖外部工具的问题,我分享两个纯Selenium+浏览器扩展的可行方案,完全支持无头模式,不需要AutoIT这类第三方程序:

一、Chrome浏览器方案:自定义代理认证扩展

Chrome现在确实不再支持直接通过启动参数传递代理用户名密码,也不会把认证弹窗识别为Alert,但我们可以通过自定义Chrome扩展来自动拦截并填充认证信息。

步骤1:创建代理认证扩展

你需要创建一个简单的Chrome扩展,包含两个文件:

  1. 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>"]
}
  1. 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代理扩展

同样需要两个文件:

  1. 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>"]
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:22:12