Cipresso: verifica se l'elemento non esiste


145

Voglio essere in grado di fare clic su una casella di controllo e testare che un elemento non è più nel DOM in Cypress. Qualcuno può suggerire come lo fai?

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

Voglio fare il contrario del test sopra. Quindi, quando faccio di nuovo clic, il div con la classe non dovrebbe essere nel DOM.


2
Mi chiedo il voto
negativo

la domanda ha senso per me
Dan Carlstedt l'

Mi rendo conto che questo non è correlato alla tua domanda, ma sono davvero curioso. Qual è stata la decisione di utilizzare qualcosa che supporta solo Chrome e cosa c'è di meglio in Cypress? Ho lavorato al progetto Open-source Courgette github.com/canvaspixels/courgette e mi chiedevo quali funzioni attirassero tutti verso Cypress.
alexrogers,

1
Mi piace il cipresso perché per la maggior parte è facile e funziona. Ho il problema che viene utilizzato solo in Chrome, ma per me posso conviverci.
Maccurt,

cy.get('.check-box-sub-text').contains('Some text in this div.')in alcuni casi potrebbe non funzionare (su alcuni dispositivi). Puoi sostituirlo con cy.contains('.check-box-sub-text', 'Some text in this div.')esso funzionerà allo stesso modo.
Ulou,

Risposte:


183

Bene, questo sembra funzionare, quindi mi dice che ho ancora qualcosa da imparare su .should ()

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

4
CIAO! Sto usando praticamente lo stesso codice: cy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')ma fallisce gete poi cerca di invocare shouldpiù volte, ognuna delle quali fallisce ... hai idea di cosa sto facendo di sbagliato? Grazie in anticipo
volk,

Scusa se ho appena visto il tuo commento, il tuo selettore sta lavorando su un attributo di dati? Riesci a incollare il tuo HTML nei commenti? Quel selettore mi sembra strano!
Maccurt,

@volk Penso che cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exists')dovrebbe funzionare.
YingYang,

8
@Maccurt, @YingYang: in realtà ho trovato l'errore, ed è stato un po 'sciocco: c'è ridondante sin dovrebbe: .should('not.exists')->.should('not.exist')
volk

Invece di should () è possibile racchiudere la condizione precedente in if loop? Grazie
user2451016

24

puoi anche cercare un testo che non dovrebbe esistere:

cy.contains('test_invite_member@gmail.com').should('not.exist')

Ecco il risultato in Cypress: 0 matched elements

inserisci qui la descrizione dell'immagine


2
questo non ha funzionato per me, il containstimeout e ha causato il fallimento del testCypressError: Timed out retrying: Expected to find content: 'Im not supposed to be here' but never did.
Tim Abell,

Ho aggiunto più spiegazioni con un esempio nella mia risposta. Dopo aver eliminato l'utente test_invite_member@gmail.com, sto controllando se l'e-mail esiste da qualche parte. il risultato è 0 element. Quale versione di Cypress stai usando?
Alan,

saluti per l'aggiornamento. npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
Tim Abell,

1
Ora funziona per me, in realtà non sono sicuro di cosa mi sono perso. Grazie per l'aiuto
Tim Abell,

Non funziona per me in Cypress 4. Sembra funzionare per l'elemento rimosso, non per l'elemento che non dovrebbe esistere affatto (ad esempio durante il test del rendering lato server)
Eric Burel

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

potrebbe portare ad alcuni risultati falsi, poiché alcuni messaggi di errore vengono nascosti. Potrebbe essere meglio usare

.should('not.visible');

in quel caso.


2
se non esistesse nel DOM non funzionerebbe. Lo proverò. Grazie!!!!
Maccurt,

2
Per me è stato esattamente il contrario! ( should('not.exist')corretto un errore should('not.be.visible'))
Paul Melero,

se non esiste nel dom allora not.be.visible funzionerà. Se controlli i registri di cipressi otterrai qualcosa come previsto indefinito per non essere visibile e l'asserzione passerà. Quindi, in un modo non visibile, in realtà le coperture non esistono e non sono visibili in un'asserzione
Shiva Srinivasan,

5

Ecco cosa ha funzionato per me:

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

Controllo che alcuni <div data-cy="parent">non abbiano immagini all'interno. Per quanto riguarda la domanda originale, puoi impostare l' data-cy="something, i.e. child"attributo sui nodi interni e usare questa affermazione:

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

3

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

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

Questo funziona nel caso in cui venga rimosso. ma nel caso in cui si desideri che non esista mai ... docs.cypress.io/guides/references/assertions.html#Existence Riprova fino a quando non scompare. Questo non funziona davvero per il problema del titolo, che è quello che la maggior parte delle persone cercherà.

Tuttavia, se vuoi provare che la cosa non esiste mai nel nostro 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`);
            });
        })


0

Puoi anche usare il codice qui sotto

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

o

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

o

should('have.attr','minlength','2')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.