JavaScript and Cypress framework for Modern UI Automation

JavaScript and Cypress framework for Modern UI Automation

Ensuring smooth functionality and an excellent user experience for web applications is more important than ever in today’s digital world. As web applications become increasingly complex, however, traditional testing methods often struggle to meet the demands of modern development. Modern UI automation frameworks, therefore, offer powerful tools for comprehensive and reliable testing. 

JavaScript, the backbone of web development, is central to many automation frameworks due to its versatility. Cypress, in fact, has gained popularity for its ease of use, powerful features, and developer-friendly approach, making it a standout in this space. It also streamlines the process of writing, executing, and maintaining automated tests, making it an essential tool for developers and testers alike. 

In this blog, we’ll delve into Modern UI automation with JavaScript and Cypress, starting with the setup and then moving on to advanced features like real-time reloading and CI pipeline integration. By the end, you’ll have the knowledge to effectively automate UI testing for modern web applications, whether you’re a seasoned developer or new to automation

Prerequisites for Modern UI Automation Framework

Before embarking on your journey with JavaScript and Cypress for Modern UI Automation, ensure you must have the following tools in your system and some basic understanding of the technologies i.e. Cypress, Automation, JavaScript and some coding knowledge.

Node.js and npm 

Both Node.js and npm are essential for managing dependencies and running your Cypress tests. 

VS Code

VS Code offers a powerful and user-friendly environment for working with JavaScript but also seamlessly integrates with the Cypress framework for modern UI automation. It provides syntax highlighting, code completion, debugging tools, and extensions that can significantly enhance your development experience.

Basic Understanding of JavaScript 

Familiarity with fundamental JavaScript concepts like variables, functions, and object-oriented programming will therefore crucial for writing automation scripts and interacting with the browser. 

Cypress 

Cypress is the core framework for your end-to-end (E2E) tests; consequently, it offers a user-friendly interface and powerful capabilities for interacting with web elements. 

Here, we’ve looked at the things we need before we start. 

Installation for Modern UI Automation Framework

How to Install Node.js on Windows? 

What is Node.js? 

Node.js is a runtime environment that enables JavaScript to run outside of a web browser; consequently, it allows developers to build scalable and high-performance server-side applications. Originally, JavaScript was confined to client-side scripting in browsers, but with Node.js, it can now power the backend as well. 

For testers, Node.js unlocks powerful automation capabilities but also supports tools and frameworks like WebDriver.io and Puppeteer, which automate browser interactions, manage test suites, and perform assertions. Node.js also facilitates custom test frameworks and seamless integration with testing tools. Additionally, it enables running tests in headless environments, ideal for continuous integration pipelines. Overall, Node.js enhances the effectiveness of JavaScript-based testing, improving software quality, speeding up development and UI Automation. 

Key Features of Node.js

  • Asynchronous and Event-Driven: Node.js library APIs work asynchronously; consequently, they are non-blocking. The server moves to the next API call without waiting for the previous one to complete, therefore it using event mechanisms to handle responses efficiently. 
  • High Speed: Built on Google Chrome’s V8 JavaScript engine, Node.js therefore executes code very quickly. 
  • Single-Threaded but Highly Scalable: Node.js uses a single-threaded model with event looping. This event-driven architecture allows the server to respond without blocking, making it highly scalable compared to traditional servers. Unlike servers like Apache HTTP Server, which create limited threads to handle requests, Node.js can handle thousands of requests using a single-threaded program. 
  • No Buffering: Node.js applications do not buffer data; instead they output data in chunks. 

Steps to Install Node.js on Windows for UI Automation: 

  1. Downloading the Node.js Installer 
    • Visit the official Node.js website: Node.js Downloads 
    • Download the .msi installer for Windows. 
  2. Running the Node.js Installer 
    • Double-click on the .msi installer to open the Node.js Setup Wizard. 
    • Click “Next” on the Welcome to Node.js Setup Wizard screen. 
    • Accept the End-User License Agreement (EULA) by checking “I accept the terms in the License Agreement” and click “Next.” 
    • Choose the destination folder where you want to install Node.js and click “Next.” 
    • Click “Next” on the Custom Setup screen. 
    • When prompted to “Install tools for native modules,” click “Install.” 
    • Wait for the installation to complete and click “Finish” when done. 
  3. Verify the Installation 
    • Open the Command Prompt or Windows PowerShell. 
    • Run the following command to check if Node.js was installed correctly:
    • node -v 
    • If Node.js was installed successfully, the command prompt will print the version of Node.js installed. 

By following these steps, you can install Node.js on your Windows system and start leveraging its capabilities for server-side scripting and automated testing. 

How to Install Visual Studio Code (VS Code) on Windows? 

What is Visual Studio Code (VS Code)? 

Visual Studio Code (VS Code) is a free, open-source code editor developed by Microsoft. It features a user-friendly interface and powerful editing capabilities. VS Code supports a wide range of programming languages and comes with built-in features for debugging, syntax highlighting, code completion, and Git integration. It also offers a vast ecosystem of extensions to customize and extend its functionality. 

Steps to Install VS Code for UI Automation

  1. Visit the Official VS Code Website 
    • Open any web browser like Google Chrome or Microsoft Edge. 
    • Go to the official Visual Studio Code website: VS Code Downloads 
  2. Download VS Code for Windows 
    • Click the “Download for Windows” button on the website to start the download. 
  3. Open the Downloaded Installer 
    • Once the download is complete, locate the Visual Studio Code installer in your downloads folder. 
    • Double-click the installer icon to begin the installation process. 
  4. Accept the License Agreement 
    • When the installer opens, you will be asked to accept the terms and conditions of Visual Studio Code. 
    • Check “I accept the agreement” and then click the “Next” button. 
  5. Choose Installation Location 
    • Select the destination folder where you want to install Visual Studio Code. 
    • Click the “Next” button. 
  6. Select Additional Tasks 
    • You may be prompted to select additional tasks, such as creating a desktop icon or adding VS Code to your PATH. 
    • Select the options you prefer and click “Next.” 
  7. Install Visual Studio Code 
    • Click the “Install” button to start the installation process. 
    • The installation will take about a minute to complete. 
  8. Launch Visual Studio Code 
    • After the installation is complete, a window will appear with a “Launch Visual Studio Code” checkbox. 
    • Check this box and then click “Finish.” 
  9. Open Visual Studio Code 
    • Visual Studio Code will open automatically. 
    • You can now create a new file and start coding in your preferred programming language. 

