我希望能够单击复选框,并测试元素不再在Cypress的DOM中。有人能建议你怎么做吗?
// This is the Test when the checkbox 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。
柏树6。x +迁移
根据赛普拉斯关于存在的文件
非常流行的尝试,有点天真,将工作,直到它不起作用,然后你将不得不重新编写它……一次又一次……
// retry until loading spinner no longer exists
cy.get('#loading').should('not.exist')
这并不能真正解决大多数人想要的标题问题。
这适用于它被删除的情况。但如果你想让它永远不存在……它将重试,直到它消失。
但是,如果您想测试元素在我们的例子中是否不存在。
是的lol。这是你真正想要的,除非你只是想再头疼一天。
// 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`) });
})
被投票的元素是正确的,但我强烈建议不要使用反模式,这样可以省去很多麻烦。为什么?是的,因为;
您的应用程序可以使用动态类或变化的ID
选择器将CSS样式或JS行为从开发更改中分离出来
幸运的是,可以避免这两个问题。
不要基于CSS属性(如:id, class, tag)来定位元素
不要针对那些可能改变文本内容的元素
添加data-*属性,使目标元素更容易
例子:
<button id="main" name="submission" role="button" data-cy="submit">Submit</button>
如果你想要更具体,想要标识多个选择器,使用.shouldchainer总是很好的。
例子:
cy.get("ul").should(($li) => {
expect($li).to.be.visible
expect($li).to.contain("[data-cy=attribute-name]")
expect($li).to.not.contain("text or another selector")
})
以防有人遇到这个问题,我有一个问题,既。should('not.exist')也。should('have.)。length', 0)工作-更糟糕的是:如果我正在查询的元素实际上从一开始就在那里,两次断言仍然返回true。
在我的例子中,这导致了一个非常奇怪的情况,这三个断言,一个接一个地执行,是正确的,即使断言1+2和3相互矛盾:
cy.get('[data-cy="foobar"]').should('not.exist')
cy.get('[data-cy="foobar"]').should('have.length', 0)
cy.get('[data-cy="foobar"]').should('have.text', 'Foobar')
经过大量测试后,我发现这只是一个竞态条件问题。在运行上述3行之前,我正在等待一个后端调用。像这样:
cy.wait('@someBackendCall')
cy.get('[data-cy="foobar"]').should('not.exist')
然而,一旦后端调用finished, Cypress立即运行前两个断言,并且它们都仍然为真,因为DOM还没有根据后端数据重新呈现。
我在一个我知道在任何情况下都会在那里的元素上添加了一个显式的等待,所以我的代码现在看起来像这样:
cy.wait('@someBackendCall')
cy.get('[data-cy="some-element"]').should('contain', 'I am always here after loading')
cy.get('[data-cy="foobar"]').should('not.exist')