赛普拉斯:如何将文本值/文本元素与 .each() 进行比较
Posted
技术标签:
【中文标题】赛普拉斯:如何将文本值/文本元素与 .each() 进行比较【英文标题】:Cypress: How to compare textvalues/ textelements with .each() 【发布时间】:2021-12-11 04:01:42 【问题描述】:我尝试读出一个表格并比较所有文本值。如果有两次相同的值,则测试应该失败。我用计数器试试这个。如果计数器 == 2 则失败。 但我无法输入 if 语句,导致 cypress 无法比较 textvalue..
let duplicateCounter = 0
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]') // I'm using my own marker for my table
.each((MyElement, MyIndex, MyContentOfArray) =>
cy.wrap(MyElement.text())
.then( (tmp) =>
cy.log('tmp = ' + tmp)
if(tmp == "001_AA_Testproject") // it never enters the if-Block, cause textcomparing isnt working
cy.log('============================================ if Block ' )
duplicateCounter += 1
cy.log('duplicateCounter = ' + duplicateCounter)
)
cy.get(duplicateCounter ).should('eq',1)
如何在 .each()-loops 中使用 if 语句?
这是解决方案:
var projectName = '00_AA_Testprojekt Duplikatscheck';
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]')
// .filter(':contains("00_AA_Testprojekt Duplikatscheck")')
.filter(':contains("' + projectName + '")')
.should('have.length', 1)
感谢阿拉潘达斯
【问题讨论】:
【参考方案1】:-
您可以这样做:
var duplicateCounter = 0
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]')
.each(($ele, index, $list) =>
if ($ele.text() == '001_AA_Testproject')
duplicateCounter++
)
expect(duplicateCounter).to.equal(1) //If passed then no duplicate, if failed that means duplicate
所以现在每次迭代,duplicateCounter 的值都会增加。然后当循环结束时,我们断言duplicateCounter 的值为1。如果通过,则没有重复;如果失败,则意味着我们有重复。
-
更简单的方法是使用
filter()
命令搜索所需的文本,然后检查长度。比如:
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]')
.filter(':contains("001_AA_Testproject")')
.should('have.length', 1)
【讨论】:
谢谢!您的第二个变体“filter()”做得很好而且很短。变体 1 的问题仍然是,它从不进入 if-Block。我认为它是赛普拉斯方面的一个错误......【参考方案2】:要比较任何项目重复项,请使用唯一数组。
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]')
.then($els => [...$els].map(el => el.innerText.trim())) // convert to texts
.then(texts =>
// Find the unique texts
const unique = texts.filter(item, index) => texts.indexOf(item) === index)
const duplicateCounter = texts.length - unique.length;
// Assert that all the texts are unique
expect(duplicateCounter).to.eq(0)
// or
expect(texts).to.deep.eq(unique)
)
仅针对一个项目名称,您的方法还可以,但是
if(tmp == "001_AA_Testproject")
可能由于周围的空白而无法正常工作。试试
if(tmp.trim() === "001_AA_Testproject")
全面测试
let duplicateCounter = 0
cy.get('[data-cy="projectList"]')
.find('[data-cy="project.name"]')
.each((MyElement, MyIndex, MyContentOfArray) =>
const text = MyElement.text()
cy.log('text = ' + text)
if(tmp.trim() === "001_AA_Testproject")
cy.log('============================================ if Block ' )
duplicateCounter += 1
)
.then() => // Check counter after each() has finished
cy.log('duplicateCounter = ' + duplicateCounter)
cy.wrap(duplicateCounter).should('eq',1)
// or
expect(duplicateCounter).to.eq(1)
)
// Does not work here, this will only check initial value 0
expect(duplicateCounter).to.eq(1)
【讨论】:
以上是关于赛普拉斯:如何将文本值/文本元素与 .each() 进行比较的主要内容,如果未能解决你的问题,请参考以下文章
赛普拉斯:如何比较与从表中读出的字符串/文本连接的不同数据类型