Cypress: Sprawdź, czy element nie istnieje


145

Chcę móc kliknąć pole wyboru i sprawdzić, czy element nie znajduje się już w DOM w Cypress. Czy ktoś może zasugerować, jak to robisz?

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

Chcę zrobić odwrotność powyższego testu. Więc kiedy kliknę go ponownie, div z klasą nie powinien znajdować się w DOM.


2
Zastanawiam się nad głosowaniem
negatywnym

pytanie ma dla mnie sens
Dan Carlstedt

Zdaję sobie sprawę, że to nie jest związane z twoim pytaniem, ale jestem naprawdę ciekawa. Jaka była decyzja o użyciu czegoś, co tylko obsługuje Chrome i co jest o wiele lepszego w Cypress? Pracowałem nad projektem Open-source Courgette github.com/canvaspixels/courgette i zastanawiałem się, jakie funkcje przyciągają wszystkich do Cypress.
alexrogers

1
Lubię cyprys, ponieważ w większości jest łatwy i po prostu działa. Mam problem z używaniem go tylko w Chrome, ale dla mnie mogę z tym żyć.
Maccurt

cy.get('.check-box-sub-text').contains('Some text in this div.')w niektórych przypadkach może nie działać (na niektórych urządzeniach). Możesz go zastąpić, cy.contains('.check-box-sub-text', 'Some text in this div.')będzie działał w ten sam sposób.
ulou

Odpowiedzi:


183

Wydaje się, że to działa, więc mówi mi, że muszę dowiedzieć się więcej o. Powinien ()

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

4
CZEŚĆ! Używam prawie tego samego kodu: cy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')ale kończy się niepowodzeniem, geta następnie próbuje wywołać shouldkilka razy, z których każdy kończy się niepowodzeniem ... Masz pojęcie, co robię źle? Z góry
dziękuję

Przepraszam, że właśnie zobaczyłem Twój komentarz, czy Twój selektor działa na atrybucie danych? Czy możesz wkleić swój html w komentarzach? Ten selektor wygląda dla mnie dziwnie!
Maccurt

@volk Myślę, że cy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exists')powinno działać.
YingYang

8
@Maccurt, @YingYang: właściwie znalazłem błąd i to było trochę głupie: jest zbędne sw: .should('not.exists')->.should('not.exist')
volk

Czy zamiast powinien () można zawinąć powyższy warunek w pętlę if? Dzięki
user2451016

24

możesz również wyszukać tekst, który nie powinien istnieć:

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

Tutaj masz wynik w Cypress: 0 matched elements

wprowadź opis obrazu tutaj


2
to nie zadziałało dla mnie, containsupłynął limit czasu i spowodował niepowodzenie testuCypressError: Timed out retrying: Expected to find content: 'Im not supposed to be here' but never did.
Tim Abell

Dodałem więcej wyjaśnień z przykładem w mojej odpowiedzi. Po usunięciu użytkownika test_invite_member@gmail.comsprawdzam, czy e-mail gdzieś istnieje. wynik jest 0 element. Jakiej wersji Cypress używasz?
Alan

okrzyki za aktualizację. npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
Tim Abell

1
To działa teraz dla mnie, właściwie nie jestem pewien, co przegapiłem. Dziękuję za pomoc
Tim Abell

Nie działa dla mnie w Cypress 4. Wygląda na to, że działa dla usuniętego elementu, a nie elementu, który w ogóle nie powinien istnieć (np. Podczas testowania renderowania po stronie serwera)
Eric Burel

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

może prowadzić do fałszywych wyników, ponieważ niektóre komunikaty o błędach są ukrywane. Może lepiej użyć

.should('not.visible');

w tym wypadku.


2
gdyby nie istniało w DOM, nie działałoby. visible? Spróbuję to. Dzięki!!!!
Maccurt

2
Dla mnie było zupełnie odwrotnie! ( should('not.exist')naprawiono błąd should('not.be.visible'))
Paul Melero

jeśli nie istnieje w dom, to not.be.visible zadziała. Jeśli sprawdzisz dzienniki cyprysów, otrzymasz coś takiego, jak oczekiwany undefined, aby nie był widoczny, a asercja przejdzie. Tak więc w pewien sposób niewidoczne okładki nie istnieją i nie są widoczne w jednym stwierdzeniu
Shiva Srinivasan,

5

Oto, co zadziałało dla mnie:

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

Sprawdzam, czy w niektórych <div data-cy="parent">nie ma obrazów. Jeśli chodzi o oryginalne pytanie, możesz ustawić data-cy="something, i.e. child"atrybut na węzłach wewnętrznych i użyć tego stwierdzenia:

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

3

Według https://docs.cypress.io/guides/references/assertions.html#Existence

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

Działa to w przypadku, gdy jest usuwany. ale w przypadku, gdy chcesz, aby nigdy nie istniał ... docs.cypress.io/guides/references/assertions.html#Existence Będzie ponawiać próbę, dopóki nie zniknie. To naprawdę nie działa w przypadku problemu z tytułem, którego większość ludzi będzie szukała.

Jeśli jednak chcesz sprawdzić, czy w naszym przypadku coś takiego nigdy nie istnieje.

// 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

Możesz również użyć poniższego kodu

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

lub

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

lub

should('have.attr','minlength','2')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.