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

Posted

技术标签:

【中文标题】赛普拉斯,页面内容和变量【英文标题】:Cypress, page content and variables 【发布时间】:2021-08-20 14:48:33 【问题描述】:

对或错:在 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))

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

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

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 页上显示的值与 Y/ 页上显示的值进行比较概括。但这是不可能的,因为单元测试思维似乎是赛普拉斯的基础。

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

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

更新:

根据 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'。

显然,这意味着我无法得到长度的长度。

所以我将 'have.length' 替换为 'eq':

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 展示它的方式,它会更加灵活。但是,唉,上面的错误。

【问题讨论】:

你读过吗? docs.cypress.io/guides/core-concepts/variables-and-aliases?它是异步的,但您可以访问 closure 中的值:github.com/textbook/rps-api/blob/… 我没有提到.should,我说的是.then。请实际阅读我链接到的内容。如果您不在十分钟内注销两个社区,您可能还会发现人们更倾向于在空闲时间帮助您。 【参考方案1】:

正如 jonrsharpe 在 cmets 中提到的,请彻底阅读 Cypress 关于变量和别名的文档。这是 Cypress 的核心概念,它将让您深入了解如何实现变量并在测试步骤之间传递值。

您如何实现的读者摘要示例如下:

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

这样做是cy.wrap 将在赛普拉斯命令链中产生来自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)
)

【讨论】:

您能看一下问题中的 UPDATE 吗?我正在尝试您在此处显示的方法,但效果不佳。 看起来您正试图通过变量名显式访问该变量。请看我的两个例子:第一个是使用this.上下文关键字来访问变量,所以它是this.myVariableName。第二种是使用cy.get() 来获取变量值,然后在then() 函数中使用生成的值。如果你使用这种方法,你需要像这样访问变量:cy.get("@myVariableName") 是的,我一直在尝试。 “这个”不起作用,期间。不知道你使用的是不是和我一样的环境(IntelliJ,TypeScript)。不过,它可以在没有“this”的情况下工作。你的第二个例子我实际上可以运行。第一个,不是。 :-)

以上是关于赛普拉斯,页面内容和变量的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯 IO- 编写 For 循环

赛普拉斯与SystemJS

赛普拉斯利用 Gitlab 变量

赛普拉斯:检查元素是不是存在无异常

在赛普拉斯测试中加载页面后,如何可靠地等待 XHR 请求?

单击超链接时能够防止/停止在赛普拉斯中加载“页面加载”