Nightwatch.js
is an open-source automated testing framework that aims at providing complete E2E (end to end) solutions to automate testing with Selenium Javascript
for web-based applications, browser applications, and websites. It is written in Node.js
and uses the W3C WebDriver API
(formerly Selenium WebDriver) for interacting with various browsers.
Installation And Requirements
This guide is based on Ubuntu 18.04. Some commands will be different if you have another OS installed on your computer. Also, we will be following the BDD approach in this blog. So, if you want to learn more about BDD first then please read our blog on Demonstrating BDD (Behavior-driven development) in Go. Before getting started with Nightwatch we need to have the following installed on our computer.
1. Node.js:
- To install Node.js:
sudo apt install nodejs
- To verify the successful installation of nodejs and to check its version use the following command
nodejs -v
2. Node Package Manager(npm):
The nodejs package contains both the node and npm binaries. So, npm is also installed when you run the command to install nodejs. However, to verify that npm was also successfully installed, you can check the version of npm by running the command
npm -v
3. Java:
We need java to run the Selenium server which automates our browser. If your machine does not have java installed then install it using the following command
sudo apt install default-jdk
If you want to learn more about how to install Java, then you can follow this link.
4.Selenium Server:
Download the latest stable version of the Selenium standalone server JAR file.
5.Chrome Driver:
Lastly, download the latest stable version
of Chrome Driver
.
Once you have downloaded Chrome Driver
, you need to unzip it by running the following command:
unzip chromedriver_linux64.zip
Once you have unzipped it, you need to move the chromedriver(shared library) and place it inside the same folder where you have placed the Selenium standalone server file.
Setting up Nightwatch.js
Make a configuration file and name it nightwatch.conf.js
inside the root directory of your project and inside the configuration file add the following content.
module.exports = {
src_folders: ['test'],
test_settings: {
default: {
selenium_host: '127.0.0.1',
launch_url: 'http://localhost:3000',
globals: {},
desiredCapabilities: {
browserName: 'chrome',
javascriptEnabled: true,
chromeOptions: {
args: ['disable-gpu'],
w3c: false
}
}
}
}
}
You can also make a nightwatch.json
configuration file as an alternative to the nightwatch.conf.js file. Please refer to the nightwatch website to learn how to write the nightwatch.json configuration file.
You need to define src_folders
and launch_url
inside the nightwatch.conf.js where src_folders
is used to define the folder in which you have written your tests and launch_url
is used to define the index URL of your project which is used as the main URL to load and run your tests.
src_folders
and launch_url
will be different for different projects.
src_folders: YOUR_SOURCE_FOLDER_FOR_TEST_FILES
launch_url: URL_OF_YOUR_WEBSITE
Run this command to install nightwatch and cucumber into your project dependencies which allow us to run automated tests using the gherkin language.
yarn add --dev nightwatch-api nightwatch cucumber
Or,
npm install --dev nightwatch-api nightwatch cucumber
Now the following information should be added inside package.json in devDependencies. But do remember that these versions may also vary depending upon the releases of these dependencies.
"devDependencies": {
"cucumber": "^6.0.5",
"nightwatch": "^1.3.3",
"nightwatch-api": "^3.0.1"
}
You can use npm or yarn, whichever you prefer. However, if you want to use yarn but do not have it already installed then, you can install it by downloading the .deb
file from the yarn releases and run the following command:
sudo dpkg -i yarn[VERSION].deb
The .deb file might not be compatible with your machine. It only works for debian based linux distros.
For the rest of the setup process, I am using npm
.
Now, create index.js
inside [root_dir]/test/acceptance
and add
const { setDefaultTimeout, After, Before } = require('cucumber')
const { createSession, closeSession, startWebDriver, stopWebDriver } = require('nightwatch-api')
setDefaultTimeout(60000)
Before(async () => {
await startWebDriver();
await createSession();
})
After(async () => {
await closeSession();
await stopWebDriver();
})
Here, we are using before() and after() hooks which will allow us to execute the code inside them before and after each test scenario.
Before starting the Selenium server you need to change your directory to where the selenium and chromedriver files are. After doing that you can now start the Selenium server with the command:
java -jar selenium-server-standalone-3.141.59.jar -port 4444
Testing your Project
Create feature files inside [root_dir]/test/acceptance/features
with an extension .feature
for each feature of your project. Follow the Gherkin reference to write your feature file.
We do not need to use gherkin language but I am using it because this is the same language that user and domain experts use while they talk about the domain. Also, it is easy to understand for both technical and non-technical personnel involved in the project.
A feature file written using gherkin language looks like this.
Feature: search using transliterated Latin characters
As a user
I want to find the literature by specifying Latin (English-style) script equivalent to the Nepali
So I can find the literature without needing to use a Nepali keyboard
Background:
Given the user has browsed to the homepage
Scenario: user should be able to search in English characters using transliterated text
When the user enters the English characters "munaa madan"
And the user selects the transliterated text
And the user searches for the literature
Then the search result should be displayed
Next, create a javascript file for the step-definitions inside [root_dir]/test/acceptance/stepDefinitions
for each feature. For each step in the scenario of your feature file, a matching step definition is executed while running the test. Step definitions for the above search feature will look something like this.
const { Given, When, Then } = require('cucumber');
const { client } = require('nightwatch-api');
const searchField = "//input[contains(@class, 'SearchBox')]";
const searchButton = "//button[contains(@class,'SearchBox__Button')]";
const searchResultFoundContainer = '.sk-hits';
const searchResultNotFoundContainer = '.sk-no-hits';
const userEntersTheEnglishOrNepaliCharacters = (searchTerm) => client.useXpath()
.waitForElementVisible(searchField)
.setValue(searchField, searchTerm)
.useCss();
const userSearchesForTheLiterature = () => client.useXpath()
.click(searchButton)
.useCss();
Given('the user has entered the English/Nepali characters {string}', userEntersTheEnglishOrNepaliCharacters);
When('the user enters the English/Nepali characters {string}', userEntersTheEnglishOrNepaliCharacters);
Given('the user has searched for the literature', userSearchesForTheLiterature);
When('the user searches for the literature', userSearchesForTheLiterature);
Then('the search result should be displayed', () => client.waitForElementVisible(searchResultFoundContainer)
.waitForElementNotPresent(searchResultNotFoundContainer));
Then('the search result should not be displayed', () => client.waitForElementVisible(searchResultNotFoundContainer)
.waitForElementNotPresent(searchResultFoundContainer));
Finally, run the test from the root directory using the command:
cucumber-js --require test/acceptance/index.js --require test/acceptance/stepDefinitions test/acceptance/features/[YOUR_FEATURE_FILE].feature
Does the above command look long? I am sorry, but you have to use that command every time you run the test. But only the name of your feature file
is different, while running different tests, the rest is all the same. So, let's assign an easy short name for the rest and put it inside the scripts section of package.json
. I called it test-e2e
and inside the scripts of package.json
, I added
"test-e2e" : "cucumber-js --require test/acceptance/index.js --require test/acceptance/stepDefinitions"
Now, the above long command is shortened to
npm run test-e2e test/acceptance/features/[YOUR_FEATURE_FILE].feature
That's it. Now, you are ready to run test suites for your project. You can refer to Nightwatch to read more about Nightwatch and its commands.
Hope you enjoy testing.
ThankYou!
Top comments (0)