赛普拉斯、页面内容和变量

Cypress, page content and variables

对或错:在 Cypress 中,无法读取 X 页上的值,然后保留该值并将其与 Y 页上的值进行比较。

我可以从页面读取一个值并记录它:

cy.get('[data-e2e-selector=whatever]').then(elm => cy.log('Value from page X : ' + elm))

或者,例如,在选择器中具有相似或部分匹配的元素的数量:

cy.get('[data-e2e-selector=^whatever]').then(elm => cy.log('Number of elements like this on page X: ' + elm.length))

但是,由于 Cypress 运行的异步方式,我无法为此创建变量。正确的?创建的任何值都是空白的。

我也不能将读取的值传递给方法,然后将其与下一页上的值进行比较:

compareToValueOnNextPage(cy.get('[data-e2e-selector=^whatever]').then(elm => elm.length));

compareToValueOnNextPage(value: number) { // NB: Not sure if it's a number or string yet...
    cy.get('[data-e2e-selector=^whateverNextPage]').then(elm => elm.length).should('have.length', 4)
}

基本上,如果我想比较值,它们要么必须在同一页面上,要么需要进行硬编码。在实际端到端测试某些应用程序时,这是一个巨大的限制。很多时候,在页面 X 上创建一个值,基于在许多情况下应该是随机的输入,从而在测试中创建一个动态值。然后,在第 Y 页上,相同的值被(从后端)获取或以其他方式显示在摘要等中。而且,自然地,我想将第 X 页上显示的值与第 [= 页上显示的值进行比较57=]。但这是不可能的,因为单元测试思想似乎是 Cypress 的基础。

或者我在这里遗漏了什么?有没有 ugly/smelly 以外的解决方法?我认为可以将第 X 页上的值存储在一个文件中,然后在第 Y 页上读取该文件。但是,赛普拉斯似乎只有 一个 读取文件时的选项,这就是读取整个文件并寻找匹配项。所以那个文件会很乱。或者我需要几个文件。

我意识到这是在尝试将非功能性方式强加于功能性很强的异步技术。但是,如果无法“保留”一个值并在以后使用它,那么在端到端测试方面非常限制(即使在单元测试时不是这样) -基于前端组件)。

更新:

根据 Kerry 在以下答案中的建议:

cy.get('[data-e2e-selector=dellan-accordion]')
  .then(elm => cy.wrap(elm.length).as("myVariableName"));

-GO TO NEXT PAGE-

cy.get('[data-e2e-selector=betalingsplan-dellan]')
  .then(elm => elm.length)
  .should('have.length', myVariableName)

这产生“预期 4 有 属性 'length'。

这意味着,显然,我无法获取长度的长度。

所以我用'eq'替换了'have.length':

cy.get('[data-e2e-selector=betalingsplan-dellan]')
  .then(elm => elm.length)
  .should('have.length', myVariableName)

我收到以下错误:

expected 4 to equal 0

所以,似乎第一个变量 - myVariable - 在第一个 cy.get() 之后消失了。

如果我在一个 get 中执行所有操作(让另一个 get 进入其中,我转到下一页并获取元素的数量),那么它就可以工作。但按照 Kerry 展示的方式,它会灵活得多。但是,唉,上面的错误。

正如jonrsharpe在评论中提到的,请仔细阅读赛普拉斯关于变量和别名的文档。这是 Cypress 的核心概念,它将让您深入了解如何实现变量并在测试步骤之间携带值。

reader关于您如何实现的摘要示例是:

    cy.get('[data-e2e-selector=^whatever]')
      .then(elm => cy.wrap(elm.length).as("myVariableName"));

这样做的目的是 cy.wrap 将从 Cypress 命令链中的 elm.length 中生成值,然后允许您将其分配给别名“myVariableName”。

在您想要比较单独页面上的值的后续测试步骤中,您可以通过以下两种方式之一访问别名的值:

使用this.

cy.get('[data-e2e-selector=^whateverNextPage]')
  .then(elm => elm.length)
  .should('have.length', this.myVariableName)

通过cy.get()

cy.get("@myVariableName").then(function(variableValue){
  cy.get('[data-e2e-selector=^whateverNextPage]')
  .then(elm => elm.length)
  .should('have.length', variableValue)
})