【问题标题】:Selenium ChromeDriver returns 403 errors on build serverSelenium ChromeDriver 在构建服务器上返回 403 错误
【发布时间】:2022-06-25 18:59:14
【问题描述】:
我们创建了一个 Selenium 测试项目,它启动 (ASP.NET) Web 应用程序并使用 ChromeDriver 运行几个测试。在本地,这一切都运行良好(在无头和非无头模式下)。
但是在构建服务器(使用 Azure DevOps 代理)上,这会失败,而不会开始测试。启动 ChromeDriver 时似乎失败:驱动程序启动,但随后立即出现 403 错误。它永远不会到达实际加载网页的部分。
有什么想法可以去哪里看吗?
【问题讨论】:
标签:
c#
selenium
azure-devops
selenium-chromedriver
【解决方案1】:
回答我自己的问题以记录可能的解决方案。
经过一些严格的调查(包括使用the source code 来查明真相)后,我们发现代理服务器以某种方式妨碍了我们。事实证明,ChromeDriver 尝试通过本地端口(例如 http://localhost:12345)进行通信,该端口是通过代理服务器重定向的。失败并出现 403 错误。
这为我们提供了可能的解决方案。首先,我们尝试使用the .proxybypass file 排除本地主机地址。这不起作用——事实证明,这个代理绕过只适用于 https 请求。 ChromeDriver 控制命令通过 http 发送 :-(
然后我们确保在我们的测试代码中没有使用代理。我们通过以下几行来做到这一点:
var options = new ChromeOptions();
options.AddArgument("--no-sandbox");
options.AddArgument("headless");
options.AddArgument("ignore-certificate-errors");
options.Proxy = new Proxy()
{
Kind = ProxyKind.Direct
};
var driver = new ChromeDriver(options);
除了这些设置(请注意,添加了一些参数是为了解决其他问题,可能不适用于您自己的情况),我们还禁用了其他请求的代理:
WebRequest.DefaultWebProxy = null;
HttpClient.DefaultProxy = new WebProxy()
{
BypassProxyOnLocal = true,
};
这使我们的测试最终可以在构建服务器上运行而不会出现 403 错误。
最后一点(这可能很明显)是如果您遇到任何问题,请始终以非无头模式运行您的测试。这让我们可以看到原本会被隐藏的“无效证书错误”。