如何正确进行条件测试
How to proper Conditional Testing
我只想问一下如何正确的进行条件测试?我这里有这段代码
cy.get('[data-slug="add-to-any"] > .plugin-title > strong').then(($slug) => {
if (expect($slug).not.to.exist){
//It will passed
}else if (expect($slug).to.exist){
cy.get('#deactivate-add-to-any').should('not.exist')
}
我将元素声明为 not.to.exist,但它给了我这个错误
Expected to find element: [data-slug="add-to-any"] > .plugin-title > strong, but never found it.
我真的不知道我需要使用什么断言。
理想的方法(如果它适用于您的情况)是将最后一个选择器移动到 .then()
cy.get('[data-slug="add-to-any"] > .plugin-title')
.then(($pluginTitle) => {
const $slug = $pluginTitle.find('strong'); // this finds with jQuery
// which won't fail the test
// if not found
if ($slug.length === 0) { // not found
} else {
cy.get('#deactivate-add-to-any').should('not.exist')
}
})
它不是 100% fool-proof,如果 $slug 是异步加载的(比如通过 fetch),它不会立即出现并且测试可能会通过,而实际上 $slug 在加载后 100 毫秒出现测试运行。
您需要了解应用程序的工作方式才能真正确定。
Cypress 文档展示了这种模式,使用 <body>
作为“稳定”元素(在页面加载后始终存在)。
cy.get('body').then($body => {
const slug = $body.find('[data-slug="add-to-any"] > .plugin-title > strong')
if ($slug.length) {
...
不太理想,因为该页面可能 <body>
但仍在其中获取元素。
IMO 的最佳做法是尝试条件元素的 直接父元素 元素。如果这也是有条件的,请向上移动元素树,直到在测试的那个点找到 stable/present 的元素。
或者添加一个等待页面获取完成的保护条件。 cy.intercept()
对此很有用,甚至只是这个
cy.get('[data-slug="add-to-any"] > .plugin-title')
.should('be.visible') // retries until .plugin-title is showing
.then(($pluginTitle) => {
const $slug = $pluginTitle.find('strong')
if ($slug.length === 0) {
...
简单示例
cy.get("body").then($body => {
if ($body.find('[data-slug="add-to-any"] > .plugin-title').length > 0) {
cy.get('[data-slug="add-to-any"] > .plugin-title').then($title => {
if ($title.is(':visible')){
//you get here only if it EXISTS and is VISIBLE
}
});
} else {
//you get here if the it DOESN'T EXIST
cy.get('#deactivate-add-to-any').should('not.exist')
}
});
我只想问一下如何正确的进行条件测试?我这里有这段代码
cy.get('[data-slug="add-to-any"] > .plugin-title > strong').then(($slug) => {
if (expect($slug).not.to.exist){
//It will passed
}else if (expect($slug).to.exist){
cy.get('#deactivate-add-to-any').should('not.exist')
}
我将元素声明为 not.to.exist,但它给了我这个错误
Expected to find element: [data-slug="add-to-any"] > .plugin-title > strong, but never found it.
我真的不知道我需要使用什么断言。
理想的方法(如果它适用于您的情况)是将最后一个选择器移动到 .then()
cy.get('[data-slug="add-to-any"] > .plugin-title')
.then(($pluginTitle) => {
const $slug = $pluginTitle.find('strong'); // this finds with jQuery
// which won't fail the test
// if not found
if ($slug.length === 0) { // not found
} else {
cy.get('#deactivate-add-to-any').should('not.exist')
}
})
它不是 100% fool-proof,如果 $slug 是异步加载的(比如通过 fetch),它不会立即出现并且测试可能会通过,而实际上 $slug 在加载后 100 毫秒出现测试运行。
您需要了解应用程序的工作方式才能真正确定。
Cypress 文档展示了这种模式,使用 <body>
作为“稳定”元素(在页面加载后始终存在)。
cy.get('body').then($body => {
const slug = $body.find('[data-slug="add-to-any"] > .plugin-title > strong')
if ($slug.length) {
...
不太理想,因为该页面可能 <body>
但仍在其中获取元素。
IMO 的最佳做法是尝试条件元素的 直接父元素 元素。如果这也是有条件的,请向上移动元素树,直到在测试的那个点找到 stable/present 的元素。
或者添加一个等待页面获取完成的保护条件。 cy.intercept()
对此很有用,甚至只是这个
cy.get('[data-slug="add-to-any"] > .plugin-title')
.should('be.visible') // retries until .plugin-title is showing
.then(($pluginTitle) => {
const $slug = $pluginTitle.find('strong')
if ($slug.length === 0) {
...
简单示例
cy.get("body").then($body => {
if ($body.find('[data-slug="add-to-any"] > .plugin-title').length > 0) {
cy.get('[data-slug="add-to-any"] > .plugin-title').then($title => {
if ($title.is(':visible')){
//you get here only if it EXISTS and is VISIBLE
}
});
} else {
//you get here if the it DOESN'T EXIST
cy.get('#deactivate-add-to-any').should('not.exist')
}
});