赛普拉斯:不能在断言中使用变量

时间:2021-06-03 19:47:46

标签: javascript cypress

我需要在过滤器中选择几个元素并检查数据是否会根据过滤器显示。我正在尝试将元素的文本保存在变量中,并在最后进行检查。

it.only('the UI with a lot of entries in a filter, should be responsive', () => {
  let listItem1
  let listItem2

  cy.get('someTab').click().then(()=> {
    cy.getText(cy.get('someSelector').first(), listItem1)
    cy.getText(cy.get('someSelector').last(), listItem2)
  }).then(()=> {
    cy.get('someSelector').first().click()
    cy.get('someSelector').last().click()
    cy.get('someButton').click()
  }).then(()=>{
    cy.log(listItem1, listItem2)  // nothing is visible
    cy.get('span[data-app]').should('contain', listItem1)  // fail
    cy.get('span[data-app]').should('contain', listItem2)  // fail
  })
})

我使用这个功能:

getText(selector, variable) {
  return selector.invoke('text')
    .then(($text) => {
      variable = $text.trim()
    })
}  

它不起作用,但我无法理解如何修复它

1 个答案:

答案 0 :(得分:2)

基本问题是在 <body> <div class="main"> <div id=box-a> <div class=header-button>About</div> <div class=header-button>How to</div> <div class=header-button>Info</div> <div class=header-button>More</div> </div> <div id=box-b> <p> This is the content of box B. </p> </div> <div id=box-c> <p> This is the content of box C. </p> </div> </div> </body> 中,您要赋予值的第二个参数是“按值”传递的,但要设置和稍后使用它需要“按引用”传递。

如果你“按值传递”,设置变量在函数之外没有任何影响。

有关背景信息,请参阅 Pass variables by reference in JavaScript

在 javascript 中无法“通过引用”传递,但您可以包装在容器对象中并修改属性

getText(selector, variable)

您可以将 function getText(selector, container, variableName) { selector.invoke('text') .then(($text) => { container[variableName] = $text.trim() }) } it('the UI...', () => { const container = { // Note const because container never changes listItem1: null, // only properties will change listItem2: null } cy.get('someTab').click().then(() => { cy.getText(cy.get('someSelector').first(), container, 'listItem1') cy.getText(cy.get('someSelector').last(), container, 'listItem2') }).then(() => { cy.get('someSelector').first().click() cy.get('someSelector').last().click() cy.get('someButton').click() }).then(() => { cy.log(container.listItem1); // listItem1 is visible cy.log(container.listItem2); // listItem2 is visible cy.get('span[data-app]').should('contain', container.listItem1) cy.get('span[data-app]').should('contain', container.listItem2) }) }) 更改为自定义命令

getText()