You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中Chrome Driver配置带账号密码的HTTP代理无效求助

解决ChromeDriver配置带用户名密码的HTTP代理失效问题

我帮你排查下这个问题——你现在用的直接把用户名密码嵌在代理URL里的方式,Chrome从新版本开始已经不再支持了,这就是配置没生效的核心原因。下面给你两种靠谱的解决方案,你可以根据场景选择:

方案一:用自定义Chrome扩展处理代理认证

这是最稳定的方法,适合长期使用的场景:

  1. 创建扩展文件
    先在项目里新建一个文件夹(比如叫proxyExtension),里面放两个文件:

    • manifest.json(扩展配置):
      {
          "version": "1.0.0",
          "manifest_version": 3,
          "name": "Proxy Auth Helper",
          "permissions": ["proxy", "storage", "webRequest", "webRequestBlocking", "<all_urls>"],
          "background": {
              "service_worker": "background.js"
          },
          "minimum_chrome_version": "100.0"
      }
      
    • background.js(代理逻辑):
      // 配置代理服务器
      chrome.proxy.settings.set({
          value: {
              mode: "fixed_servers",
              rules: {
                  singleProxy: {
                      scheme: "http",
                      host: "{你的代理地址}", // 替换成实际代理地址
                      port: {你的代理端口}    // 替换成实际端口
                  },
                  bypassList: ["localhost", "127.0.0.1"]
              }
          },
          scope: "regular"
      }, () => {});
      
      // 拦截认证请求,自动填入用户名密码
      chrome.webRequest.onAuthRequired.addListener(
          (details, callback) => {
              callback({
                  authCredentials: {
                      username: "{你的代理用户名}", // 替换成实际用户名
                      password: "{你的代理密码}"  // 替换成实际密码
                  }
              });
          },
          { urls: ["<all_urls>"] },
          ["blocking"]
      );
      

    注意把上面的占位符替换成你实际的代理信息。

  2. 打包扩展并在C#中加载
    proxyExtension文件夹打包成ZIP文件,然后在代码里配置ChromeOptions加载这个扩展:

    using System.IO.Compression;
    
    // 打包扩展文件夹为ZIP
    string extensionFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "proxyExtension");
    string extensionZipPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "proxyAuth.zip");
    if (File.Exists(extensionZipPath)) File.Delete(extensionZipPath);
    ZipFile.CreateFromDirectory(extensionFolderPath, extensionZipPath);
    
    // 配置ChromeOptions
    ChromeOptions options = new ChromeOptions();
    options.AddExtension(extensionZipPath);
    
    // 启动ChromeDriver
    IWebDriver driver = new ChromeDriver(options);
    

方案二:用DevTools协议注入代理认证

如果不想打包扩展,可以用Chrome的DevTools协议动态注入认证信息,适合临时测试或快速迭代的场景:

using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.DevTools;
using OpenQA.Selenium.DevTools.V114.Network; // 注意版本要和你的ChromeDriver匹配

// 配置基础代理(不带认证)
string proxyAddress = $"{_proxy.textProxy}:{_proxy.numberProxyPort}";
ChromeOptions options = new ChromeOptions();
options.AddArgument($"--proxy-server=http://{proxyAddress}");

// 启动ChromeDriver
ChromeDriver driver = new ChromeDriver(options);

// 启用DevTools会话
DevToolsSession devToolsSession = driver.CreateDevToolsSession();
await devToolsSession.Network.Enable(new EnableCommandSettings());

// 注入代理认证信息
await devToolsSession.Network.SetAuthCredentials(new SetAuthCredentialsCommandSettings
{
    Origin = "*",
    Username = _proxy.textUsername,
    Password = _proxy.textPassword
});

// 测试代理是否生效
driver.Navigate().GoToUrl("https://api.ipify.org");
Console.WriteLine($"当前IP: {driver.PageSource}");

注意:这里的DevTools版本命名空间(比如V114)要和你安装的ChromeDriver版本严格对应,否则会出现兼容性问题。

额外注意事项

  • 确保ChromeDriver和Chrome浏览器的版本完全匹配,版本不兼容是很多代理问题的隐性原因。
  • 测试代理是否生效时,建议访问https://api.ipify.org,它会返回当前使用的IP,方便验证。
  • 如果是企业环境,可能需要绕过内部的代理白名单,记得在扩展的bypassList里添加对应的域名。

内容的提问来源于stack exchange,提问作者Chethana Hidogama

火山引擎 最新活动