Javascript 如何在以后的测试中重用产生的价值

Javascript 如何在以后的测试中重用产生的价值,javascript,global-variables,ui-automation,cypress,e2e-testing,Javascript,Global Variables,Ui Automation,Cypress,E2e Testing,上下文:我在第1页有一个innerText元素,在第2页有另一个innerText元素。我需要在第3页比较这两个值。所以我需要找到一种方法将这些值全局保存在变量中,以便以后使用 我尝试过的事情: 试用版1:不起作用,因为page1value范围仅限于cy.get() 试用版2:不起作用,因为每当我尝试在外部打印值时,它都是未定义的值或初始化时使用的值 it('TC Name', () => { let page1value, cy.get('#selector')

上下文:我在第1页有一个innerText元素,在第2页有另一个innerText元素。我需要在第3页比较这两个值。所以我需要找到一种方法将这些值全局保存在变量中,以便以后使用

我尝试过的事情:

试用版1:不起作用,因为page1value范围仅限于cy.get()

试用版2:不起作用,因为每当我尝试在外部打印值时,它都是未定义的值或初始化时使用的值

it('TC Name', () => {

    let page1value,
        cy.get('#selector').invoke('text').then(text => {
            page1value = text
        })

    cy.log(page1value) //comes as undefined

})
试用版3:使用.as()以及未定义的名称

let page1value;
cy.get('#selector').invoke('text').as('page1value');
cy.log(page1value) //comes as undefined

如果有人能告诉我哪里做错了,那就太好了。

Cypress命令被推入(排队)队列(称为命令队列,基本上是一个数组),然后串行(一个接一个)异步执行

虽然在上一个命令之后,
cy.log()
也将异步执行,但在将命令推送到队列时(在调用传递给
it()
的回调时——在测试开始时),会同步传递/计算传递给它的值(
page1value

这只是常规的JavaScript行为,与Cypress无关。所有命令
cy.*
都只是
cy
对象上的方法(函数),它们会立即被调用。不立即调用(执行)的是每个命令的逻辑(例如,在DOM中查询您提供给
cy.get()
、调用
cy.log('string')
时记录到命令日志的选择器等)

因此,在您的第二个示例中:

  • 您可以声明
    page1value
  • 然后立即将命令
    cy.get()
    cy.invoke
    cy.then()
    排入队列
  • 您还可以立即将
    cy.log
    排入队列,并向其传递
    page1value
    (此时仍
    未定义
  • 所有命令排队后,它们开始从上到下执行。当
    cy.then
    命令轮流执行时,会分配
    page1value
    变量,但在测试的其余部分,它不再在任何地方使用(读取)(回想一下,在上一步将它传递给
    cy.log
    命令时,您已经读取了它)
  • 因此,您想做的是:

    cy.get('#selector').invoke('text').then(text => {
      cy.log(text);
    });
    
    在第三个示例中,如果您对某个对象进行了别名,则需要使用另一个命令访问该值(请记住,所有内容都是异步的,因此您无法访问以同步方式异步设置的值),在本例中,
    cy.get('@aliasName')

    注意,为了简单起见,上面的解释有点不准确,而且用之不竭(有更多的事情发生在幕后)。但作为一个如何工作的介绍,他们应该这样做

    不管怎样,你一定要读书

    您还可以看看我以前的答案,这些答案涉及相关概念:


    Cypress命令被推入(排队)队列(称为命令队列,基本上是一个数组),然后串行(一个接一个)异步执行

    虽然在上一个命令之后,
    cy.log()
    也将异步执行,但在将命令推送到队列时(在调用传递给
    it()
    的回调时——在测试开始时),会同步传递/计算传递给它的值(
    page1value

    这只是常规的JavaScript行为,与Cypress无关。所有命令
    cy.*
    都只是
    cy
    对象上的方法(函数),它们会立即被调用。不立即调用(执行)的是每个命令的逻辑(例如,在DOM中查询您提供给
    cy.get()
    、调用
    cy.log('string')
    时记录到命令日志的选择器等)

    因此,在您的第二个示例中:

  • 您可以声明
    page1value
  • 然后立即将命令
    cy.get()
    cy.invoke
    cy.then()
    排入队列
  • 您还可以立即将
    cy.log
    排入队列,并向其传递
    page1value
    (此时仍
    未定义
  • 所有命令排队后,它们开始从上到下执行。当
    cy.then
    命令轮流执行时,会分配
    page1value
    变量,但在测试的其余部分,它不再在任何地方使用(读取)(回想一下,在上一步将它传递给
    cy.log
    命令时,您已经读取了它)
  • 因此,您想做的是:

    cy.get('#selector').invoke('text').then(text => {
      cy.log(text);
    });
    
    在第三个示例中,如果您对某个对象进行了别名,则需要使用另一个命令访问该值(请记住,所有内容都是异步的,因此您无法访问以同步方式异步设置的值),在本例中,
    cy.get('@aliasName')

    注意,为了简单起见,上面的解释有点不准确,而且用之不竭(有更多的事情发生在幕后)。但作为一个如何工作的介绍,他们应该这样做

    不管怎样,你一定要读书

    您还可以看看我以前的答案,这些答案涉及相关概念:


    Cypress命令是异步执行的。您不知道何时将设置page1value,因此在
    get
    之后调用
    cy.log()
    ,当然必须记录
    undefined
    。请看看答案是否符合你的需要。如果您只想比较这两个值,那么可以将
    expect(val1).to.eq(val2)
    写入他应该回调中。Cypress命令是异步执行的。您不知道page1value将在何时显示
    cy.get('#selector').invoke('text').as('page1value');
    cy.get('@page1value').then( value => {
      cy.log(value);
    });