1

In a nutshell, there is additional container as a test runner which cannot reach the selenium-hub. So, tests are failed.

This container was added for running test on cloud by using cloud build.

I created docker-compose as below:

 version: "3"
    services:
      selenium-hub:
        image: selenium/hub:4.0.0-rc-1-prerelease-20210804
        container_name: selenium-hub
        ports:
          - "4444:4444"
        expose: 
          - 4444
    
      chrome:
        image: selenium/node-chrome:4.0.0-rc-1-prerelease-20210804
        shm_size: 2gb
        depends_on:
          - selenium-hub
        environment:
          - SE_EVENT_BUS_HOST=selenium-hub
          - SE_EVENT_BUS_PUBLISH_PORT=4442
          - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
        ports:
          - "6900:5900"
    
      chrome_video:
        image: selenium/video:ffmpeg-4.3.1-20210804
        volumes:
          - /Users/videos:/videos 
        depends_on:
          - chrome
        environment:
          - DISPLAY_CONTAINER_NAME=chrome
          - FILE_NAME=chrome_video.mp4

After containers start to work successfully, when I run npm run test for running selenium js tests, I got successful results and video recording in expected directory. But it should be automated as well. npm run test should be triggered somehow.

In our CI/CD process, cloudbuild.yaml file is added for running on cloud.

 steps:
   - name: 'docker/compose:1.29.2'
      args: ['run','test']

   - name: 'docker/compose:1.29.2'
      args: ['stop']
      timeout: 60s

Cloud build should trigger the new container below which is added to docker-compose file as test runner:

test:
    image:  node:16-alpine
    entrypoint:
    - sh
    - -c
    - |-
      cd /test
      npm install
      sleep 3
      npm run test
    volumes:
    - .:/test
    depends_on:
    - selenium
    network_mode: host

However with test container, tests are failed and get the error below:

24 packages are looking for funding


run `npm fund` for details


2 moderate severity vulnerabilities


To address all issues, run:

npm audit fix


Run `npm audit` for details.


> js_mocha_selenium@1.0.0 test

> mocha test




Preliminary steps for End to End Tests

initalising the session...

1) Login

closing the session...

2) "after each" hook for "Login"



0 passing (108ms)

2 failing


1) Preliminary steps for End to End Tests

Login:

Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:4444

at ClientRequest.<anonymous> (node_modules/selenium-webdriver/http/index.js:273:15)

at ClientRequest.emit (node:events:394:28)

at Socket.socketErrorListener (node:_http_client:447:9)

at Socket.emit (node:events:394:28)

at emitErrorNT (node:internal/streams/destroy:157:8)

at emitErrorCloseNT (node:internal/streams/destroy:122:3)

at processTicksAndRejections (node:internal/process/task_queues:83:21)


2) Preliminary steps for End to End Tests

"after each" hook for "Login":

Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:4444

at ClientRequest.<anonymous> (node_modules/selenium-webdriver/http/index.js:273:15)

at ClientRequest.emit (node:events:394:28)

at Socket.socketErrorListener (node:_http_client:447:9)

at Socket.emit (node:events:394:28)

at emitErrorNT (node:internal/streams/destroy:157:8)

at emitErrorCloseNT (node:internal/streams/destroy:122:3)

at processTicksAndRejections (node:internal/process/task_queues:83:2

Containers:

CONTAINER ID   IMAGE                                                 COMMAND                   CREATED              STATUS              PORTS                                                      NAMES
7ca30366bc09   node:16-alpine                                        "sh -c 'cd /test\nnpm…"   About a minute ago   Up About a minute                                                              e2e-tests_test_1
fdf43be1b4da   selenium/video:ffmpeg-4.3.1-20210804                  "/opt/bin/entry_poin…"    16 minutes ago       Up About a minute   9000/tcp                                                   e2e-tests_chrome_video_1
92c023b15cb6   selenium/node-chrome:4.0.0-rc-1-prerelease-20210804   "/opt/bin/entry_poin…"    16 minutes ago       Up About a minute   0.0.0.0:6900->5900/tcp, :::6900->5900/tcp                  e2e-tests_chrome_1
86002f3d1eb9   selenium/hub:4.0.0-rc-1-prerelease-20210804           "/opt/bin/entry_poin…"    16 minutes ago       Up About a minute   4442-4443/tcp, 0.0.0.0:4444->4444/tcp, :::4444->4444/tcp   selenium-hub 

I can ping selenuim-hub from e2e-tests_test_1 container, but cannot do it reverse(ping e2e-tests_test_1 from selenium-hub).

About current network:

 >> % docker network inspect -v host
[
    {
        "Name": "host",
        "Id": "36e4060f18be618399692294d10cf6be3478c1bf5190ea035b002ca87c18276b",
        "Created": "2021-06-30T10:36:33.170635189Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

It seems test node cannot reach to 127.0.0.1:4444

What should I do for solving this issue? It'd be good to hear alternative solutions.

Thanks in advance.

Furkan
  • 505
  • 4
  • 12
  • Hello, I don't know how you are trying to reach the selenium container, but [this](https://stackoverflow.com/questions/55167677/chrome-not-found-inside-docker-container) post could help you. Basically you will need to replace ```http://localhost:4444/wd/hub``` by ```http://chrome:4444/wd/hub``` in you js file – Robertocd_98 Aug 23 '21 at 15:02
  • Hello @Robertocd_98 I did read that post before. It doesn't work for this case. **Test**container runs the selenium test (as test runner) and needs to reach **selenium-hub** (_http://localhost:4444/wd/hub_) first and **chrome** container to run the tests in chrome browser. – Furkan Aug 23 '21 at 16:11

1 Answers1

2

You need to wait for the Grid to be ready before running tests. I documented a few approaches for this on the project's README, please check https://github.com/seleniumhq/docker-selenium/#waiting-for-the-grid-to-be-ready

diemol
  • 613
  • 3
  • 10
  • I've just added healthcheck but the result is same. Beforehand, I tried it manually: I added enough wait (50sec) for test runner container, before this wait ends I checked status of Grid and it was always ready. – Furkan Aug 23 '21 at 10:22
  • The healthcheck is not going to change the result because your tests still need to wait for the Grid to be ready (which is what you do implicitly with ah 50sec sleep). You need to actually check the Grid endpoint to see if it is ready before running tests. – diemol Aug 24 '21 at 11:17