赛普拉斯测试:.contains()相当于应该('包含')?

时间:2018-04-26 12:10:38

标签: e2e-testing cypress

这是:cy.get('[name=planSelect]').contains(dummyPlan)

相当于:cy.get('[name=planSelect]').should('contain', dummyPlan)

如果是这样,哪个更受欢迎?第一个是隐含的断言,但它更短,更清晰。

后续问题:在查看了如何最好地选择e2e测试元素之后,我发现Cypress docs建议使用data-cy属性。有没有理由这比仅仅为标记添加name属性更好? name只能用于表单字段吗?

2 个答案:

答案 0 :(得分:5)

如果name=planSelect的元素不包含dummyPlan,则cypress测试的结果将相同,也就是说,此时测试将失败。

它们之间的区别在于,在第一种形式中,使用contains(),您实际上是在尝试选择一个元素,而cy.get(...)。contains()的结果将产生这个预期的DOM元素,允许进一步链接方法,如:

cy.get('[name=planSelect]').contains(dummyPlan).click();

在第二种形式中,您使用Chai chainer contain进行显式断言以验证dummyPlan是否存在于另一个元素中。

这是一个细微的差别,结果是一样的,但我建议你只使用cy.get('[name=planSelect]').contains(dummyPlan),以防你想在包含后链接其他方法,如果你想要使用第二种形式显式断言此元素存在。从逻辑上讲,第一个代表一般的测试失败(cypress试图找到一个不存在的元素),第二个代表一个明确的断言失败(元素应该包含dummyPlan,但它不包含)。

至于你的第二个问题,name是一个有效的HTML属性,如果在其原始函数中使用该属性(用于命名输入字段)或者属性是那里只是为了测试目的。我建议您使用cy-name作为文档建议,因为这样可以避免这种歧义,并明确表示此属性cy-name仅用于测试目的。

此外,在某些情况下,您可能决定从代码中删除所有cy-name,然后再将其发送到生产环境中(在构建过程中,使用一些webpack插件,如string-replace-loader)。如果只使用name,则无法执行相同操作,因为如果代码中有一些输入,您也会删除所需的输入name

答案 1 :(得分:1)

TLDR包含是最佳选择器。它将重试并匹配内部文本。


  • .should()要求您要返回的元素已被选中
  • .contains(selector, content)等待UI并选择特定元素

它不仅仅与< tag > .class #id [attributes]

匹配

.contains(selector, content)是一个断言'child content text'

的选择器