By following these steps, you have successfully installed Visual Studio Code on your Windows system. You are now ready to start your programming journey with VS Code. 

Create Project for Modern UI Automation Framework

Creating a Cypress project in VS Code is straightforward. Follow these steps to get started:

Steps to Create a Cypress Project in VS Code 

  1. Open VS Code: 
    • Launch VS Code on your computer. 
  2. Click on Files Tab: 
    • Navigate to the top-left corner of the VS Code interface and click on the “Files” tab. 
  3. Select Open Folder Option: 
    • From the dropdown menu, choose the “Open Folder” option. This action will prompt a pop-up file explorer window. 
  4. Choose Project Location: 
    • Browse through the file explorer to select the location where you want to create your new Cypress project. For this example, create a new folder on the desktop and name it “CypressJavaScriptFramework”. 
  5. Open Selected Folder: 
    • Once you’ve created the new folder, select it and click on the “Open” button. VS Code will now automatically navigate to the selected folder. 

Congratulations! You’ve successfully created a new Cypress project in VS Code. On the left panel of VS Code, you’ll see your project name, and a welcome tab will appear in the editor. 

Now, we are all set to start building your Cypress project in Visual Studio Code! 

What is Cypress?

Cypress is a modern, open-source test automation framework designed specifically for web applications and used to UI automation also. Unlike many other testing tools that run outside of the browser and execute remote commands, Cypress operates directly within the browser. This unique architecture enables Cypress to offer fast, reliable, and easy-to-write tests, making it an invaluable tool for developers and testers. 

Cypress’s architecture allows it to control the browser in real-time, providing access to every part of the application being tested. This direct control means that tests can interact with the DOM, make assertions, and simulate user interactions with unparalleled accuracy and speed.

Cypress Architecture for Modern UI Automation Framework:

Cypress Architecture for Modern UI Automation Framework

Cypress automation testing operates on a NodeJS server. It uses the WebSocket protocol to create a connection between the browser and the Node.js server. WebSocket’s allow full-duplex communication, enabling Cypress to send commands and receive feedback in real time. This means Cypress can navigate URLs, interact with elements, and make assertions, while also receiving DOM snapshots, console logs, and other test-related information from the browser. 

Let’s break down the components and how they interact: 

  1. User Interaction
    • The process begins with a user interacting with the web application. This includes actions like clicking buttons, selecting values from drop-down menus, filling forms, or navigating through pages. 
  2. Cypress Test Scripts
    • Developers write test scripts using JavaScript or TypeScript. These scripts simulate user interactions and verify that the application behaves as expected. 
  3. Cypress Runner
    • The Cypress Runner executes the test scripts. It interacts with the web application, capturing screenshots and videos during the tests. 
  4. Proxy Server
    • A proxy server sits between the Cypress Runner and the web application. It intercepts requests and responses, allowing developers to manipulate them. 
  5. Node.js
    • Cypress runs on Node.js, providing a runtime environment for executing JavaScript or TypeScript code. 
  6. WebSocket
    • The WebSocket protocol enables real-time communication between the Cypress Runner and the web application. 
  7. HTTP Requests/Responses
    • HTTP requests (e.g., GET, POST) and responses are exchanged between the Cypress Runner and the application server, facilitating the testing process. 

By understanding these components and their interactions, you can better appreciate how Cypress effectively automates testing for modern web applications and UI Automation. 

Features of the Cypress

  • Time Travel: Cypress captures snapshots of your application as it runs, allowing you to hover over each command in the test runner to see what happened at every step. 
  • Real-Time Reloads: Cypress automatically reloads tests in real-time as you make changes, providing instant feedback on your changes without restarting your test suite. 
  • Debuggability: Cypress provides detailed error messages and stack traces, making it easier to debug failed tests. It also allows you to use browser developer tools for debugging purposes. 
  • Automatic Waiting: Cypress automatically waits for commands and assertions before moving on, eliminating the need for explicit waits or sleeps in your test code. 
  • Spies, Stubs, and Clocks: Cypress provides built-in support for spies, stubs, and clocks to verify and control the behavior of functions, timers, and other application features. 
  • Network Traffic Control: Cypress allows you to control and stub network traffic, making it easier to test how your application behaves under various network conditions. 
  • Consistent Results: Cypress runs in the same run-loop as your application, ensuring that tests produce consistent results without flaky behavior. 
  • Cross-Browser Testing: Cypress supports testing across multiple browsers, including Chrome, Firefox, and Edge, ensuring your application works consistently across different environments. 
  • CI/CD Integration: Cypress integrates seamlessly with continuous integration and continuous deployment (CI/CD) pipelines, enabling automated testing as part of your development workflow.

