Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nightwatchjs parallel mode selenium hub docker compose

I'm trying to run tests in parallel written using nightwatchjs in Docker using Selenium Hub. I'm able to get the tests to run in parallel in Docker without Selenium Hub, however, some child processes will timeout causing multiple retries. The results are very inconsistent. I'm hoping to use Selenium Hub or something similar to remove the timeouts and retries so the test results are more consistent, stable, and do not timeout.

However, now when I run docker-compose run --rm nightwatch, using the following code, the selenium server will start in parallel mode and multiple child processes will be started, however, only the first one will execute. Then the other child processes will get Error retrieving a new session from the selenium server. Connection refused! Is selenium server started? Am I missing something to get the nightwatchjs tests to run in parallel without timing out?

nightwatch.conf.js

module.exports = {
  src_folders: ['tests'],
  output_folder: 'reports',
  custom_commands_path: '',
  custom_assertions_path: '',
  page_objects_path: 'page_objects',
  test_workers: true,
  live_output: true,
  detailed_output: true,

  selenium: {
    start_process: true,
    server_path: './bin/selenium-server-standalone-3.0.1.jar',
    log_path: '',
    host: '127.0.0.1',
    port: 4444,
    cli_args: {
      'webdriver.chrome.driver' : './node_modules/chromedriver/bin/chromedriver'
    }
  },

  test_settings: {
    default: {
    launch_url: 'https://example.com',
    selenium_port: 4444,
    selenium_host: 'hub',
    silent: true,
    screenshots: {
      'enabled': false,
      'path': ''
    },
    desiredCapabilities: {
      browserName: 'chrome',
      javascriptEnabled: true,
      acceptSslCerts: true,
      chromeOptions: {
        args: [
          '--window-size=1024,768',
          '--no-sandbox'
        ]
      }
    },
    globals: {
      waitForConditionTimeout: 20000,
      asyncHookTimeout: 70000
    }
  }
};

docker-compose.yml

version: '2'

services:
  nightwatch:
    build:
      context: .
    command: /bin/sh -c "node ./node_modules/nightwatch/bin/nightwatch"
    links:
      - chrome
      - hub
    volumes:
      - .:/opt/nightwatch
  chrome:
    environment:
      VIRTUAL_HOST: node.chrome.docker
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
    image: selenium/node-chrome:3.1.0-astatine
    links:
      - hub
  hub:
    ports:
      - 4444:4444
    image: selenium/hub:3.1.0-astatine

Dockerfile

FROM java:8-jre

## Node.js setup
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y nodejs

RUN npm config set spin false

WORKDIR /app

COPY . ./

RUN npm install
like image 750
wwwuser Avatar asked Mar 06 '17 21:03

wwwuser


1 Answers

The docker node images are configured to run only one browser instance. You can change this by overriding environment variables, like so:

  chrome:
    environment:
      VIRTUAL_HOST: node.chrome.docker
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
      NODE_MAX_INSTANCES: 5
      NODE_MAX_SESSION: 5
    image: selenium/node-chrome:3.1.0-astatine
    links:
      - hub

In case you're interested, I discovered this by looking at the Dockerfile source.

like image 52
Mark Lapierre Avatar answered Oct 19 '22 23:10

Mark Lapierre