Cypress: ทดสอบว่าไม่มีองค์ประกอบหรือไม่


145

ฉันต้องการที่จะสามารถคลิกที่กล่องกาเครื่องหมายและทดสอบว่าองค์ประกอบไม่ได้อยู่ใน DOM ใน Cypress อีกต่อไป ใครช่วยแนะนำวิธีการทำ

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

ฉันต้องการทำสิ่งที่ตรงกันข้ามกับการทดสอบข้างต้น ดังนั้นเมื่อฉันคลิกอีกครั้ง div ที่มีคลาสไม่ควรอยู่ใน DOM


2
ฉันสงสัยเกี่ยวกับการโหวตลง
Maccurt

คำถามนี้สมเหตุสมผลสำหรับฉัน
Dan Carlstedt

ฉันรู้ว่าสิ่งนี้ไม่เกี่ยวข้องกับคำถามของคุณ แต่ฉันอยากรู้จริงๆ อะไรคือการตัดสินใจใช้สิ่งที่รองรับ Chrome และอะไรที่ดีกว่าเกี่ยวกับ Cypress? ฉันทำงานในโครงการโอเพ่นซอร์ส Courgette github.com/canvaspixels/courgetteและรู้สึกสงสัยว่าคุณลักษณะใดที่ทุกคนมีต่อ Cypress
alexrogers

1
ฉันชอบไซเปรสเพราะส่วนใหญ่มันง่ายและได้ผล ฉันได้รับปัญหาเกี่ยวกับการใช้งานใน Chrome เท่านั้น แต่สำหรับฉันฉันสามารถอยู่กับสิ่งนั้นได้
Maccurt

cy.get('.check-box-sub-text').contains('Some text in this div.')ในบางกรณีอาจไม่ทำงาน (ในอุปกรณ์บางรุ่น) คุณสามารถแทนที่ด้วยcy.contains('.check-box-sub-text', 'Some text in this div.')มันจะทำงานในลักษณะเดียวกัน
ulou

คำตอบ:


183

ดูเหมือนว่าจะได้ผลดังนั้นจึงบอกว่าฉันมีข้อมูลเพิ่มเติมที่จะเรียนรู้เกี่ยวกับ. ควร ()

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

4
HI! ฉันใช้รหัสเดียวกันค่อนข้างมากcy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')แต่มันล้มเหลวgetและพยายามเรียกใช้shouldหลายครั้งซึ่งแต่ละครั้งล้มเหลว ... ฉันคิดว่าฉันทำอะไรผิดหรือเปล่า? ขอบคุณล่วงหน้า
volk

ขอโทษค่ะฉันเพิ่งเห็นความคิดเห็นของคุณตัวเลือกของคุณทำงานกับแอตทริบิวต์ข้อมูลหรือไม่ คุณสามารถวาง html ของคุณในความคิดเห็นได้หรือไม่? ตัวเลือกนั้นดูแปลกสำหรับฉัน!
Maccurt

@volk ฉันคิดว่าcy.get('[data-e2e="create-entity-field-relation-contact-name"]').should('not.exists')ควรจะทำงาน
YingYang

8
@Maccurt, @YingYang: จริงๆแล้วฉันพบข้อผิดพลาดและมันก็โง่มาก: มีความซ้ำซ้อนsในควร: .should('not.exists')->.should('not.exist')
volk

แทนควร () เป็นไปได้ไหมที่จะรวมเงื่อนไขด้านบนใน if loop? ขอบคุณ
user2451016

24

คุณยังสามารถค้นหาข้อความที่ไม่ควรมีอยู่:

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

ที่นี่คุณจะได้ผลลัพธ์ใน Cypress: 0 matched elements

ป้อนคำอธิบายภาพที่นี่


2
สิ่งนี้ไม่ได้ผลสำหรับฉันcontainsหมดเวลาและทำให้การทดสอบล้มเหลวCypressError: Timed out retrying: Expected to find content: 'Im not supposed to be here' but never did.
Tim Abell

ฉันเพิ่มคำอธิบายเพิ่มเติมพร้อมตัวอย่างในคำตอบของฉัน หลังจากลบผู้ใช้test_invite_member@gmail.comแล้วฉันจะตรวจสอบว่ามีอีเมลอยู่ที่ไหน 0 elementผลที่ได้คือ คุณใช้ Cypress รุ่นอะไร
Alan

ไชโยสำหรับการอัปเดต npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
Tim Abell

1
ตอนนี้ใช้ได้ผลสำหรับฉันจริงๆแล้วฉันไม่แน่ใจว่าฉันพลาดอะไรไป ขอบคุณสำหรับความช่วยเหลือ
Tim Abell

ไม่ทำงานสำหรับฉันใน Cypress 4 ดูเหมือนว่าจะใช้งานได้กับองค์ประกอบที่ถูกลบไม่ใช่องค์ประกอบที่ไม่ควรมีอยู่เลย (เช่นเมื่อทดสอบการแสดงผลฝั่งเซิร์ฟเวอร์)
Eric Burel

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

อาจนำไปสู่ผลลัพธ์ที่ผิดพลาดเนื่องจากข้อความแสดงข้อผิดพลาดบางส่วนถูกซ่อนไว้ มันอาจจะดีกว่าที่จะใช้

.should('not.visible');

ในกรณีนั้น.


2
หากไม่มีอยู่ใน DOM จะไม่ทำงานที่มองไม่เห็น? ฉันจะลองดู ขอบคุณ !!!!
Maccurt

2
สำหรับฉันมันค่อนข้างตรงกันข้าม! ( should('not.exist')แก้ไขผิดshould('not.be.visible'))
Paul Melero

หากไม่มีอยู่ใน dom แสดงว่า not.be.visible จะใช้งานได้ หากคุณตรวจสอบบันทึกของไซเปรสคุณจะได้รับสิ่งที่คาดว่าจะไม่ถูกกำหนดว่ามองไม่เห็นและการยืนยันจะผ่านไป ดังนั้นในทางที่มองไม่เห็นจึงไม่มีอยู่จริงและไม่สามารถมองเห็นได้ในการยืนยันเพียงครั้งเดียว
Shiva Srinivasan

5

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

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

ฉันตรวจสอบว่าบาง<div data-cy="parent">ภาพไม่มีภาพภายใน สำหรับคำถามเดิมคุณสามารถตั้งค่าdata-cy="something, i.e. child"แอตทริบิวต์บนโหนดภายในและใช้การยืนยันนี้:

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

3

อ้างอิงจากhttps://docs.cypress.io/guides/references/assertions.html#Existence

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

วิธีนี้ใช้ได้กับกรณีที่กำลังถูกลบออก แต่ในกรณีที่คุณไม่ต้องการให้มันไม่มีอยู่จริง ... docs.cypress.io/guides/references/assertions.html#Existence มันจะลองอีกครั้งจนกว่าจะหายไป สิ่งนี้ใช้ไม่ได้กับปัญหาเรื่องชื่อซึ่งเป็นสิ่งที่คนส่วนใหญ่มองหา

อย่างไรก็ตามหากคุณต้องการทดสอบว่าสิ่งนั้นไม่เคยมีอยู่ในกรณีของเรา

// 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`);
            });
        })

1
เห็นด้วยดูที่github.com/cypress-io/cypress/issues/7651
Eric Burel

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.