Advantages of Cypress

  • Easy Setup and Configuration: Cypress offers a simple setup process with minimal configuration, allowing you to start writing tests quickly without dealing with complex setup procedures. 
  • Developer-Friendly: Cypress is designed with developers in mind, providing an intuitive API and detailed documentation that makes it easy to write and maintain tests. 
  • Fast Test Execution: Cypress runs directly in the browser, resulting in faster test execution compared to traditional testing frameworks that operate outside the browser. 
  • Reliable and Flake-Free: Cypress eliminates common sources of flakiness in tests by running in the same run-loop as your application, ensuring consistent and reliable test results. 
  • Comprehensive Testing: Cypress supports a wide range of testing types, including end-to-end (E2E), integration, and unit tests, providing a comprehensive solution for testing web applications. 
  • Rich Ecosystem: Cypress has a rich ecosystem of plugins and extensions that enhance its functionality and allow you to customize your testing setup to suit your specific needs. 
  • Active Community and Support: Cypress has an active and growing community that provides support, shares best practices, and contributes to the development of the framework. 
  • Seamless CI/CD Integration: Cypress integrates seamlessly with CI/CD pipelines, enabling automated testing as part of your development workflow. This integration ensures that tests are run consistently and reliably in different environments, improving the overall quality of your software. 

Cypress’s unique features, reliability, and ease of use make it an ideal choice for developers and testers looking to ensure the quality and performance of their web applications.  

By leveraging Cypress in your JavaScript projects, you can achieve efficient and effective UI automation, enhancing the overall development lifecycle. 

Cypress Framework Structure 

In a Cypress project, the folder structure is well-defined to help you organize your test code, configuration, plugins, and related files. Here’s a breakdown of the typical folders and files we will encounter:

1. cypress/ Directory 

  • Purpose: This is the root directory where all Cypress-related files and folders reside. 

2. cypress/e2e/ Directory 

  • Purpose: This is where you should place your test files. 
  • Details: Cypress automatically detects and runs tests from this folder. Test files typically have .spec.js or .test.js file extensions. 

3. cypress/fixtures/ Directory (Optional) 

  • Purpose: Store static data or fixture files that your tests might need. 
  • Details: These can include JSON, CSV, or text files. 

4. cypress/plugins/ Directory (Optional) 

  • Purpose: Extend Cypress’s functionality. 
  • Details: Write custom plugins or modify Cypress behavior through plugins. 

5. cypress/support/ Directory (Optional) 

  • Purpose: Store various support files, including custom commands and global variables. 
  • Details
    • commands.js (Optional): Define custom Cypress commands here to encapsulate frequently used sequences of actions, making your test code more concise and maintainable. 
    • e2e.js (Optional): Include global setup and teardown code for your Cypress tests. This file runs before and after all test files, allowing you to perform tasks like setting up test data or cleaning up resources. 

6. cypress.config.js File 

  • Purpose: Customize settings for Cypress, such as the base URL, browser options, and other configurations. 
  • Location: Usually found in the root directory of your Cypress project. 
  • Details: You can create this file manually if it doesn’t exist or generate it using the Cypress Test Runner’s settings. 

7. node_modules/ Directory 

  • Purpose: Contains all the Node.js packages and dependencies used by Cypress and your project. 
  • Details: Usually, you don’t need to change anything in this folder. 

8. package.json File 

  • Purpose: Defines your project’s metadata and dependencies. 
  • Details: Used to manage Node.js packages and scripts for running Cypress tests. 

9. package-lock.json File 

  • Purpose: Ensures your project dependencies remain consistent across different environments. 
  • Details: Automatically generated and used by Node.js’s package manager, npm. 

10. README.md File (Optional) 

  • Purpose: Include documentation, instructions, or information about your Cypress project. 

11. Other Files and Folders (Project-Specific) 

  • Purpose: Depending on your project’s needs, you may have additional files or folders for application code, test data, reports, or CI/CD configurations. 

Folder Structure Overview 

The folder structure is designed to keep your Cypress project organized and easy to maintain:

  • Main Directories
    • cypress/e2e/: Where you write your tests. 
    • cypress.config.js: Where you configure Cypress. 
  • Optional Directories
    • fixtures/: For test data. 
    • plugins/: For extending Cypress functionality. 
    • support/: For custom commands and utilities. 

This structure helps you customize your testing environment and keep everything well-organized. 

Now let’s start to install Cypress and Configure in our project.

Cypress Install and Configuration:

We’re now ready to dive into the Cypress installation and configuration process. With Node.js, VS Code, and a new project named “CypressJavaScriptFramework” set up, let’s walk through configuring Cypress step-by-step. 

  1. Open Your Project: Start by opening the “CypressJavaScriptFramework” project in VS Code. 
  2. Open a New Terminal: From the top-left corner of VS Code, open a new terminal. 
  3. Initialize Node.js Project: Verify your directory path and run the below command to initialize a new Node.js project and generate a package.json file. 
    • npm init –y 
  4. Install Cypress: Install Cypress as a development dependency with the below command. Once installed, you’ll find Cypress listed in your package.json file. As of this writing, the latest version is 13.13.1. 
    • npm install –save-dev cypress  
  5. Configure Cypress: To open the Cypress Test Runner, run the below command. 
    • npx cypress open

Upon first launch, you’ll be greeted by Launchpad, which helps with initial setup and configuration. 

Step 1: Choosing a Testing Type

The first decision we will make in the Launchpad is selecting the type of testing you want to perform: 

  • E2E (End-to-End) Testing: This option runs your entire application and visits pages to test them comprehensively. 
  • Component Testing: This option allows you to mount and test individual components of your app in isolation. 

Here we must select E2E Testing. 

What is E2E Testing? 

End-to-End (E2E) testing is a method of testing that validates the functionality and performance of an application by simulating real user scenarios from start to end. This approach ensures that all components of the application, including the frontend and backend, work together seamlessly. 

After selecting E2E Testing Configuration Screen where we just have to click on Continue button.

Step 2: Quick Configuration 

Next, the Launchpad will automatically generate a set of configuration files tailored to your chosen testing type. You’ll see a list of these changes, which you can review before continuing. For detailed information about the generated configuration, you can check out the Cypress configuration reference page. 

After clicking on Continue button we will notice some changes in the framework few Configuration files will be added in the Framework which are 
cypress.config.js 
cypress/ directory 
cypress directory Fixtures and Support directory 

