As quality assurance engineers with over a decade of experience testing complex enterprise apps, we often get asked – what is the best automated testing framework for web and mobile?
Our answer? Look no further than NightwatchJS.
In this 2500+ word guide, we’ll share why NightwatchJS is our framework of choice for simplifying rock-solid test automation in the modern CI/CD world.
Overview
Never heard of Nightwatch before? No worries! Here’s a quick primer before we dive deeper:
Nightwatch.js is an integrated, easy-to-use End-to-End testing solution for web and mobile apps built on Node.js. It uses the Selenium WebDriver API underneath to drive browsers in an automated fashion so you can validate features and flows in UI without tedious manual repetition.
Some key capabilities:
✅ Automated testing across 2000+ browser and mobile environments
✅ Parallel test execution for lightning fast test cycles
✅ Detailed command line reporting and HTML exports
✅ Easy integration with CI systems like Jenkins
✅ Active open source community support
So if you’re looking for simplified, scalable test automation in JavaScript for responsive web designs and mobile web apps – Nightwatch checks all the boxes!
It fits nicely into modern agile QA frameworks by facilitating iterative test-driven development and rapid feedback loops. Tests run in minutes rather than hours without any infrastructure headaches.
And as industry surveys reveal, up to 70% of QA test automation engineers use JavaScript/Node.js based frameworks as their pick for writable and adaptable browser testing. Modern apps demand tools that can keep up!
Now that you know where NightwatchJS comes from and what sparked our love for it, let’s look at the key reasons it could be the perfect match for your test automation needs…
Why We Love Using NightwatchJS
While Selenium WebDriver and libraries like Cypress or Playwright excel in their own ways, here are some areas where we feel NightwatchJS outshines every other tool:
Simplified & Familiar JavaScript Syntax
Nightwatch leverages async/await , arrow functions, Promises and other modern JavaScript syntax to create incredibly readable test code without callbacks or confusing OOP structures. It feels like writing plain JavaScript!
No Java or Python clutter as with Selenium or confusing custom DSLs. The intuitive syntax and BDD style structures make tests a breeze to write and understand later. Plus access the entire JavaScript ecosystem thanks to Node.js under the hood!
test(‘Login user‘, async (browser) => {
await browser
.url(‘https://myapp.com‘)
.waitForElementVisible(‘#login‘)
.setValue(‘#user‘, ‘john‘)
.setValue(‘#password‘, ‘123456‘)
.click(‘#submit‘)
.assert.urlContains(‘dashboard‘)
});
See how much more readable and compact that test structure is compared to raw Selenium?
Powerful Automatic Configuration
Setting up test frameworks from scratch can get real messy with drivers, dependencies and configs.
Nightwatch simplifies setup drastically via NPM with automatic installation of Selenium, browser drivers, boilerplate code and sensible defaults based on your environment. Just run:
npm install nightwatch
And answer a few interactive prompts to customize parallel testing, browsers etc. No manual wrangling of WebDriver binaries or environment variables!
The generated config files are cleanly separated so you can tweak timeouts, reporting and other preferences easily without touching actual tests.
Integrated Real Device Testing
While open source emulators and simulators have come a long way, to release quality digital experiences you need to test on real mobile devices and browsers that your customers use daily.
And setting up your own in-house device labs requires significant investments in infrastructure and maintenance with limited testing flexibility.
Nightwatch provides integrated access to testing on real iOS, Android and desktop browsers on BrowserStack, with support for 2000+ environments all accessible directly from your terminal:
npx nightwatch --env browserstack
You can run the same tests on real Safari, Edge, Chrome or Firefox versions without any extra effort. The detailed failure reports and videos make debugging a breeze!
Simplifies Cross Browser & Mobile Testing
Between proliferating browser versions, fragmentation in mobile OS versions and responsive design complexity – providing seamless omni-channel digital experiences has become the key competitive advantage for modern apps.
But with great opportunity comes great QA responsibility! Validating flows on Safari, old Android or the diversity of mobile to desktop workflows is critical.
This is where NightwatchJS shines again. Its architecture makes orchestrating parallel test runs across desktop, mobile, tablets and browsers effortless without any infrastructure overhead or delayed feedback. Just one line:
npx nightwatch --env chrome,iphone7
And you’re testing across Chrome and iOS simultaneously in minutes with detailed reporting on failures!
Active Open Source Community
As much as we love Nightwatch already, there is always scope for growth. No tool is perfect for every use case out there.
The good news is NightwatchJS has fantastic open source community support and contribution making rapid improvements through GitHub.
Integrations and plugins with React, Angular, database layers, CI systems and more are continually added thanks to an engaged community solving real test automation challenges together.
This creates a virtuous cycle making NightwatchJS one of the most versatile, battle-tested solutions available today!
Convinced about the power of Nightwatch yet? Let‘s dive into setting up and running your first test…
Your First NightwatchJS Test
The quickest way to experience Nightwatch magic is to get hands-on building a test yourself. We‘ll cover:
- Installing Nightwatch
- Writing a simple test script
- Executing the test locally and on BrowserStack
- Extending with page objects
Ready to get testing in under 10 minutes? Let‘s do this.
1. Install NightwatchJS
Thanks to NPM integration, setting up Nightwatch is a breeze.
First, create a new test directory:
mkdir nightwatch-demo
cd nightwatch-demo
Initialize NPM:
npm init
Now install Nightwatch interactively:
npm install nightwatch
The installer will automatically configure Selenium, test runners and boilerplate code tailored to your environment. How awesome is that!
✔ Where should your tests be launched? · chrome, firefox
✔ Where are your tests located? · tests
✔ What is the base URL for the application under test? · http://localhost
Install ChromeDriver and GeckoDriver for the chosen browsers:
npm install chromedriver
npm install geckodriver
That‘s it for setup! The automatic configuration by Nightwatch is a life saver compared to wiring up all the moving parts manually.
2. Write Your First Test Script
Inside the autogenerated tests folder, create a new login-test.js file and add the following:
module.exports = {
‘Demo login test‘ : (browser) => {
browser
.url(‘https://www.my-app.com‘)
.expect.element(‘#login-form‘).to.be.visible;
.setValue(‘#username‘, ‘john‘)
.setValue(‘#password‘, ‘123456‘)
.click(‘#login‘)
.assert.urlContains(‘dashboard‘)
.end();
}
}
This simple test does the following:
- Navigates to app homepage
- Checks for login form visibility
- Enters username and password
- Clicks login and asserts redirection
- Closes browser
See how easy it is to write automation logic in JavaScript without unnecessary OOP baggage?
Let‘s execute next.
3. Execute Test Locally
To run the test file locally, use:
npx nightwatch tests/login-test.js
By default, this will sequentially execute on Firefox and Chrome thanks to our earlier configuration. The terminal output shows detailed test results like:
Neatright? You can also generate HTML and JUnit XML reports found inside the tests_output folder.
If you only want to use a specific browser, use –env flag:
npx nightwatch tests/login-test.js --env firefox
So in under 10 minutes we:
✅ Installed Nightwatch
✅ Wrote a simple automated test case
✅ Ran the test locally on Firefox & Chrome
✅ Checked the CLI reporting output
Let‘s take this to the next level now…
4. Configure and Run on BrowserStack
While running tests locally is great for rapid iterations, real-world testing requires parity across actual user scenarios.
This means testing across real desktop, mobile and tablet browsers that the application will be used on daily.
Setting up local device labs is complex and limited. A cloud platform like BrowserStack provides instant access to 2000+ real mobile and desktop browsers spanning various OS versions, resolutions etc.
Let‘s configure our Nightwatch framework to leverage BrowserStack for mobile and cross browser testing:
Step 1: Install browserstack-nightwatch Plugin
The official BrowserStack Nightwatch plugin makes integration a breeze:
npm install -D browserstack-nightwatch
This exposes BrowserStack capabilities and credentials to Nightwatch config.
Step 2: Configure Authentication
Inside nightwatch.conf.js, add your BrowserStack username and access key:
common_capabilities: {
‘build‘: ‘nightwatch-demo‘,
‘browserstack.user‘: ‘MY_USER‘,
‘browserstack.key‘: ‘MY_KEY‘
}
Get these credentials from BrowserStack Access Keys section.
Step 3: Set Testing Targets
Specify the desired mobile devices, OS and browsers you want to test on within capabilities:
browserstack: {
firefox: {
desiredCapabilities: {
// Target Firefox on OS X
os: ‘OS X‘,
os_version: ‘Monterey‘,
browser: ‘Firefox‘
}
},
iphone14: {
desiredCapabilities: {
// Target iPhone 14 ProMax
device: ‘iPhone 14 Pro Max‘,
os_version: ‘iOS 16‘,
browserName: ‘iphone‘
}
}
}
Step 4: Run Test on BrowserStack
Execute same test by passing browserstack env:
npx nightwatch tests/login-test.js --env browserstack
And voila! The test now runs on Firefox on OSX and iPhone 14 Pro Max on iOS 16 in parallel.
The BrowserStack online dashboard provides detailed debugging videos + metrics in case of failures:
Under 15 minutes to go from nothing to automated mobile + browser testing on demand! The power of Nightwatch 🙂
Structuring Tests for Scale
Now that you have taste of writing and running Nightwatch tests locally and on the cloud, let‘s look at some tips to structure large test suites efficiently.
Some key ideas to enable scale while maintaining agility:
Leveraging Page Objects
The page object pattern helps craft resuable page components for popular screens to avoid duplicate selectors and actions.
For example, create a loginPage.js file:
module.exports = {
url: ‘https://www.myapp.com‘,
elements: {
username: ‘#username‘,
password: ‘#password‘,
submit: ‘#login‘
},
login: function(user, pass) {
// Encapsulate login action
}
}
And use wherever needed:
loginPage.login(‘john‘, ‘123456‘)
This avoids rewriting login logic across tests!
Grouping Tests
Break down large test suites into logical groups using NestJS style suites:
describe(‘Auth tests‘, () => {
before(() => {
// Preconditions
});
test(‘Can login successfully‘, () => {
});
test(‘Fails on wrong password‘);
})
describe(‘Payment tests‘, () => {
// Payment test cases
})
Using Hooks
Extract common actions into global setup hooks like before/after rather than repeating code:
before(async browser => {
await browser.login();
})
after(() => {
browser.logout();
browser.deleteUser(); // Cleanup
})
There are many more advance techniques around using custom commands, external libraries, retrying flaky tests automatically and other good stuff – but we‘ll save that for another 3k word post! 😉
The key is to start simple and let your tests incrementally build on each other just like feature development.
Advanced Integrations
Let‘s also touch upon some of the powerful integrations possible with Nightwatch to incorporate into your CI/CD pipelines:
CircleCI
Thanks to inbuilt JUnit XML reporting, parallelization and easy async execution – Nightwatch simplifies CircleCI configuration for rapid test feedback:
jobs:
e2eTests:
docker:
- image: circleci/node:12
steps:
- checkout
- run:
name: Install Nightwatch
command: |
npm install nightwatch
- run:
name: Run E2E Tests
command: |
npx nightwatch tests/ --env chrome,firefox
- store_test_results:
path: tests_output
Jenkins
Similarly, Nightwatch integrates smoothly with Jenkins pipelines for automated testing every commit:
node {
stage(‘E2E Tests‘) {
sh ‘npm install nightwatch‘
sh ‘npx nightwatch -e chrome,firefox‘
}
stage(‘Publish Reports‘) {
junit ‘tests_output/*.xml‘
}
}
This allows managing browser matrices dynamically without headaches.
GitHub Actions
For GitHub repositories, Actions facilitates simple cross-platform Nightwatch execution:
name: E2E tests
on:
pull_request:
branches: [main]
jobs:
nightwatch_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- name: Install Nightwatch
run: |
npm install nightwatch
- name: Run E2E Tests
run: |
npx nightwatch tests/
Automated testing pre-merge on PRs allows detecting regressions early with Nightwatch!
The flexible reporting and capabilities enable seamless CI integration irrespective of environment.
Troubleshooting Guide
Here are some common issues we‘ve faced over thousands of tests with resolutions:
Elements not visible or interacting
The async nature of dynamic apps means waiting for content to appear. Use .waitForElementVisible()
before interacting:
browser.waitForElementVisible(‘.modal‘)
.click(‘.modal .submit‘)
Tests pass locally but fail on BrowserStack
Cloud browser environments have variability and latency. Use increased timeouts when running remotely:
// 10 sec per step
browser.globals.waitForConditionTimeout = 10000
Conditional waits and synchronization
Determining perfect wait timing is tricky with Ajax apps. Use libraries like Nightwatch-Api with automatic wait calls to eliminate flake:
browser.initApi()
browser.api.page.login() // Waits until URL contains login
This saves tons of waits boilerplate logic!
And many more tips…
Over the years, we‘ve compiled a handy knowledge base of fixes – so don‘t hesitate to reach out via email and we‘re happy to help troubleshoot any Nightwatch issues!
Now on to you – go unleash the power of simplified Node.js based end-to-end testing with NightwatchJS! 🚀
Review our getting started guide, leverage real device testing on BrowserStack, integrate with CI, and let us know if any questions come up or if you build something cool!
Happy Testing!
John and Sarah
Professional Test Automators 👩💻👨💻
Test Automation Labs