赛普拉斯:测试元素是否不存在


145

我希望能够单击一个复选框,并测试Cypress中DOM中是否不再有某个元素。有人可以建议您如何做吗?

//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的功能的决定是什么?赛普拉斯有什么好处?我一直在研究开源项目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

Answers:


183

好吧,这似乎行得通,所以它告诉我还有更多有关.should()的知识。

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

4
嗨!我使用的代码几乎相同:cy.get(data-e2e="create-entity-field-relation-contact-name").should('not.exists')但是它失败了get,然后尝试调用should几次,每次都失败了……知道我在做什么错吗?在此先感谢
Volk

抱歉,我刚刚看到您的评论,您的选择器是否在处理data属性?您可以在评论中粘贴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循环中,而不是should()?谢谢
user2451016 '19

24

您还可以在搜索不存在的文本:

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

在这里,您可以得到赛普拉斯的结果: 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。您正在使用什么版本的赛普拉斯?
艾伦(Alan)

为更新而欢呼。npx cypress --version- Cypress package version: 3.5.0 Cypress binary version: 3.5.0
蒂姆·阿贝尔

1
现在这对我有用,实际上我不确定我错过了什么。感谢您的帮助
蒂姆·阿贝尔

在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')
保罗·梅洛罗

如果它在dom中不存在,则not.be.visible将起作用。如果您查看柏树日志,将得到类似预期的undefined的内容,这些内容将不可见,并且断言将通过。因此,某种不可见的方式实际上掩盖了不存在且在一个断言中不可见的
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`);
            });
        })


0

您也可以使用以下代码

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

要么

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

要么

should('have.attr','minlength','2')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.