The description of these file s and folders we have seen in start of blog.

Step 3: Launching a Browser 

Finally, the Launchpad will display a list of compatible browsers detected on your system. You can select any browser to start your testing. Don’t worry if you want to switch browsers later; Cypress allows you to change browsers at any point of time.  

As in my system I have Chrome and Edge browser installed. Cypress also have the inbuild browser which is called as “Electron” 

What is Electron Browser? 

Electron is an open-source framework that allows developers to build cross-platform desktop applications using web technologies like HTML, CSS, and JavaScript. It combines the Chromium rendering engine and the Node.js runtime, enabling you to create desktop apps that function seamlessly across Windows, macOS, and Linux.

Key Points: 

  • Cross-Platform Compatibility: Develop applications that work on Windows, macOS, and Linux. 
  • Chromium-Based: Uses Chromium, the same rendering engine behind Google Chrome, for a consistent browsing experience. 
  • Node.js Integration: Allows access to native OS functionalities via Node.js, blending web technologies with desktop capabilities. 
  • Used by Popular Apps: Many well-known applications like Slack, Visual Studio Code, and GitHub Desktop are built using Electron. 

Electron provides the flexibility to build powerful desktop applications with the familiarity and ease of web development. 

Now, you’re ready to hit the start button and embark on your testing journey with Cypress! 

In this article we will use chrome browser for that we have to select Chrome and click on “Start E2E Testing in Chrome”. Then we will land on Cypress runner screen here we have 2 options   

  • Scaffold example specs: Automatically generate example test specifications to help you get started with Cypress. 
  • Create new specs: Manually create new test specifications to tailor your testing needs and scenarios. 

Here we will use Scaffold example specs.  

Scaffolding Example Specs 

Use: Scaffolding example specs in Cypress generates predefined test files that demonstrate how to write and structure tests. 

Reason: Providing example specs helps new users quickly understand Cypress’s syntax and best practices, making it easier to start writing their own tests and ensuring they follow a proper testing framework. 

Once we select Scaffold example specs option, we will notice in framework few files are added in cypress directory under e2e directory. 

Finally, we have installed cypress, configured and now we can run Scaffolding Example Specs. Now we will add our own file and execute it with cypress runner and from Command Line. Before that we will go through the Cypress Testing components. 

Cypress Testing Components 

Let’s understand Cypress Testing Components used while automation. 

  • describe() Block: Groups related tests and provides structure. 
  • it() Blocks: Defines individual test cases, focusing on specific functionalities. 
  • Hooks: Manage setup and teardown processes to maintain a consistent test environment. 
  • Assertions: Verify that the application behaves as expected by comparing actual results to expected results. 

describe() Block 

The describe() block in Cypress is used to group related test cases together. It defines a test suite, making it easier to organize and manage your tests. 

Purpose: 

The describe() block provides a structure for your test cases, allowing you to group tests that are related to a particular feature or functionality. It helps in maintaining a clean and organized test suite, especially as your test cases grow in number. 

Example: 

it() Blocks 

The it() block defines individual test cases within a describe() block. It contains the actual code for testing a specific aspect of the feature under test. 

Purpose: 

Each it() block should test a single functionality or scenario, making your test cases clear and focused. This helps in identifying issues quickly and understanding what each test is verifying. 

Example:

Hooks 

Hooks are special functions in Cypress that run before or after tests. They are used to set up or clean up the state and perform common tasks needed for your tests. 

Types of Hooks: 

  • before(): Executes once before all tests in a describe() block. 
  • beforeEach(): Runs before each it() block within a describe() block. 
  • after(): Executes once after all tests in a describe() block. 
  • afterEach(): Runs after each it() block within a describe() block. 

Purpose: 

Hooks are useful for setting up test environments, preparing data, and cleaning up after tests, ensuring a consistent and reliable test environment. 

Example: 

Assertions 

Assertions are statements that check if a condition is true during the test execution. They verify that the application behaves as expected and helps identify issues when the actual results differ from the expected results. 

Purpose: 

Assertions validate the outcomes of your test cases by comparing actual results against expected results. They help ensure that your application functions correctly and meets the defined requirements. 

Example: 

These components work together to create a comprehensive and organized test suite in Cypress, ensuring your application is thoroughly tested and reliable. 

Create Test File 

Before diving into test file creation, let’s define the functionalities. We will automate the Calculator.net web application and will focus on basic arithmetic operations: addition, subtraction, multiplication, and division. 

Here’s a breakdown of the test scenarios:

1. Verify user able to do addition 

  • Visit Calculator.net 
  • Click on two numbers (e.g., 1 and 2) 
  • Click the “+” operator 
  • Click on another number (e.g., 1) 
  • Click the “=” operator 
  • Verify the result is equal to 3 
  • Click the “reset” button 

2. Verify user able to do Subtraction 

  • Visit Calculator.net 
  • Click on a number (e.g., 3) 
  • Click the “-” operator 
  • Click on another number (e.g., 1) 
  • Click the “=” operator 
  • Verify the result is equal to 2 
  • Click the “reset” button 

3. Verify user able to do Multiplication 

  • Visit Calculator.net 
  • Click on a number (e.g., 2) 
  • Click the “*” operator 
  • Click on another number (e.g., 5) 
  • Click the “=” operator 
  • Verify the result is equal to 10 
  • Click the “reset” button 

4. Verify user able to do Division 

  • Visit Calculator.net 
  • Click on a number (e.g., 8) 
  • Click the “/” operator 
  • Click on another number (e.g., 2) 
  • Click the “=” operator 
  • Verify the result is equal to 4 
  • Click the “reset” button

Optimizing with Hooks: 

As you noticed, visiting Calculator.net and resetting the calculator are common steps across all scenarios. To avoid code repetition, we’ll utilize Cypress hooks: 

  • beforeEach: Execute this code before each test case. We’ll use it to visit Calculator.net. 
  • afterEach: Execute this code after each test case. We’ll use it to reset the calculator. 

