如何在访问目标站点前通过Selenium设置Cookie以绕过本地环境的Google SSO重定向
我完全理解你的困扰——本地访问测试站点时一进去就被跳去Google SSO,想提前设置Cookie绕过去,但Selenium常规的add_cookie必须先加载对应域名的页面,结果每次刚加载主域名就被跳转,根本没机会设Cookie,用子域名的方法虽然能成但又不符合要求,确实头疼。
咱们先理清楚问题根源:Selenium的add_cookie要求当前页面的域名必须和Cookie的域名严格匹配,而你直接访问test.net时立刻被重定向到Google的域名,这时候再设Cookie肯定会报域名不匹配的错误;用about:blank的话,域名是空的,同样不满足匹配要求。
这里有个更靠谱的解决方案,不用依赖子域名或者VPN,就是利用Chrome DevTools Protocol(CDP)直接在浏览器发起请求前给目标域名注入Cookie,具体操作如下:
解决方案:使用CDP预设置Cookie
CDP允许我们绕过Selenium的常规限制,在没有加载目标页面的前提下,直接为指定域名添加Cookie。这样当你第一次访问test.net时,Cookie已经存在,站点就不会触发SSO重定向了。
修改你的get_url方法如下:
def get_url(self, url): if os.getenv('GITHUB_ACTIONS', 'false').lower() == 'true': self.driver.get(url) return # 本地环境通过CDP提前为目标域名设置Cookie cookie_params = { 'name': '_oauth2_proxy_qs_staging', 'value': self.cookie, 'domain': 'test.net', 'path': '/', 'secure': True, # 因为你的站点是HTTPS,需要开启这个属性 'httpOnly': False, # 根据实际Cookie的属性调整,若原Cookie是httpOnly则设为True 'sameSite': 'Lax' # 可选,根据站点Cookie的SameSite属性设置 } # 调用CDP命令添加Cookie self.driver.execute_cdp_cmd('Network.setCookie', cookie_params) # 现在直接访问目标站点,Cookie已经生效 self.driver.get(url) time.sleep(3)
为什么这个方法可行?
CDP的Network.setCookie命令是直接和浏览器内核交互的,它不需要当前页面处于目标域名下,只要指定正确的domain参数,就能把Cookie提前写入浏览器的Cookie存储中。这样当你后续访问test.net时,浏览器会自动携带这个Cookie,站点验证通过后就不会跳转到Google SSO了。
注意事项
- 确保你使用的是Chromium内核的浏览器(Chrome、Edge等),CDP对这些浏览器支持最好;如果用Firefox,可以改用WebDriver BiDi的相关API实现类似功能。
- 要严格匹配原Cookie的属性:比如
secure、httpOnly、sameSite这些参数,需要和你实际使用的_oauth2_proxy_qs_stagingCookie保持一致,否则可能不会生效。 - 不需要先加载任何页面(包括子域名或空白页),直接通过CDP设置后访问目标站点即可。
这个方法完全避开了依赖子域名的限制,也不用VPN,完美适配你本地环境的需求。
备注:内容来源于stack exchange,提问作者Faith Berroya

