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.