Now, let’s create the test file and add the code below to Calculator.cy.js file.  

Let’s create a Selectors.json file to store all the selectors used in automation, assigning them meaningful names for better organization. 

The Selector.json file is a crucial part of your test automation framework. It centralizes all the CSS selectors used in your tests, making the code more maintainable and readable. By keeping selectors in a dedicated file, you can easily update or change any element locator without modifying multiple test scripts. 

Purpose: 

  • Centralization: All element selectors are stored in one place. 
  • Maintainability: Easy to update selectors if the application’s HTML changes. 
  • Readability: Makes test scripts cleaner and easier to understand by abstracting the actual CSS selectors. 

Add the following JSON content to your Selector.json file in the cypress/fixtures directory: 

  • Number Buttons: Selectors for the number buttons (0-9) use the span[onclick=’r(number)’] pattern, identifying the buttons by their onclick attribute values specific to each number. 
  • Operator Buttons: Selectors for the arithmetic operators (plus, minus, multiply, divide) use a similar pattern but include escaped quotes for the operator characters. 
  • Equals Button: The selector for the equals button follows the same pattern, identifying it by its onclick attribute. 
  • Result: The selector for the result display uses an ID (#sciOutPut), directly identifying the output element. 
  • Cancel Button: The selector for the cancel button is included to reset the calculator between tests, ensuring a clean state for each test case. 

By utilizing this Selector.json file, your test scripts can reference these selectors with meaningful names, thereby enhancing the clarity and maintainability of your test automation framework for UI.

Advanced Configuration In cypress.config.js: 

While installing and Configration of cypress we have created cypress.config.js file. Now we will look at the Advanced configuration in cypress.config.js allows you to tailor Cypress’s behavior to fit the specific needs of your project, optimizing and enhancing the testing process. 

Key Benefits: 

  • Customization: You can set up custom configurations to suit your testing environment, such as base URL, default timeouts, viewport size, and more. 
  • Environment Variables: Manage different environment settings, making it easy to switch between development, staging, and production environments. 
  • Plugin Integration: Configure plugins for extended functionality, such as code coverage, visual testing, or integrating with other tools and services. 
  • Reporter Configuration: Customize the output format of your test results, making it easier to integrate with CI/CD pipelines and other reporting tools. 
  • Browser Configuration: Define which browsers to use for testing, including headless mode, to speed up the execution of tests. 
  • Test Execution Control: Set up retries for flaky tests, control the order of test execution, and manage parallel test runs for better resource utilization. 
  • Security: Configure authentication tokens, manage sensitive data securely, and control network requests and responses to mimic real-world scenarios. 

Add below code to cypress.config.js file.

This Cypress configuration file (cypress.config.js) sets various options to customize the behavior of Cypress tests. Here’s a breakdown of the configuration for modern UI Automation: 

  • const { defineConfig } = require(“cypress”);: Import defineConfig function from Cypress, which is used to define configuration settings. 
  • module.exports = defineConfig({ … });: Exports the configuration object, which Cypress uses to configure the test environment. 
    • projectId: “CYFW01”: Specifies a unique project ID for identifying the test project. This is useful for organizing and managing tests in CI/CD pipeline. 
    • downloadsFolder: “cypress/downloads”: Sets the folder where files downloaded during tests will be saved. 
    • screenshotsFolder: “cypress/screenshots”: Defines the folder where screenshots taken during tests will be stored, particularly for failed tests. 
    • video: true: Enables video recording of test runs, which can be useful for reviewing test execution and debugging. 
    • screenshotOnRunFailure: true: Configures Cypress to take screenshots automatically when test fails. 
    • chromeWebSecurity: false: Disables web security in Chrome, which can be useful for testing applications that involve cross-origin requests. 
    • trashAssetsBeforeRuns: true: Ensures that previous test artifacts (like screenshots and videos) are deleted before running new tests, keeping the test environment clean. 
    • viewportWidth: 1920 and viewportHeight: 1080: To simulate a screen resolution of 1920×1080 pixels, you can set the default viewport size for tests accordingly.
    • execTimeout: 10000: Configures the maximum time (in milliseconds) Cypress will wait for commands to execute before timing out. 
    • pageLoadTimeout: 18000: Sets the maximum time (in milliseconds) Cypress will wait for a page to load before timing out. 
    • defaultCommandTimeout: 10000: Defines the default time (in milliseconds) Cypress will wait for commands to complete before timing out. 
    • retries: { runMode: 1, openMode: 0 }
      • runMode: 1: Specifies that Cypress should retry failed tests once when running in CI/CD mode (runMode). 
      • openMode: 0: Indicates that Cypress should not retry failed tests when running interactively (openMode). 
    • e2e: { setupNodeEvents(on, config) { … } }: Provide way to set-up Node.js event listeners for end-to-end tests. This is where you can implement custom logic or plugins to extend Cypress’s functionality. 

Executing Test Cases Locally for Modern UI Automation

To run test cases for modern UI Automation, use Cypress commands in your terminal. Cypress supports both headed mode (with a visible browser window) and headless mode (where tests run in the background without displaying a browser window). 

Running Test Cases in Headed Mode: 

  • Open your terminal. 
  • Navigate to the directory containing your Cypress tests. 
  • Execute the tests in headed mode using the below command: 
    • npx cypress open 

This will open the Cypress Test Runner. Click on “E2E Testing,” select the browser, and run the test case from the list (e.g., calculator.cy.js). Once selected, the test case will execute, and you can see the results in real-time. Screenshots of the local test execution are provided below. 

Running Test Cases in Headless Mode: 

Headless mode in Cypress refers to running test cases without a visible user interface. This method allows tests to be executed entirely in the background. Here’s how you can set up and run Cypress in headless mode. 

To run the test script directly from the command line, use the following command: 

npx cypress run –spec “cypress\e2e\Calculator.cy.js” –browser edge 

By default, Cypress executes tests in headless mode, but you can also specify it explicitly using the –headless flag: 

npx cypress run — headless –spec “cypress\e2e\Calculator.cy.js” –browser edge 

This enables efficient and automated test execution without launching the browser UI (UI Automation). 

headless UI automation1
headless UI automation 2

Conclusion 

In this blog, we explored how the JavaScript and Cypress framework revolutionize modern UI automation. By leveraging Cypress’s powerful features, such as its intuitive API, robust configuration options, and seamless integration with JavaScript, we were able to effectively test complex web applications.

We delved into practical implementations of modern UI automation such as: 

  • Creating and managing test cases with Cypress, including various operations like addition, subtraction, multiplication, and division using a calculator example. 
  • Using advanced configuration in cypress.config.js to tailor the test environment to specific needs, from handling different environments and customizing timeouts to integrating plugins and managing network requests. 
  • Implementing selectors through a Selector.json file to enhance test maintainability and clarity by using descriptive names for elements. 
  • Executing tests locally in both headed and headless modes, providing insights into how to monitor test execution in real-time or run tests in the background. 

By incorporating these strategies, we ensure that our web applications not only function correctly but also provide a seamless and reliable user experience. Cypress’s modern approach to UI testing simplifies the automation process, making it easier to handle the dynamic nature of contemporary web applications while maintaining high standards of quality and performance. 

https://github.com/spurqlabs/JavaScript-Cypress-WebAutomation

Click here to read more blog like this.

How to Automate Chrome Extension using selenium?

How to Automate Chrome Extension using selenium?

Introduction to Automate Chrome Extension:

Over the years, the landscape of software testing has gradually developed from a predominantly manual testing phase to an increasing accentuation on automated/automation testing. In your career path as a test engineer, you will inevitably bump into automation testing. In the current landscape of the software industry, clients seek frequent and repetitive deployments. If you are in a role of Quality Assurance, you are likely to encounter and test systems needing frequent requirement changes or the rapid introduction of new and progressive requirements. Such a dynamic landscape calls for a constant adaptation to frequent code changes within stiff deadlines. A challenge that we can effectively address by adopting automation testing methodologies.

Why to Automate Chrome Extension:

We often use Chrome extensions in our daily activities, which is crucial for enhancing productivity. The repetitive nature of certain tasks associated with these extensions can become monotonous over time. This blog aims to guide you through the process of automating Chrome extensions and executing click actions using Selenium, a widely acclaimed open-source test automation framework introduced in 2004. If you find yourself needing to use a particular extension regularly, the conventional method involves manually adding the extension to Chrome and performing the same task repeatedly. This manual repetition not only increases effort but also consumes valuable time. Therefore, to streamline this process and save both manual effort and time, we present a precise method to automate Chrome extensions and configure them seamlessly for efficient use.

How to Automate Chrome Extension:

In this article, we will learn the process of Automate Chrome extensions and performing click actions using the Selenium WebDriver and about the Robot Class in Selenium. We will examine them in the Chrome browser using Java. Here we go !!

Before moving on to the main topic of our discussion, let’s quickly review the techniques we will use to Automate Chrome extension and conduct action.

Prerequisite:

TechnologiesDownload Link
IntelliJ idea IDEhttps://www.jetbrains.com/idea/download/#section=windows
Mavenhttps://maven.apache.org/download.cgi
Java JDK – 11https://www.oracle.com/in/java/technologies/javase/jdk11-archive-downloads.html
Cucumber-java – 7.11.0https://mvnrepository.com/artifact/io.cucumber/cucumber-java/7.11.0
Cucumber-core – 7.11.0https://mvnrepository.com/artifact/io.cucumber/cucumber-core/7.11.0
Selenium-java – 4.8.0https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/4.8.0
Webdrivermanager – 5.3.0https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager/5.3.1
Mofiki’s Coordinate Finderhttps://www.softpedia.com/get/Desktop-Enhancements/Other-Desktop-Enhancements/Mofiki-s-Coordinate-Finder.shtm
Apache Maven – 3.9.0https://maven.apache.org/download.cgi

Implementation Steps to Automate Chrome Extension:

  1. Add Calculator extension to the local Chrome browser.
  2. Pack the extension and create a .crx file in File Explorer.
  3. Create a Maven project using IntelliJ IDE.
  4. Add dependencies in POM.xml file and Add .crx file in resources package.
  5. Create Packages and files in the project.
    • 5.1. Creating Features File.
    • 5.2. Creating Steps file.
    • 5.3. Creating Page Object Design Pattern.
    • 5.4. Creating TestContext File.
    • 5.5. Creating BaseStep File.
  6. Conclusion

I intend to use simplified language while articulating the concepts. So, let’s dive into the core of our topic, which is how to Automate Chrome extensions and perform click actions using Selenium.

To do this, we will follow a few rules, which I have depicted below as steps.

Step 1: Add Calculator extension to the local Chrome browser.

In this article, we are going to use the Calculator extension to Automate Chrome extension and perform an action on an extension out of the DOM element.

To add calculator extension to local Chrome browser –

After adding an extension, visit chrome://extensions/ URL from the address bar and then enable the Developer mode.

Also on this site, we can see our calculator extension which we just added.

On an extension, there could be an Extension ID. We have to note down this extension ID. In the next step, we will learn about generating a folder named extension ID in File Explorer.

In this article Extension ID is hcpbdjanfepobbkbnhmalalmfdmikmbe

Congratulations, we have completed our first step of Adding the Calculator extension to the local automate Chrome browser.

Automate Chrome Extension Img-1

Now let’s begin with the next step.

Step 2: Pack the extension and create a .crx file in File Explorer

Before continuing with the second step we will learn what a .crx file extension is.

What is a .crx file extension?

A Chrome extension file has a .crx extension. It increases the functionality of the Google Chrome web browser by allowing third-party applications to supplement its basic functionality.

Now, we will learn how to pack the calculator extension and generate a .crx file extension.

After adding the calculator extension to the local Chrome browser, the file explorer will generate a folder with the name extension ID (hcpbdjanfepobbkbnhmalalmfdmikmbe). 

Follow the provided path to locate the extension folder –

(to locate AppData we have to enable show hidden folders)
C:➜Users➜{UserName}➜AppData➜Local➜Google➜Chrome➜User➜Data➜Default➜Extensions➜hcpbdjanfepobbkbnhmalalmfdmikmbe➜1.8.2_0

In the extension folder, we will find the folder named Extension ID, which we have noted down here hcpbdjanfepobbkbnhmalalmfdmikmbe is the Extension ID for calculator extension. Open that folder.

In the folder, we can see a version folder of the extension. Open that folder ➜1.8.2_0

Now we have to copy the path as mentioned in below image –

Automate Chrome Extension Img-2

We will use this path to pack the extension in next steps.

Now, launch the Chrome browser and Visit chrome://extensions/ in the address bar

Automate Chrome Extension Img-3

Here we can see the pack extension option.

➜ Click on Pack Extension to automate chrome extension

After visiting the page we will be able to see the Pack Extension option as shown in the below image.

Automate Chrome Extension Img-4

Here we have to type or paste the path that we had copied.

➜Add copied path to the Extension root directory

In this step, we have to paste a copied path to the Extension root directory to pack our Extension and then we have to click on the Pack Extension Button.

Automate Chrome Extension Img-5

➜Copy the path of the .crx file

After clicking on the Pack Extension button a pop-up frame will appear. Here, we can see the path of the .crx file where it has been generated in File Explorer. Remember the path of the .crx file and click on the OK button.

Automate Chrome Extension Img-6

➜ Navigate to the .crx file in file explorer

Automate Chrome Extension Img-7

Now let’s navigate to the path of the .crx file as mentioned in the step above . Once we navigate to the path of the .crx file we can see the file has been generated. We have to use this .crx file in our maven project to display it in the selenium web driver and perform actions on it. 

Congratulations!! We have successfully generated a .crx file.

Step 3: Create a Maven project using Intellij IDE. 

Before creating a Maven project. Let’s understand what Maven is.

What is Maven?

Maven is a Java project management tool that the Apache Software Foundation developed. It is written in Java Language to build projects written in C#, Ruby, Scala, and other languages. It allows developers to create projects, dependencies and documentation using Project Object Model and plugins.

Why do we use Maven?

  • Maven is the latest build testing tool and a project management tool.
  • It makes the build process very easy (No need to write long scripts).
  • It has a standard directory structure which is followed.
  • It follows Convention over Configuration.
  • It has a remote maven repository with all the dependencies in one place that can be easily downloaded.
  • Can be used with other programming languages too, just not Java.

Hope, this now gives a clear view of Maven. Now let’s create a new Maven project using Intellij Idea IDE.

Open your IntelliJ IDE and go to the File New Project as shown in the below image.

Automate Chrome Extension Img-8

A new project pop-up will be displayed on the screen, and we must enter the project’s details here.

Automate Chrome Extension Img-9

Details required to create the Maven project are:

  1. Name: Provide a suitable name as per your requirement.
  2. Location: Choose the location where you want to store your project.
  3. Language: Choose the programming language as per your requirement.
  4. Build System: Here you have to choose Maven.
  5. JDK: Choose the JDK you want to use. (Note: Maven uses a set of identifiers, also called coordinates, to uniquely identify a project and specify how the project artifact should be packaged.)
  6. GroupId: a unique base name of the company or group that created the project
  7. ArtifactId: a unique name for the project.

Simply, click on the Create button and the Maven project will be created.

After successfully creating the project we can see the structure of the Maven project. Some default files have been created as given in the image below.

Automate Chrome Extension Img-10

Yes !! We have successfully created our Maven project. Let’s move ahead.

Step 4: Add dependencies in POM.xml file and Add .crx file in the resources package.

We shall include Maven dependencies in your project using IntelliJ IDEA. These dependencies need to be mentioned in our pom.xml file for our project build-up.

Below are the dependencies that we need to add to the pom.xml file.

  • selenium-java: Selenium WebDriver library for Java language binding
  • cucumber-java: Cucumber JVM library for Java language binding.
  • webdrivermanager: library to automatically manage and set up all the drivers of all browsers which are in test scope.

After adding dependencies in the pom.xml file we have to add the .crx file to the resources directory, .crx file is the file that we have generated in step 2.

To add the .crx file to the resources directory, copy the file from the file explorer and paste it into the resources directory. We can also rename the .crx file as we want. 

For renaming the file, right-click on the file ➜ select the refactor option ➜ then click on the rename option.

Chrome Extension Img-11

As shown in the above image, the rename pop-up will flash on the screen. Here we can give the file name as desired.

Here in this project, I am renaming the .crx file with the CalculatorExtension.crx file.

Step 5: Create Packages and files in the project to automate chrome extension.

After adding dependencies to the pom.xml file. We have to create a BDD framework that includes packages and files. Before moving ahead, let’s first get an overview of the Cucumber BDD framework.

What is the Cucumber Behavior Driven Development (BDD)Framework?

Cucumber is a Behavior Driven Development (BDD) framework tool for writing test cases. It is a testing tool that supports Behavior Driven Development (BDD). It offers a way to write tests that anybody can understand, regardless of their technical knowledge. In BDD, users (business analysts and product owners) first write scenarios or acceptance tests that describe the behavior of the system from the customer’s perspective. These scenarios and acceptance tests are then reviewed and approved by the product owners. The Cucumber framework uses Ruby as programming language.

To manage our code files for the project we need to create packages that are as follows: 

  • Features Package – All feature files are contained in this package.
  • Steps Package – All step definition files are included in this package.
  • Pages Package – All page files are included in this package.
  • Utilities Package – All configuration files are included in this package.

Now, we have to create a feature file,

5.1: Creating Features File: 

Features file contains a high-level description of the Test Scenario in simple language. It is known as Gherkin. Gherkin is a plain English text language

Cucumber Feature File consists of following components –

  • Feature: We use “Feature” to describe the current test script that needs execution.
  • Scenario: We use Scenario to describe the steps and expected outcome for a particular test case.
  • Given: We use “Given” to specify the context of the text to be executed. We can parameterize steps by using data tables “Given”
  • When: “When” indicates the test action that we have to perform.
  • Then: We represent the expected outcome of the test with “Then”

We need to add the below code in the feature file for our project.

According to the above feature file, we are adding two numbers. To open the Chrome WebDriver and add a calculator extension, we use a GIVEN file. With the use of ‘WHEN’ and ‘AND’ annotations, we are executing click actions on the calculator extension, with which we are adding two numbers from the calculator. In the final step, we are using the ‘THEN’ annotation to verify the result (the addition of two numbers).

5.2: Creating Steps file.

Steps Definition to automate chrome extension-

Step definition maps the Test Case Steps in the feature files (introduced by Given/When/Then) to code. It executes the steps on Application Under Test and checks the outcomes against expected results. For a step definition to execute, it requires matching the “Given” component in a Feature.

Here in the step file, we are mapping the steps from the feature file. In simple words, we are making a connection between the steps of the feature file and with step file. While mapping the steps we have to take care about the format of mapping the steps in step definition. We need to use the below format to map the steps for the feature we had created in the features file.

5.3: Creating Page Object Design Pattern

Till now we have successfully created a feature file and a step file. Now in this step, we will be creating a page file. Page file contains all the logic of the test cases. Generally, in Web automation, we have page files that contain the locators and the actions to perform on the web elements but in this framework, we are not using the locators because as we know extension is not in the DOM(Document Object Model) element as it is outside the DOM element. So we will only create the methods and for those methods, we will be using Robot class and X and Y coordinates.

Here in this code, we are performing the activities that are hovering by the mouse actions(move, press, release), clicking on the calculator extension, clicking on the two numbers from the calculator, clicking on the calculator’s “+” addition operator, and obtaining the result of the addition of those two numbers.

What is the Robot Class in Selenium?

Robot Class in Selenium is used to enable automated testing for implementations of the Java platform. It generates input events in native systems for test automation, self-running demos, and other applications where users need control over the mouse and keyboard. Selenium Webdriver was unable to handle these pop-ups or applications and extensions. So a robot class was introduced in Java versions 1.3 and above, that can handle OS pop-ups or applications and extensions.

Robots help in managing all the activities like performing the task within the specified time, handling the mouse functions and the keyboard functions, and many more

While we are using the robot class, it requires the x and y coordinates of the element of the screen on which we will be performing the actions i.e hovering the cursor and then performing click actions.To find the coordinates we are using the Mofiki’s Coordinate finder.

What is Mofiki’s Coordinate Finder?

Mofiki’s Coordinate Finder finds out the present x and y coordinates of our cursor by hovering the mouse anywhere on the screen with the help of the application Mofiki’s Coordinate Finder, which is available for free download. 

Steps to download and use Mofiki’s Coordinate Finder:-

Now to find the x and y coordinates move the cursor to the point and just press the space bar we can get the x and y coordinates

Chrome Extension Img-12

5.4: Creating TestContext File.

Now, In the Utilities package we have to create a TestContext file in which we can declare a webdriver. Declaring the webdriver as public allows initialization in every class file after inheriting the TestContext class. The step file and page file inherit the testContext class file. Also, we have declared Robot class here.

5.5: Creating BaseStep File:

This step is very important because we will be creating an environment file (i.e. Hooks file) and also we are using Chrome Options to add Calculator extensions.

Before moving ahead let’s understand about Before and After Hook and Chrome Options

What is Before and After Hooks?

Hooks allow us to better manage the code workflow and help us reduce code redundancy. We can say that it is an unseen step, which allows us to perform our scenarios or tests.

@Before – Before hooks run before the first step of each scenario.

@After – Conversely After Hooks run after the last step of each scenario even when steps fail, are undefined, pending, or skipped.

What are Chrome Options?

For managing different Chrome driver properties, Selenium WebDriver has a concept called the Chromeoptions Class. For modifying Chrome driver sessions, the Chrome options class is typically combined with Desired Capabilities. Eventually it enables you to carry out numerous tasks, such as launching Chrome in maximized mode, turning off installed extensions, turning off pop-ups, etc.

At this instant we have to create Before and After Hooks. At the same time each hook should contain a void method as shown in the below code.

In the Before Hook, we have to initialize the webdriver. Also, we have to add simple lines of code to add extensions to the webdriver. To add the extensions we are using Chrome Options to Automate Chrome Extension. Then in the After Hook, we are closing the webdriver.

Now, we have to create a Base Step which should have driver configuration and hooks

package Utilities;

Please find attached the GitHub repository link. I have uploaded the same project to this repository. I have also attached a Readme.md file that explains the framework and the different commands we have used so far in this project.

https://github.com/spurqlabs/ChromeExtensionAutomation.git

Conclusion:

It is a very difficult task to add an extension to a web driver and perform an action on extension icons. So basically, in this article, we have found a solution to add an Automate Chrome Extension to Webdriver and to perform a Click action on the extension icon apart from learning to Automate Chrome extension using the Selenium Webdriver.

The software testing landscape has evolved towards automation to meet the demands for quick and frequent deployments, adapting efficiently to constant updates and tight deadlines in a dynamic development environment.