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,远低于启动中转代理的开销。
扩展仅需两个文件:
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" }
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
相关产品推荐
相关产品推荐

