Cypress: Test if element does not exist

JavascriptCypress

Javascript Problem Overview


I want to be able to click on a check box and test that an element is no longer in the DOM in Cypress. Can someone suggest how you do it?

//This is the Test when the check box is clicked and the element is there
cy.get('[type="checkbox"]').click();
cy.get('.check-box-sub-text').contains('Some text in this div.')

I want to do the opposite of the test above. So when I click it again the div with the class should not be in the DOM.

Javascript Solutions


Solution 1 - Javascript

Well this seems to work, so it tells me I have some more to learn about .should()

cy.get('.check-box-sub-text').should('not.exist');

Solution 2 - Javascript

you can also search a for a text which is not supposed to exist:

cy.contains('[email protected]').should('not.exist')

Here you have the result in Cypress: 0 matched elements

enter image description here

documentation: https://docs.cypress.io/guides/references/assertions.html#Existence

Solution 3 - Javascript

Cypress 6.x+ Migration

Use .should('not.exist') to assert that an element does not exist in the DOM.


Do not use not.visible assertion. It would falsely pass in < 6.0, but properly fail now:

// for element that was removed from the DOM
// assertions below pass in < 6.0, but properly fail in 6.0+
.should('not.be.visible')
.should('not.contain', 'Text')

Migration Docs here: Migrating-to-Cypress-6-0

Solution 4 - Javascript

Cypress 6.x+ Migration

According to cypress docs on Existence

The very popular attempt which is a bit naive will work until it doesn't and then you'll have to rewrite it again... and again...

// retry until loading spinner no longer exists
cy.get('#loading').should('not.exist')

This doesn't really work for the title problem which is what most people will be looking for.

This works for the case that it is being removed. but in the case that you want it to never exist... It will retry until it goes away.

However, if you want to test that the element never exists in our case.

>Yes lol. This is what you really want unless you want to just have your headache again another day.

// Goes through all the like elements, and says this object doesn't exist ever
cy.get(`img[src]`)
  .then(($imageSection) => {
    $imageSection.map((x, i) => { expect($imageSection[x].getAttribute('src')).to.not.equal(`${Cypress.config().baseUrl}/assets/images/imageName.jpg`) });
})

Solution 5 - Javascript

cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exist');

might lead to some false results, as some error messages get hidden. It might be better to use

.should('not.visible');

in that case.

Solution 6 - Javascript

Here's what worked for me:

cy.get('[data-cy=parent]').should('not.have.descendants', 'img')

I check that some <div data-cy="parent"> has no images inside. Regarding original question, you can set data-cy="something, i.e. child" attribute on inner nodes and use this assertion:

cy.get('[data-cy=parent]').should('not.have.descendants', '[data-cy=child]')

Solution 7 - Javascript

You can use get and contains together to differentiate HTML elements as well.

<button type='button'>Text 1</button>
<button type='button'>Text 2</button>

Let's say you have 2 buttons with different texts and you want to check if the first button doesn't exist then you can use;

cy.get('button').contains('Text 1').should('not.exist')

Solution 8 - Javascript

Could be done also using jQuery mode in cypress:

assert(Cypress.$('.check-box-sub-text').length==0)

Solution 9 - Javascript

I closed an element and checked should('not.exist') but the assertion failed as it existed in the DOM. It just that it is not visible anymore.

In such cases, should('not.visible') worked for me. I have just started using cypress. A lot to learn.

Solution 10 - Javascript

> No try-catch flow in cypress

In java-selenium, we usually add the NoSuchElementException and do our cases. if UI is not displaying element for some Role based access cases.

Solution 11 - Javascript

You can also use below code

expect(opportunitynametext.include("Addon")).to.be.false

or

should('be.not.be.visible')

or

should('have.attr','minlength','2')

Solution 12 - Javascript

In my case, Cypress was so fast, that simple .should('not.be.visible') was passing the test and after that, loader appears and test failed.

I've manage to success with this:

cy.get('.loader__wrapper')
  .should('be.visible')
cy.get('.loader__wrapper', { timeout: 10000 })
  .should('not.be.visible')

Also nice to set the timeout on 10 seconds when your application loads more than 4s.

Solution 13 - Javascript

I would use :

cy.get('.check-box-sub-text').should('not.be.visible');

This is safer than

cy.get('.check-box-sub-text').should('not.exist');

( The element can be present in the DOM but not visible with display: none or opacity: 0 )

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMaccurtView Question on Stackoverflow
Solution 1 - JavascriptMaccurtView Answer on Stackoverflow
Solution 2 - JavascriptAlanView Answer on Stackoverflow
Solution 3 - Javascriptt_dom93View Answer on Stackoverflow
Solution 4 - JavascriptUrasquirrelView Answer on Stackoverflow
Solution 5 - JavascriptMrSmileyView Answer on Stackoverflow
Solution 6 - JavascriptMikhail VasinView Answer on Stackoverflow
Solution 7 - Javascriptuser11898240View Answer on Stackoverflow
Solution 8 - JavascriptFseeeView Answer on Stackoverflow
Solution 9 - JavascriptsakibdrohoView Answer on Stackoverflow
Solution 10 - JavascriptJayanth BalaView Answer on Stackoverflow
Solution 11 - JavascriptRajan DomalaView Answer on Stackoverflow
Solution 12 - JavascriptSławek SkrzypczakView Answer on Stackoverflow
Solution 13 - JavascriptMarco AmatoView Answer on Stackoverflow