image

Test automation with cypress

Cypress is an Open-Source, end-to-end automation testing framework for web application testing. It is completely written in JavaScript, the primary language used by front-end web developers. This allows testers to create powerful and robust web application tests. Unlike any other testing tool, it is browser-based test runners. In this blog let’s see the general outlook of Cypress testing, its advantages, challenges, cheat sheet, etc.,

 

Why Cypress Framework:

 

Most of the testing tools execute remote commands outside the browser. But Cypress is a web-based test runner, and it is performed in the same run loop as the application does. So, it gives end-user experience to both tester and developer.

Setting up Cypress is just a piece of cake, and no additional download is required, it makes test-driven development a reality for end-to-end testing. Cypress framework is not only for end-to-end testing, but also great for the Integration test, Unit test for Isolates Complement, JavaScript Business Logic, and others. Cypress is powered by a Node server process. Cypress and the Node process continuously communicate, synchronize, and do tasks on each other’s behalf. Having access to both the front and back ends allows responding to application events in real-time.

Advantages of Cypress Framework

 

Cypress is written with JavaScript and based on Mocha and Chai. Nowadays, most of the web application front end is written in JavaScript and Cypress tests also written in JavaScript. That makes Cypress more user-friendly for both developers and testers.

While using other automation testing tools, the Tester needed to select all Dependencies and Libraries before the test started. But dependencies and libraries are already present in Cypress and no additional setup is required. Cypress has Network Traffic Control features that help to test edge case scenarios without server involvement.

Cypress operates at the speed of the browser’s ability to render content. So, all the tests will run in real-time.

Cypress is used by both developers and Test engineers. So, debugging can be done directly from the browser developer tools, which makes debugging lightning fast.

Cypress Automation runs from the command line or using the CI/CD tool and it records and takes a screenshot of every test. That makes Cypress tell the reason for failure and makes debugging easier.

Cypress automatically waits for async events (Page Loading), so no need to add sleepers in the test code. If we need sleepers, we can add timers as required. Cypress has its own API for developing custom commands and overwriting existing commands.

Cypress makes HTTP requests on behalf of the web application as it is executing and it was built of Mocha JS which includes a large set of APIs for utilizing browser-specific commands such as setting viewport, clearing cookies, basic browsing commands, etc.,

Cypress gives the advantages of using APP Actions an alternative to Page object Model, still we can use Page object Model as well. 

Challenges in Cypress Framework

 

Cypress only supports JavaScript Languages. Testers with JavaScript knowledge can create tests.

Cypress only supports Chrome, Firefox, Edge, Brave, and Electron browsers. Currently, tests cannot be run in Safari and IE browsers.

It doesn’t provide support for multi-tabs. Tests will run on a single window/tab. Cypress restricts to use of multiple browsers at the same time.

Cypress doesn’t support remote execution.

The Cypress test is valid for domains with the same origin. If logging in a user requires authentication from a third party. Since cypress has limitations, it can be used to subvert and test third-party login sites by interacting with the third-party authentication API programmatically.

 

Cypress Visual Testing

 

In Cypress Visual Testing layout of the application is tested to verify it looks and works as it was designed. Cypress does not have visual testing in the framework, so plugins and third-party tools are used. Several Open-Source plugins were available on the Cypress website for Visual UI tests such as Applitools, Percy, Happo, etc., Plugin will be selected based on Project needs. After UI Bugs are fixed Visual Regression test will be conducted to check the application looks as it should.

Cypress Cheat Sheet:

 

