在 selenium 测试期间客户端无法连接到服务器

Posted

技术标签:

【中文标题】在 selenium 测试期间客户端无法连接到服务器【英文标题】:Clients are unable to connect to server during selenium tests 【发布时间】:2019-01-08 01:44:48 【问题描述】:

我正在为一个使用在 WebApi 5.2.4 上运行的后端服务器的 javascript Web 应用程序进行 selenium 测试(使用 chrome webdriver 用 C# 编写)。它通过非常宽松的设置启用了 CORS:

namespace SealingService

    public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // Web API configuration and services

            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            // etc...
        
    

通常一切都按预期进行。但是在某些机器上,当服务器由测试脚本启动时,客户端在每个请求上都会遇到 CORS 错误。 chrome 开发控制台显示标准的Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 消息。服务器日志显示 OPTION 请求正在到达它,并且它正在发送响应。

当我尝试手动访问任何 API 路由时,服务器会返回通用 ASP.NET 404 页面。这让我觉得我们的 CORS 配置实际上可以正常工作,但是我们的测试脚本没有正确启动/配置服务器,因此没有注册路由。因此,所有 API 路由都返回 404 页面,这显然没有启用 CORS。

This is the applicationhost.config used by IIS during the tests.测试脚本是这样启动服务器的:

public static Process StartIIS(string siteName)

    return Process.Start(@"C:\Program Files (x86)\IIS Express\iisexpress.exe", $"/site:siteName /config:_applicationHostConfigFilePath");

这些错误只发生在某些机器上,我们无法弄清楚它们之间的配置有何不同。我尝试使用 Chrome 的 --disable-web-security 标志,但似乎没有任何区别。

【问题讨论】:

你试过这个扩展(chrome.google.com/webstore/detail/allow-control-allow-origi/…)吗?我从 (***.com/questions/35588699/…) 那里拿的 我还没有尝试过那个特定的扩展,但根据它的描述,它与我尝试过的 --disable-web-security 标志做同样的事情。在这一点上,我很确定该错误实际上与 CORS 无关,而是与 IIS 的配置方式有关(请参阅原始问题中的配置文件) 你的标题响应是什么 【参考方案1】:

您通常可以通过更改 web.config 来解决飞行前错误:

<system.webServer>

    ...

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Cache-Control" />
        <add name="Access-Control-Allow-Credentials" value="true" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
</httpProtocol>
</system.webServer>

或者通过自定义处理程序中的代码,例如:

if (request.Headers.Contains("Origin") && request.Method.Method == "OPTIONS")

    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    response.Headers.Add("Access-Control-Allow-Origin", "*");
    response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");       
    response.Headers.Add("Access-Control-Allow-Methods", "DELETE, POST, PUT, OPTIONS, GET");

如果可行,您可以尝试通过例如将 Access-Control-Allow-Origin 更改为您的前端地址。

【讨论】:

感谢您的建议,但使用额外的 CORS 配置更新 web.config 似乎并不能解决问题。我认为问题不在于 CORS 设置,而在于我们的测试脚本在 IIS 中启动或配置路由的方式。我用更多细节更新了问题。 将此添加到 web.config 和 applicationhost.config。如果您使用 IIS 而不是 IIS Express,您会发现更容易进行故障排除。也可以尝试“*”的设置。【参考方案2】:

假设您使用的是 Windows 操作系统。如果是,那么您是否允许您的应用程序绕过 Windows 防火墙..? 例如:如果您有一个应用程序在 localhost:9000 上运行,那么您需要确保 Windows 防火墙具有允许端口 9000 的规则。

希望,这可以解决您的问题。

【讨论】:

100% 当端口被防火墙阻止时。浏览器抛出 CORS 异常。 这应该是评论而不是答案 我很确定这不是防火墙问题,因为我们可以在手动运行时访问在相同端口上运行的服务器。 @CoreyGoldberg,这取决于观点。我只是想在这里提供我的意见 你问了一个澄清问题,应该在 OP 问题的 cmets 中完成

以上是关于在 selenium 测试期间客户端无法连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

IAP - 无法连接到iTunes Store - 仅在Apple审核期间

在 Visual Studio 调试期间无法连接到 Oracle 数据库

无法在 Maven 中使用 Selenium 连接到二进制 FirefoxBinary

Selenium Firefox 57 无法连接到二进制/本地主机

无法使用 mbedtls 示例客户端连接到 https 服务器

在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务