windows - 使用 Selenium 访问代理服务器后面的网站,使用 Google Chrome 无头,在使用 Fiddler 时有效
问题描述
我在运行 selenium 测试运行时遇到问题,使用 google chrome headless,访问只能通过代理服务器访问的站点。
TLDR:Chrome headless 无法通过代理服务器访问网站,除非 fiddler 正在运行
试图诊断问题,我发现了一组奇怪的情况导致它工作:
- Internet Explorer 被配置为使用代理,并且只有在代理打开时才能访问该站点。如果没有 Internet Explorer 代理集,将无法连接到该站点。
- Chrome 使用 Internet Explorer 代理设置,因此使用 chrome 访问网站取决于设置的 Internet Explorer 代理。
只要设置了 Internet Explorer 代理:
- 当 Selenium 测试使用 chrome(非无头)运行时,该站点可以成功访问。
- 当使用 chrome(无头)运行 Selenium 测试时,该站点无法成功访问(超时)。
- 如果将代理服务器配置传递给 chrome*(无头),则无法成功访问该站点。
- 如果代理服务器配置没有传给chrome(headless),则站点访问不成功。
如果我们在服务器上安装 fiddler,代理设置被 Fiddler 代理替换,突然通过 chrome (headless) 运行的 selenium 测试成功运行。和:
- 如果代理服务器配置通过 chrome*(无头),则站点访问成功。
如果代理服务器配置没有传给chrome(headless),则站点访问成功。
使用 chrome_options.add_argument 将代理服务器配置传递给 chrome。
注意: - 没有启用 chrome 扩展。
该网站使用的是HTTP,因此没有证书引起的问题
通过不需要代理服务器的路由访问网站,例如从我们的桌面,chrome 无头工作。
我已经在两个不同的服务器上尝试过这个,具有相同的行为。
代理服务器不需要身份验证。
因此,除非 fiddler 正在运行,否则 chrome headless 无法通过代理访问站点。有谁知道为什么会这样,以及我如何在不运行 Fiddler 的情况下使其工作?
解决方案
我使用网络监视器看到无头 chrome 调用正在解析为网站 IP 地址,而不是代理的 IP 地址,因此看起来无头 chrome 没有使用默认代理,正如怀疑的那样。
最后,配置 nunit 测试以使用 --proxy-server 参数将代理服务器传递给无头 chrome 就可以了。
推荐阅读
- android - 将数据发送到 Firebase 数据库后如何从片段移动到另一个片段?
- javascript - 如何获取散列密码以传递到我的数据库?
- python - 在我的代码中索引错误第 13 行。列表索引超出范围
- c# - 使用 SAS 将文件从 Azure Blob 存储下载到浏览器
- node.js - 几次请求后,AWS Lambda 变慢
- html - 响应式网站可在桌面、Android 手机上运行,但即使在使用媒体查询和查看端口元标记后也会在 iphone 上中断
- javascript - 在文本上显示元素 - html、css、js
- r - 从分位数函数确定元素时如何找到元素索引?
- javascript - 发生错误时如何设置默认值
- java - 为什么将孩子推送到特定父母后recyclerView没有更新?