如何使用 cypress 检查元素内部文本的相等性?
How do you check the equality of the inner text of a element using cypress?
我有一个 div,里面有另一个 div,我想检查 div 的内部文本是否相等。我已经想出如何使用 invoke('text')
函数来实现它,但我想知道这是否是最好的方法。所以我的问题是:如何使用 cypress 检查元素内部文本的相等性?
it('the channel name should contain be Anakin Skywaler', () => {
//This works but can we be more specific with our selector
cy.get("[data-test-id='Skywalker,Anakin']").should('contain', 'Skywalker,Anakin');
})
it('the channel name should equal Skywalker,Anakin', () => {
cy.get("[data-test-id='Skywalker,Anakin']").find('.channel-name').invoke('text').then((text) => {
expect(text.trim()).equal('Skywalker,Anakin')
});
});
请无视StarWar参考!
您可以检查字符串是否包含在 div:
中的某处
cy.get("[data-test-id='Skywalker,Anakin']").contains('Skywalker,Anakin');
或者,如果您需要确保 div 包含 仅 指定的文本而不包含其他任何内容,您可以在这个额外的断言上添加标签:
cy.get("[data-test-id='Skywalker,Anakin']").contains('Skywalker,Anakin').should((elem) => {
expect(elem.text()).to.equal('Skywalker,Anakin');
});
解释:
// Get the data
cy.get("[data-test-id='Skywalker,Anakin']")
// Get the child or children of the previous command that
// contain the text - this command fails if no child
// element is found containing the given text
.contains('Skywalker,Anakin');
// These two lines are explained above
cy.get("[data-test-id='Skywalker,Anakin']")
.contains('Skywalker,Anakin')
// Like a .then(), except the contents are retried until
// all contained assertions are successful or until the
// command times out
.should((elem) => {
// Expect the element's text to exactly equal the
// string, not just contain it
expect(elem.text()).to.equal('Skywalker,Anakin');
});
我认为目前这是最好的选择,因为它不检查包含。我希望有一段更短的代码来做到这一点。
it('the channel name should equal Skywalker,Anakin', () => {
cy.get("[data-test-id='Skywalker,Anakin']").find('.channel-name').invoke('text').then((text) => {
expect(text.trim()).equal('Skywalker,Anakin')
});
});
我想你可以简化这个。
假设您 HTML 看起来像这样:
<div data-test-id="Skywalker,Anakin">
<div class=".channel-name">Skywalker,Anakin</div>
</div>
你可以这样写你的断言:
cy.get('[data-test-id="Skywalker,Anakin"]').should(
"have.text",
"Skywalker,Anakin"
);
这对我来说已经通过了,如果我将 HTML 修改为 Skywalker,Anakin 1
,它就会像您预期的那样失败。赛普拉斯使用 have.text 来查看呈现的内容,因此它不会担心任何标记,只查看结果是什么。
这对修剪不起作用。您需要添加一个回调来进行修剪。
cy.get('[data-test-id="Skywalker,Anakin"]').should(($div) => {
expect($div.text().trim()).equal("Skywalker,Anakin");
});
以下是检查元素中字符串的完全匹配或部分匹配的方法:
//matches exact text of result string
cy.get("[data-test-id='Skywalker,Anakin']").should('have.text', 'Skywalker,Anakin');
//matches partial text of result string
cy.get("[data-test-id='Skywalker,Anakin']")
.text()
.then(value => {
cy.log("Text value is :", value);
expect(value).to.include('Anakin');
});
其中 text()
在 command.js
文件中定义如下:
Cypress.Commands.add("text", { prevSubject: true }, (subject, options) => {
return subject.text();
});
不敢相信我没有看到神奇的柏树 .should
火柴之一。我还使用 typescript cypress,它提供了很好的 lookups/intellisense.
- 使用应该。但是,这些是完全匹配的文本,可能会有很多空格
cy.get("[data-test-id='Skywalker,Anakin']")
.should("have.text", "Skywalker,Anakin")
.should("have.attr", "data-test-id","Skywalker,Anakin'")
- 添加一个新命令会更好,例如 shouldHaveTrimmedText
- 我从https://github.com/cypress-io/cypress/issues/3887#issuecomment-522962482
那里得到的
- 但下面是让它工作的设置
查找
commands.ts
Cypress.Commands.add(
'shouldHaveTrimmedText',
{
prevSubject: true,
},
(subject, equalTo) => {
if (isNaN(equalTo)) {
expect(subject.text().trim().replace(/ +/g, ' ')).to.eq(equalTo);
} else {
expect(parseInt(subject.text())).to.eq(equalTo);
}
return subject;
},
);
cypress/support/index.d.ts
Cypress.Commands.add(
'shouldHaveTrimmedText',
{
prevSubject: true,
},
(subject, equalTo) => {
if (isNaN(equalTo)) {
// removes double spaces and ending spaces, does not remove special characters such as tabs or \n
expect(subject.text().trim().replace(/ +/g, ' ')).to.eq(equalTo);
} else {
expect(parseInt(subject.text())).to.eq(equalTo);
}
return subject;
},
);
tsconfig
{
"types": ["cypress","./cypress/support"]
// or "typeRoots": ... but not both
}
cy.get("[data-test-id='Skywalker,Anakin']")
.shouldHaveTrimmedText("Skywalker,Anakin")
简单精确匹配
cy.get('[data-test-id=Skywalker,Anakin]')
.invoke('text')
.should('equal', 'Skywalker,Anakin')
我有一个 div,里面有另一个 div,我想检查 div 的内部文本是否相等。我已经想出如何使用 invoke('text')
函数来实现它,但我想知道这是否是最好的方法。所以我的问题是:如何使用 cypress 检查元素内部文本的相等性?
it('the channel name should contain be Anakin Skywaler', () => {
//This works but can we be more specific with our selector
cy.get("[data-test-id='Skywalker,Anakin']").should('contain', 'Skywalker,Anakin');
})
it('the channel name should equal Skywalker,Anakin', () => {
cy.get("[data-test-id='Skywalker,Anakin']").find('.channel-name').invoke('text').then((text) => {
expect(text.trim()).equal('Skywalker,Anakin')
});
});
请无视StarWar参考!
您可以检查字符串是否包含在 div:
中的某处cy.get("[data-test-id='Skywalker,Anakin']").contains('Skywalker,Anakin');
或者,如果您需要确保 div 包含 仅 指定的文本而不包含其他任何内容,您可以在这个额外的断言上添加标签:
cy.get("[data-test-id='Skywalker,Anakin']").contains('Skywalker,Anakin').should((elem) => {
expect(elem.text()).to.equal('Skywalker,Anakin');
});
解释:
// Get the data
cy.get("[data-test-id='Skywalker,Anakin']")
// Get the child or children of the previous command that
// contain the text - this command fails if no child
// element is found containing the given text
.contains('Skywalker,Anakin');
// These two lines are explained above
cy.get("[data-test-id='Skywalker,Anakin']")
.contains('Skywalker,Anakin')
// Like a .then(), except the contents are retried until
// all contained assertions are successful or until the
// command times out
.should((elem) => {
// Expect the element's text to exactly equal the
// string, not just contain it
expect(elem.text()).to.equal('Skywalker,Anakin');
});
我认为目前这是最好的选择,因为它不检查包含。我希望有一段更短的代码来做到这一点。
it('the channel name should equal Skywalker,Anakin', () => {
cy.get("[data-test-id='Skywalker,Anakin']").find('.channel-name').invoke('text').then((text) => {
expect(text.trim()).equal('Skywalker,Anakin')
});
});
我想你可以简化这个。
假设您 HTML 看起来像这样:
<div data-test-id="Skywalker,Anakin">
<div class=".channel-name">Skywalker,Anakin</div>
</div>
你可以这样写你的断言:
cy.get('[data-test-id="Skywalker,Anakin"]').should(
"have.text",
"Skywalker,Anakin"
);
这对我来说已经通过了,如果我将 HTML 修改为 Skywalker,Anakin 1
,它就会像您预期的那样失败。赛普拉斯使用 have.text 来查看呈现的内容,因此它不会担心任何标记,只查看结果是什么。
这对修剪不起作用。您需要添加一个回调来进行修剪。
cy.get('[data-test-id="Skywalker,Anakin"]').should(($div) => {
expect($div.text().trim()).equal("Skywalker,Anakin");
});
以下是检查元素中字符串的完全匹配或部分匹配的方法:
//matches exact text of result string
cy.get("[data-test-id='Skywalker,Anakin']").should('have.text', 'Skywalker,Anakin');
//matches partial text of result string
cy.get("[data-test-id='Skywalker,Anakin']")
.text()
.then(value => {
cy.log("Text value is :", value);
expect(value).to.include('Anakin');
});
其中 text()
在 command.js
文件中定义如下:
Cypress.Commands.add("text", { prevSubject: true }, (subject, options) => {
return subject.text();
});
不敢相信我没有看到神奇的柏树 .should
火柴之一。我还使用 typescript cypress,它提供了很好的 lookups/intellisense.
- 使用应该。但是,这些是完全匹配的文本,可能会有很多空格
cy.get("[data-test-id='Skywalker,Anakin']")
.should("have.text", "Skywalker,Anakin")
.should("have.attr", "data-test-id","Skywalker,Anakin'")
- 添加一个新命令会更好,例如 shouldHaveTrimmedText
- 我从https://github.com/cypress-io/cypress/issues/3887#issuecomment-522962482 那里得到的
- 但下面是让它工作的设置 查找
commands.ts
Cypress.Commands.add(
'shouldHaveTrimmedText',
{
prevSubject: true,
},
(subject, equalTo) => {
if (isNaN(equalTo)) {
expect(subject.text().trim().replace(/ +/g, ' ')).to.eq(equalTo);
} else {
expect(parseInt(subject.text())).to.eq(equalTo);
}
return subject;
},
);
cypress/support/index.d.ts
Cypress.Commands.add(
'shouldHaveTrimmedText',
{
prevSubject: true,
},
(subject, equalTo) => {
if (isNaN(equalTo)) {
// removes double spaces and ending spaces, does not remove special characters such as tabs or \n
expect(subject.text().trim().replace(/ +/g, ' ')).to.eq(equalTo);
} else {
expect(parseInt(subject.text())).to.eq(equalTo);
}
return subject;
},
);
tsconfig
{
"types": ["cypress","./cypress/support"]
// or "typeRoots": ... but not both
}
cy.get("[data-test-id='Skywalker,Anakin']")
.shouldHaveTrimmedText("Skywalker,Anakin")
简单精确匹配
cy.get('[data-test-id=Skywalker,Anakin]')
.invoke('text')
.should('equal', 'Skywalker,Anakin')