Installation commands  
npm init -y Create a project folder and then start with npm initializer
npm install cypress –save-dev Installing cypress via npm
npx cypress open Open cypress app from project root
Cypress events on element  
cy.visit(url) Go to the URL
cy.get(selector) Get one or more DOM element
cy.get(ele).click() Click on an element
cy.get(ele).dblclick() Double click on an element
cy.get(ele).rightclick() Right click on an element
cy.get(ele).type(“foobar”) Type “foobar” into input element
cy.get(ele).clear() Clear all text from input element
cy.get(ele).check(values) Checked matched value of checkbox or radio
cy.get(ele).uncheck(values) Unchecked matched value of checkbox or radio
cy.get(ele).focus() Focus on an element
cy.get(ele).blur() Blur the focused element
cy.get(ele).submit() It requires the element to be a form. And it submits a form.
cy.get(ele).trigger(”click”) Trigger any DOM event like mousemove, mouseup, mousedown, mouseover
cy.get(ele).select(value) Select matched option from a dropdown menu
cy.writeFile(filePath, contents) Write to a file with the specified contents
cy.wait(time) Wait for a number of milliseconds
cy.wait(alias,time) Wait for a number of milliseconds for an aliased resource to resolve
cy.url() Yields current URL as string
cy.get(ele).then(($data) => {}) To work with the subject yielded from the previous command
cy.get(ele).shadow() Traverse into the shadow DOM of an element
cy.get(ele).selectFile(filePath) Selects a file or files in input element or simulates dragging a file or files into the browser
cy.get(ele).select(value) Selects a matched value from “Select” element
cy.get(‘ele’).scrollIntoView() Scrolls to the element to view
cy.request(method, url, body) It makes an HTTP request
cy.reload() Reloads the current page
cy.log(data) Print a message to the Cypress Command Log
cy.get(ele).last() It yields the last element
cy.intercept(method, url) Spy and stub network requests and responses
cy.get(ele).first() Get the first DOM element
cy.get(ele).find(‘foo’) Find the descendent DOM elements of a specific selector
cy.get(ele).children(selector) Find the child element of specific DOM element
Cypress Hooks  
it.describe(“Test label”,()=>{ Test code }) It group and label the tests
before(function () { // … }); Runs once before the first test in this block
after(function () { // }); Runs once after the last test in this block
beforeEach(function () { // … }); Runs before each test in this block
afterEach(function () { //… }); Runs after each test in this block
    
Cypress run commands via CLI  
npx cypress run Runs all spec files
npx cypress run –spec ‘test file path’ Runs a specific spec file
npx cypress run –browser chrome Run Cypress in the specified browser
npx cypress run –env “variable” Specify environment variables
npx cypress run –group Group recorded tests together under a single run
npx cypress run –headed Displays the browser instead of running headless
npx cypress run –headless Hide the browser instead of running headed (default during cypress run)
npx cypress run –key, -k Specify your secret record key
npx cypress run –parallel Run recorded specs in parallel across multiple machines
npx cypress run –record Whether to record the test run
npx cypress run –reporter html Specify a Mocha reporter as html or json
Cypress run from windows  
npx cypress open Cypress app will launch and click on the test file name which test we want to run
Cypress assertions  
cy.get(ele).should(‘have.class’,value) Check element has a specific class
cy.get(ele).should(‘have.css’,value) Check element has a specific CSS style
cy.get(ele).should(‘be.visible’) Check element is visible
cy.get(ele).should(‘not.be.visible’) Check element is not visible
cy.get(ele).should(‘not.exist’) Check element is not exists in the DOM
cy.get(ele).should(‘exist’) Check element is exists in the DOM
cy.get(ele).should(‘have.length’,value) Check the length is matching to elements count
cy.get(ele).should(‘have.value’,value) Checks value of input field
cy.get(ele).should(‘be.checked’) Checks for state of radio or checkbox
cy.get(ele).should(‘contains’,value) Checks the value contains the string
expect(name).to.not.equal(‘Jane’) Compare the strings
expect(ele).to.have.attr(attributeName,value) Element should have the given attribute value
expect(ele).to.have.text(‘I love testing’) Element should have the given text
expect(ele).to.be.hidden Element should be hidden
expect(ele).not.to.be.empty String or Array should not be empty
expect(ele).to.have.css(cssAttribute,value) Element should have the mentioned css value
Error Handling for the element  
1. The queryselector check the element length. 2. If there is an element in the DOM it returns true and we can do the actions on element. 3. If element is not exist on the DOM it prints the log content. It doesn’t fail the test and keep the test executing it.only(‘Error handling’, () => { cy.visit(URL) cy.document().then(($document) => { const documentResult = $document.querySelectorAll(selector) if (documentResult.length) { //if the element length is greter than 0 it returns true // Do something } else { cy.log(“element not exist”); } }) })
 

Conclusion

 

Cypress is a cutting-edge framework for automation testing with expanding capabilities. It makes it simple and efficient for testers to set up, write, run, and debug tests. For end-to-end testing, Cypress is the best option.