赛普拉斯:如何将文本值/文本元素与 .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() 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯:如何比较与从表中读出的字符串/文本连接的不同数据类型

单击赛普拉斯中的完全匹配文本

如何验证赛普拉斯中的悬停文本(工具提示)?

如何将赛普拉斯的测试运行程序的“控制台日志”(左侧)保存到文件中

赛普拉斯断言文本

如何使用赛普拉斯检查可能不存在的元素