Cypress: teste se o elemento não existe


145

Quero poder clicar em uma caixa de seleção e testar se um elemento não está mais no DOM no Cypress. Alguém pode sugerir como você faz isso?

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

Eu quero fazer o oposto do teste acima. Então, quando eu clico novamente, o div com a classe não deve estar no DOM.


2
Gostaria de saber sobre o voto
negativo

a pergunta faz sentido para mim
Dan Carlstedt

Sei que isso não está relacionado à sua pergunta, mas estou realmente curioso. Qual foi a decisão de usar algo que apenas suporta o Chrome e o que há de melhor no Cypress? Eu estive trabalhando no projeto de código aberto Courgette github.com/canvaspixels/courgette e queria saber quais recursos estão atraindo todos para o Cypress.
Alexrogers11

1
Eu gosto de cipreste porque na maioria das vezes é fácil e simplesmente funciona. O problema é que ele é usado apenas no Chrome, mas para mim eu posso viver com isso.
Maccurt 11/11/19

cy.get('.check-box-sub-text').contains('Some text in this div.')em alguns casos, pode não funcionar (em alguns dispositivos). Você pode substituí-lo por cy.contains('.check-box-sub-text', 'Some text in this div.')isso funcionará da mesma maneira.
ulou

Respostas:


183

Bem, isso parece funcionar, por isso me diz que tenho mais a aprender sobre .should ()

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

4
OI! Estou usando praticamente o mesmo código: cy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')mas ele falha gete tenta invocar shouldvárias vezes, cada uma das quais falha ... alguma idéia do que estou fazendo de errado? Agradecemos antecipadamente
volk

Desculpe, acabei de ver seu comentário. Seu seletor está trabalhando em um atributo de dados? Você pode colar seu html nos comentários? Esse seletor parece estranho para mim!
Maccurt 8/11

@ volk acho que cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exists')deve funcionar.
YingYang

8
@ Maccurt, @ YingYang: na verdade, eu encontrei o erro, e foi meio bobo: há redundância sem deveria: .should('not.exists')->.should('not.exist')
volk

Em vez de should (), é possível agrupar a condição acima no loop if? Graças
user2451016

23

você também pode procurar por um texto que não deveria existir:

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

Aqui você tem o resultado no Cypress: 0 matched elements

insira a descrição da imagem aqui


2
Isto não funcionou para mim, o containstempo limite e causou falha no testeCypressError: Timed out retrying: Expected to find content: 'Im not supposed to be here' but never did.
Tim Abell

Eu adicionei mais explicações com um exemplo na minha resposta. Depois de excluir o usuário test_invite_member@gmail.com, estou verificando se o email existe em algum lugar. o resultado é 0 element. Qual versão do Cypress você está usando?
Alan

aplausos para a atualização. npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
Tim Abell

1
Isso está funcionando para mim agora, na verdade não tenho certeza do que perdi. Obrigado pela ajuda.
Tim Abell

Não funciona para mim no Cypress 4. Parece funcionar para o elemento removido, não para o elemento que não deveria existir (por exemplo, ao testar a renderização no lado do servidor)
Eric Burel

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

pode levar a alguns resultados falsos, pois algumas mensagens de erro ficam ocultas. Pode ser melhor usar

.should('not.visible');

nesse caso.


2
se ele não existisse no DOM, não funcionaria. Eu vou experimentar. Obrigado!!!!
Maccurt

2
Para mim, era exatamente o contrário! ( should('not.exist')Fixa um errado should('not.be.visible'))
Paul Melero

se não existir no domínio, então not.be.visible funcionará. Se você verificar os logs do cipreste, obterá algo como o esperado indefinido para não ser visível e a afirmação será aprovada. Portanto, de uma maneira que não seja visível, na verdade as capas não existem e não são visíveis em uma afirmação
Shiva Srinivasan

5

Aqui está o que funcionou para mim:

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

Verifico que alguns <div data-cy="parent">não têm imagens dentro. Em relação à pergunta original, você pode definir o data-cy="something, i.e. child"atributo nos nós internos e usar esta asserção:

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

3

De acordo com https://docs.cypress.io/guides/references/assertions.html#Existence

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

Isso funciona para o caso em que está sendo removido. mas no caso de você desejar que ele nunca exista ... docs.cypress.io/guides/references/assertions.html#Existence Ele tentará novamente até que desapareça. Isso realmente não funciona para o problema do título, que é o que a maioria das pessoas estará procurando.

No entanto, se você quiser testar se a coisa nunca existe no nosso 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

Você também pode usar o código abaixo

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

ou

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

ou

should('have.attr','minlength','2')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.