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.

Maccurt
fonte
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');
Maccurt
fonte
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('[email protected]').should('not.exist')

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

insira a descrição da imagem aqui

Alan
fonte
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 [email protected], 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.

MrSmiley
fonte
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]')
Mikhail Vasin
fonte
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`);
            });
        })
Urasquirrel
fonte
1
Concordo, consulte github.com/cypress-io/cypress/issues/7651
Eric Burel
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')
Rajan Domala
fonte