You need to enable JavaScript to run this app. Ruby下Selenium配置带身份验证的Chrome代理不生效如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Ruby下Selenium配置带身份验证的Chrome代理不生效如何解决

Chrome浏览器原生不支持在代理配置中直接嵌入username:password@host:port格式的认证信息,你之前通过Capabilities配置的带认证代理被自动忽略就是这个原因。以下是两种比本地启动中转代理开销更低的解决方案,均支持每次请求切换不同代理:

方案1:使用Chrome DevTools Protocol (CDP) 配置代理(推荐,Selenium 4+支持)

Selenium 4开始原生支持调用CDP接口,可以直接设置带认证的代理,不需要额外中转服务或者扩展,配置后立即生效,切换代理也不需要重启浏览器,额外开销极低。
配置示例:

require 'selenium-webdriver'

# 初始化Chrome浏览器
options = Selenium::WebDriver::Chrome::Options.new
options.args = ['headless=new', 'no-sandbox', 'disable-gpu', 'window-size=1920,1080']
driver = Selenium::WebDriver.for :chrome, options: options

# 替换为实际代理信息
proxy_host = '代理服务地址'
proxy_port = 代理端口
proxy_user = '代理用户名'
proxy_pass = '代理密码'

# 调用CDP接口设置代理
driver.devtools.network.set_proxy(
  proxy_server: "http://#{proxy_host}:#{proxy_port}"
)

# 监听代理认证请求,自动注入账号密码
driver.devtools.fetch.on(:auth_required) do |params|
  driver.devtools.fetch.continue_with_auth(
    request_id: params['requestId'],
    auth_challenge_response: {
      response: 'ProvideCredentials',
      username: proxy_user,
      password: proxy_pass
    }
  )
end
# 启用Fetch域监听认证事件
driver.devtools.fetch.enable(handle_auth_requests: true)

# 访问测试
driver.navigate.to "https://www.showmyip.com/"

如果需要切换代理,只需要重新调用set_proxy接口,更新监听的账号密码即可,不需要重启浏览器实例。

方案2:动态生成代理认证扩展(适配Selenium 3及更低版本)

如果你的Selenium版本低于4,无法使用CDP接口,可以通过动态生成Chrome扩展的方式实现代理认证,整个扩展生成过程可在内存中完成,耗时不到100ms,远低于启动中转代理的开销。
扩展仅需两个文件:

  1. manifest.json(固定内容无需修改):
{
  "version": "1.0.0",
  "manifest_version": 3,
  "name": "Proxy Auto Auth",
  "permissions": ["proxy", "storage", "webRequest", "webRequestAuthProvider"],
  "host_permissions": ["<all_urls>"],
  "background": {"service_worker": "background.js"},
  "minimum_chrome_version": "108"
}
  1. background.js(仅需替换代理配置部分):
const proxyConfig = {
  host: "代理服务地址",
  port: 代理端口,
  username: "代理用户名",
  password: "代理密码"
};

chrome.proxy.settings.set({
  value: {
    mode: "fixed_servers",
    rules: {
      singleProxy: {
        scheme: "http",
        host: proxyConfig.host,
        port: proxyConfig.port
      },
      bypassList: ["localhost", "127.0.0.1"]
    }
  },
  scope: "regular"
}, () => {});

chrome.webRequest.onAuthRequired.addListener(
  (details) => ({authCredentials: {username: proxyConfig.username, password: proxyConfig.password}}),
  {urls: ["<all_urls>"]},
  ["blocking"]
);

Ruby端可借助rubyzip库将上述两个文件动态打包为zip压缩包,启动Chrome时通过参数指定加载该扩展即可,每次切换代理仅需重新生成一次扩展包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 15:15:03