How to setup Nightwatch in a multi-OS configuration

Introduction

This article is a follow up of https://www.ux-republic.com/introduction-to-nightwatch-for-lightning-acceptance-tests/

Nightwatch in a team with multiple Operating systems

In the real world, you may encounter a team running several OSes: Windows, MacOS, Linux, etc. When you want to run an acceptance test, it must be runnable under each OS.
Nightwatch uses Selenium as an underlying browser runner, however, the browser driver has to be different under each OS: you do not want to run a Windows version of Chrome whenever Nightwatch runs under MacOS, and vice-versa.
Fun fact: you do NOT need the following setup if you are only running acceptance tests under Firefox (MacOS, or Windows). Only Chrome requires the following setup.

The setup

First, you need to grab a Selenium Chrome driver for windows. The latest driver is available here. Put this under (your_preferred_nighwatch_path)/lib/chromedriver.exe : the other chromedriver for MacOS/Linux is already available under our node_modules folder.
Second, you need to create a nightwath.conf.js file, this is where you will split the drivers:

module.exports = (function (settings) {
  //Setting chromedriver path at runtime to run on different architectures
  if (process.platform === "darwin") {
    settings.selenium.cli_args["webdriver.chrome.driver"] = "./node_modules/chromedriver/bin/chromedriver";
  }
  else if (process.platform === "win32" || process.platform === "win64") {
    settings.selenium.cli_args["webdriver.chrome.driver"] = "nw/lib/chromedriver.exe";
  }
  return settings;
})(require('./nightwatch.json'));

Third, you need to create a nightwatch.js queue. This is a runner, and this is mandatory if you want to run tests under Windows, runner.js is already bundled with Nightwatch:

require('./node_modules/nightwatch/bin/runner.js');
Wrapping up

Now that we have split our drivers, you can get rid of the webdriver.chrome.driver definition under your nightwatch.json selenium configuration, because it will be automatically completed:

"selenium" : {
			"start_process" : true,
			"server_path" : "nw/lib/selenium-server-standalone-2.53.0.jar",
			"log_path" : "nw/logs",
			"host" : "127.0.0.1",
			"port" : 4444,
			"cli_args" : {
				"webdriver.chrome.driver" : "", // empty !
				"webdriver.ie.driver" : ""
			}
		}

Ultimately, go back to yours package.json, update the scripts field and tell Nightwatch to use our newest splitter:

"scripts": {
    "test": "node nightwatch.js -c nightwatch.conf.js"
  },

We are done, just run it:

npm testing

Under MacOS/Linux, ./node_modules/chromedriver/bin/chromedriver will run, under Windows, nw/lib/chromedriver.exe will run instead.

Happy testing!

Laurent, Javascript Developer @UX-Republic