It is critical to know that Cypress does not support the handling of new browser tabs and windows out of the box, as stated on their permanent trade-offs page. However, as the framework has grown, there are now many workarounds that can be leveraged to fulfil these goals. In this article, we will take a deep dive into how to open new windows in Cypress.
Step 1
Create a new folder titled “Integration”, create two new files in the folder titled spec.js and spy-before-load.js. In your spec.js file, copy and paste the following code:
reference types="cypress" />
describe('window open', function () {
it('opens a new window with page1', function () {
// window.open is called on click
// thus we can create method stub after the cy.visit
// but before cy.click
cy.visit('/index.html')
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen')
})
cy.get('#open-window').click()
cy.get('@windowOpen').should('be.calledWith', 'page1.html')
})
})spec.js stubs the window.open method using cy.stub(). Because the application executes window.open after the click, we create the method stub after cy.visit
In your spy-before-load.js file, copy and paste the following code:
<reference types="cypress" />
describe('application', function () {
beforeEach(function () {
// application prints "hello" to the console
// during the page load, thus we need to create
// our spy as soon as the window object is created but
// before the page loads
cy.visit('/index.html', {
onBeforeLoad (win) {
cy.spy(win.console, 'log').as('console.log')
},
})
})
it('prints hello on load', function () {
cy.get('@console.log').should('be.calledWith', 'hello')
})
})spy-before-load.js starts spying on console.log during cy.visit to confirm that console.log(‘hello’) is called when the page loads.
Step 2
Using cy.spy() for a window.open event, write a test to ensure that while executing the action in your program, the window.open event is called.
cy.visit('http://localhost:3000', {
onBeforeLoad(win) {
cy.stub(win, 'open')
}
})
// Do the action in your app like cy.get('.open-window-btn').click()
cy.window().its('open').should('be.called'Step 3
Use cy.visit() in a new test to navigate to the URL already opened in the new window, then fill in the fields and click the buttons as you would in a Cypress test.
cy.visit('http://localhost:3000/new-window')