这是:cy.get('[name=planSelect]').contains(dummyPlan)
相当于:cy.get('[name=planSelect]').should('contain', dummyPlan)
如果是这样,哪个更受欢迎?第一个是隐含的断言,但它更短,更清晰。
后续问题:在查看了如何最好地选择e2e测试元素之后,我发现Cypress docs建议使用data-cy
属性。有没有理由这比仅仅为标记添加name
属性更好? name
只能用于表单字段吗?
答案 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'