Selenium firefox驱动程序强制https

时间:2018-12-28 17:01:26

标签: selenium docker ssl selenium-webdriver webdriver

我有一个功能性应用程序在端口3000上的docker中运行。将主机设置为http://localhost:3000时,硒测试会起作用。我创建了一个容器来启动硒测试,但失败并显示以下错误:

WebDriverError:Reachederrorpage:about:neterror?e=nssFailure2&u=https://app:3000/&c=UTF-8&f=regular&d=An error occurred during a connection to app:3000.

SSL received a record that exceeded the maximum permissible length.

Error code: <a id="errorCode" title="SSL_ERROR_RX_RECORD_TOO_LONG">SSL_ERROR_RX_RECORD_TOO_LONG</a>

我的docker-compose.yml

的片段
app:
    build:
        context: .
        dockerfile: Dockerfile.dev
    volumes:
        - ./:/usr/src/app/
    ports:
        - "3000:3000"
        - "3001:3001"
    networks:
        tests:

selenium-tester:
    build:
        context: .
        dockerfile: Dockerfile.selenium.tests
    volumes:
        - ./:/usr/src/app/
        - /dev/shm:/dev/shm
    depends_on:
        - app
    networks:
        tests:

我用http://app:3000替换了主机,但是firefox似乎想将此http重定向到https(不起作用)。最后,我像这样构建我的驱动程序:

const ffoptions = new firefox.Options()
  .headless()
  .setPreference('browser.urlbar.autoFill', 'false'); // test to disable auto https redirect… not working obviously
const driver = Builder()
      .setFirefoxOptions(ffoptions)
      .forBrowser('firefox')
      .build();

在硒测试器容器内使用http://app:3000手动联系curl时,它可以正常工作,我得到了主页。

我现在缺乏创意,甚至分解我的问题来写这个问题也没给我带来新的想法

2 个答案:

答案 0 :(得分:0)

您曾提到使用硒测试器容器内的curl手动联系http://app:3000

此错误消息...

WebDriverError:Reachederrorpage:about:neterror?e=nssFailure2&u=https://app:3000/&c=UTF-8&f=regular&d=An error occurred during a connection to app:3000.
SSL received a record that exceeded the maximum permissible length.
Error code: <a id="errorCode" title="SSL_ERROR_RX_RECORD_TOO_LONG">SSL_ERROR_RX_RECORD_TOO_LONG</a>

...表示卷曲的SSL层或其依赖项之一似乎已损坏。

在此discussion中提到的

@RussellFulton:

  

这似乎是您从 Firefox 中看到的结果,该服务器未针对SSL进行正确配置。 Chrome 可能只是给出了一般性的 ssl failed 错误。

当服务器期望HTTP请求时,浏览器发送 SSL握手时,可能会发生这种情况。服务器使用 400代码和一条错误消息进行响应,该错误消息比浏览器期望的握手消息大得多。因此,您会看到消息。


原因和解决方案

  • 当容易出错的代码尝试重定向到端口80(在您的情况下为端口3000)上的HTTPS时。
    • 解决方案:从网址中删除端口80(在您的情况下为端口3000),重定向有效。
  

HTTPS 默认情况下通过端口 443 运行。

答案 1 :(得分:0)

我遇到了完全相同的问题-无法通过HTTP从同一网络上其他Docker容器中的Selenium控制的浏览器(Chrome或Firefox)成功向应用程序发出请求。来自该容器的cURL虽然效果很好!使用HTTP进行连接,但是似乎有一些事情试图强制使用HTTPS。完全相同的情况,直到容器“ app”的名称。

答案是...这是容器的名称!

“ app”是HSTS预加载列表上的顶级域-也就是说,浏览器将强制通过HTTPS进行访问。

修正是使用不在HSTS预载列表中的容器名称。

HSTS - more reading