赛普拉斯、页面内容和变量
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)
})
对或错:在 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)
})