cypress tips and tricks i've found
Instead of cycling windows, i found it was more helpful to create a page with iframes in it, and then target/enter/exit the iframes as needed
so i would have one frame represent a user visiting one page,
and then a second frame representing a user visiting another page, maybe sending websocket events for example,
then going back to the first frame, to see if the event was sent and that the page updated
shoutout to https://www.npmjs.com/package/cypress-iframe which is similar, but not quite the same
download frame_helpers.js to your /cypress/support/ folder
import 'frame_helpers' or require('frame_helpers') in the support/index.js file
cy.frameEnter(selector)
- switch current context to a iframe elementcy.frameExit()
- go back to base page context which contains the iframescy.frameVisit(selector,url)
- make frame visit a urlcy.frameReload(selector)
- reload the framecy.frameResize(selector,width,height)
- resize the frame to test responsive changesSee tab-helpers.js. Just add it to your support/commands.js
file
They're really popup-windows or child-windows, but i call them tabs for api brevity
see https://github.com/jakedowns/CypressHelpers/blob/master/tab_window_switching_test.cy.js for example usage
cy.openTab(url, opts)
cy.tabVisit(url, window_name)
cy.switchToTab(tab_name)
cy.closeTab(index_or_name)
- pass nothing to close active tabcy.closeAllTabs()
cy.visit
added support for options.tab_name
(defaults to root
)If you're like me, when you first started using Cypress you fell in love immedately but then were annoyed by some of their opinionated descisions. For example: not supporting switching between "tabs" or pop-up windows. Luckily, vp of eng of Cypress, @bahmutov posted on his peronal Blog and Github repo about frame-busting and "Cypress using child window":
cypress-open-child-window
Repo
Here is how i've expanded upon that original concept with some convience helpers to keep my tests readable when testing multiple windows:
Note: this only works if you're within the same "baseDomain":
OK:
base.domain/pageA
sub.base.domain/pageB
NOT OK:
some.otherdomain/pageC