本地通过VPN运行Chrome的Selenium脚本报错,Firefox无此问题
首先还原你遇到的错误信息:
Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
[1553947986.711][WARNING]: Timed out connecting to Chrome, retrying...
[1553947990.713][WARNING]: Timed out connecting to Chrome, retrying...
[1553947998.713][WARNING]: Timed out connecting to Chrome, retrying...
[1553948014.713][WARNING]: Timed out connecting to Chrome, giving up.
[1553948016.724][WARNING]: Timed out connecting to Chrome, retrying...
[1553948020.724][WARNING]: Timed out connecting to Chrome, retrying...
[1553948028.727][WARNING]: Timed out connecting to Chrome, retrying...
[1553948044.730][WARNING]: Timed out connecting to Chrome, giving up.
这个问题我之前帮团队排查过类似案例,核心原因是VPN环境干扰了ChromeDriver和Chrome实例之间的本地回环连接,再加上Chrome默认的安全限制只允许本地连接,两者叠加就触发了超时。而Firefox没问题是因为GeckoDriver和Firefox的连接机制更宽松,VPN规则没影响到它。
下面给你几个可行的解决方案,按优先级排序:
1. 强制Chrome绑定127.0.0.1作为调试地址
VPN会修改本地路由表,可能导致Chrome把调试端口绑定到VPN的虚拟网卡地址,而不是本地回环的127.0.0.1。我们可以通过Chrome参数强制指定绑定地址:
以Python为例,修改你的Selenium初始化代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 强制绑定本地回环地址 chrome_options.add_argument("--remote-debugging-address=127.0.0.1") # 指定固定调试端口(可选,避免端口冲突) chrome_options.add_argument("--remote-debugging-port=9222") # 如果需要无头模式可以加上这个 # chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options)
这个方法直接从根源解决了地址绑定的问题,大部分情况下都能生效。
2. 配置VPN允许本地回环流量
有些VPN客户端会默认把所有流量都导向VPN隧道,包括本地127.0.0.1的流量。你可以打开VPN的设置,找到本地网络例外或者路由例外选项,把127.0.0.1/32加入例外列表,让本地回环流量不经过VPN隧道。
不同VPN客户端的设置位置不一样,比如OpenVPN可以在配置文件里添加route 127.0.0.1 255.255.255.255 net_gateway,商业VPN客户端一般在“高级设置”里找相关选项。
3. 增加ChromeDriver的连接超时时间
如果前两个方法没生效,可以尝试延长ChromeDriver的连接超时,给Chrome足够的时间完成初始化:
from selenium import webdriver from selenium.webdriver.chrome.service import Service # 初始化ChromeDriver服务,设置连接超时为60秒 service = Service( executable_path="chromedriver", service_args=["--connect-timeout=60", "--verbose"] # --verbose可以帮你排查更多日志 ) chrome_options = Options() chrome_options.add_argument("--remote-debugging-address=127.0.0.1") driver = webdriver.Chrome(service=service, options=chrome_options)
为什么Firefox没有这个问题?
Firefox的GeckoDriver和浏览器实例之间的通信机制和Chrome不同:GeckoDriver默认会直接使用本地回环地址,而且Firefox对调试端口的安全限制没有Chrome严格,所以VPN的路由规则不会干扰它的连接。
内容的提问来源于stack exchange,提问作者Pritam Maske

