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

使用Selenium Docker Chrome Node执行脚本时出现无法访问站点错误

解决Selenium Docker Chrome Node代理访问失败的问题

我之前在类似的企业代理环境下踩过一模一样的坑,给你几个针对性的排查和解决方向:

1. 修正WebDriver代理配置的格式错误

你当前写的代理字符串<username>:<password>:<proxy_url>格式完全不对,Chrome无法识别这种格式的代理配置。正确的配置有两种可靠方式:

方式一:使用Proxy类单独配置

Proxy proxy = new Proxy();
proxy.setProxyType(Proxy.ProxyType.MANUAL);
// 注意格式是「代理地址:端口」
proxy.setHttpProxy("your-proxy-host:your-proxy-port");
proxy.setHttpsProxy("your-proxy-host:your-proxy-port");
// 单独设置代理的用户名和密码
proxy.setHttpProxyUsername("your-username");
proxy.setHttpProxyPassword("your-password");

ChromeOptions options = new ChromeOptions();
options.setCapability(CapabilityType.PROXY, proxy);
// 加上这个参数避免容器内Chrome的权限问题
options.addArguments("--no-sandbox");

方式二:直接传递Chrome启动参数(更稳定)

有些代理环境下,直接通过Chrome启动参数传递代理会绕过WebDriver的配置兼容问题:

ChromeOptions options = new ChromeOptions();
// 格式:http://用户名:密码@代理地址:端口
options.addArguments("--proxy-server=http://your-username:your-password@your-proxy-host:your-proxy-port");
// 避免代理证书验证失败的问题
options.addArguments("--ignore-certificate-errors");
options.addArguments("--no-sandbox");

2. 确保Docker容器继承代理环境变量

虽然你在Vagrant虚拟机里配置了代理,但Docker容器默认不会自动继承主机的代理设置。启动Selenium Hub和Node时,必须显式传递代理环境变量:

# 启动Selenium Hub
docker run -d -p 4444:4444 \
  -e HTTP_PROXY=http://your-username:your-password@your-proxy-host:your-proxy-port \
  -e HTTPS_PROXY=http://your-username:your-password@your-proxy-host:your-proxy-port \
  selenium/hub

# 启动Chrome Node(注意和Hub关联)
docker run -d \
  -e HTTP_PROXY=http://your-username:your-password@your-proxy-host:your-proxy-port \
  -e HTTPS_PROXY=http://your-username:your-password@your-proxy-host:your-proxy-port \
  --link selenium-hub:hub \
  selenium/node-chrome

这样容器内的Chrome进程会直接读取系统级代理,和你用curl测试的环境保持一致。

3. 排查代理的IP白名单和认证方式

  • 确认公司代理服务器允许Vagrant虚拟机的IP地址访问,有些企业代理会严格限制客户端IP段
  • 如果是NTLM类型的企业代理,普通的用户名密码配置无效,需要额外配置域信息:
Proxy proxy = new Proxy();
proxy.setProxyType(Proxy.ProxyType.MANUAL);
proxy.setHttpProxy("your-proxy-host:your-proxy-port");
// NTLM认证格式:域\用户名
proxy.setSocksUsername("company-domain\\your-username");
proxy.setSocksPassword("your-password");

4. 验证容器内Chrome的直接访问能力

可以进入Chrome Node容器,手动启动Chrome测试,排查是WebDriver配置问题还是容器网络问题:

# 进入容器(替换成你的容器ID)
docker exec -it <chrome-node-container-id> /bin/bash

# 安装curl(如果容器里没有)
apt-get update && apt-get install -y curl

# 测试HTTPS访问(谷歌用的是HTTPS)
curl -v https://www.google.com

# 用无头Chrome测试访问
google-chrome --headless --no-sandbox --proxy-server=http://your-proxy-host:your-proxy-port https://www.google.com

如果手动访问成功,那就是WebDriver的代理配置没生效,回到第一步调整即可。


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

火山引擎 最新活动