Cypress: prueba si el elemento no existe

145

Quiero poder hacer clic en una casilla de verificación y probar que un elemento ya no está en el DOM en Cypress. ¿Alguien puede sugerir cómo lo haces?

//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.')

Quiero hacer lo contrario de la prueba anterior. Entonces, cuando hago clic de nuevo, el div con la clase no debe estar en el DOM.

Maccurt
fuente
2
Me pregunto sobre el voto
negativo
la pregunta tiene sentido para mí
Dan Carlstedt
Me doy cuenta de que esto no está relacionado con su pregunta, pero tengo mucha curiosidad. ¿Cuál fue la decisión de usar algo que solo sea compatible con Chrome y qué es lo mejor de Cypress? He estado trabajando en el proyecto de código abierto Courgette github.com/canvaspixels/courgette y me preguntaba qué características están atrayendo a todos hacia Cypress.
alexrogers
1
Me gusta el ciprés porque en su mayor parte es fácil y simplemente funciona. Tengo el problema de que solo se usa en Chrome, pero para mí puedo vivir con eso.
Maccurt
cy.get('.check-box-sub-text').contains('Some text in this div.')en algunos casos podría no funcionar (en algunos dispositivos). Puede reemplazarlo con cy.contains('.check-box-sub-text', 'Some text in this div.')él funcionará de la misma manera.
ulou

Respuestas:

183

Bueno, esto parece funcionar, así que me dice que tengo algo más que aprender sobre .should ()

cy.get('.check-box-sub-text').should('not.exist');
Maccurt
fuente
44
¡HOLA! Estoy usando prácticamente el mismo código: cy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')pero falla gety luego intenta invocar shouldvarias veces, cada una de las cuales falla ... ¿alguna idea de qué estoy haciendo mal? Gracias de antemano
volk
Lo siento, acabo de ver tu comentario, ¿tu selector está trabajando en un atributo de datos? ¿Puedes pegar tu html en los comentarios? ¡Ese selector me parece extraño!
Maccurt
@volk creo que cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exists')debería funcionar.
YingYang
8
@Maccurt, @YingYang: en realidad encontré el error, y fue un poco tonto: hay redundancia sen debería: .should('not.exists')->.should('not.exist')
volk
En lugar de should (), ¿es posible ajustar la condición anterior en el bucle if? Gracias
user2451016
24

También puede buscar un texto que se supone que no existe:

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

Aquí tienes el resultado en Cypress: 0 matched elements

ingrese la descripción de la imagen aquí

Alan
fuente
2
esto no funcionó para mí, se containsagotó el tiempo de espera y causó que la prueba fallaraCypressError: Timed out retrying: Expected to find content: 'Im not supposed to be here' but never did.
Tim Abell el
Agregué más explicaciones con un ejemplo en mi respuesta. Después de eliminar al usuario [email protected], estoy comprobando si el correo electrónico existe en algún lugar. El resultado es 0 element. ¿Qué versión de Cypress estás usando?
Alan
aplausos por la actualización. npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
Tim Abell
1
Eso está funcionando para mí ahora, en realidad no estoy seguro de lo que me perdí. Gracias por su ayuda
Tim Abell
No me funciona en Cypress 4. Parece que funciona para el elemento eliminado, no para el elemento que no debería existir en absoluto (por ejemplo, al probar la representación del lado del servidor)
Eric Burel
16
cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exist');

podría conducir a resultados falsos, ya que algunos mensajes de error se ocultan. Podría ser mejor usar

.should('not.visible');

en ese caso.

MrSmiley
fuente
2
si no existiera en el DOM, ¿no funcionaría visiblemente? Lo intentaré. ¡¡¡¡Gracias!!!!
Maccurt
2
¡Para mí fue todo lo contrario! ( should('not.exist')solucionó un error should('not.be.visible'))
Paul Melero
si no existe en el dom, not.be.visible funcionará. Si verifica los registros de cipreses, obtendrá algo como indefinido esperado que no será visible y la afirmación pasará. Entonces, en cierto modo, no ser visible en realidad cubre no existe y no es visible en una afirmación
Shiva Srinivasan
5

Esto es lo que funcionó para mí:

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

Compruebo que algunos <div data-cy="parent">no tienen imágenes adentro. Con respecto a la pregunta original, puede establecer el data-cy="something, i.e. child"atributo en los nodos internos y usar esta afirmación:

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

De acuerdo con https://docs.cypress.io/guides/references/assertions.html#Existence

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

Esto funciona para el caso de que se esté eliminando. pero en el caso de que quiera que nunca exista ... docs.cypress.io/guides/references/assertions.html#Existence Volverá a intentarlo hasta que desaparezca. Esto realmente no funciona para el problema del título, que es lo que la mayoría de la gente buscará.

Sin embargo, si quieres probar que la cosa nunca existe en nuestro caso.

// 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`);
            });
        })
Urasquirrel
fuente
1
De acuerdo, ver github.com/cypress-io/cypress/issues/7651
Eric Burel
0

También puedes usar el siguiente código

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

o

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

o

should('have.attr','minlength','2')
Rajan Domala
fuente