javascript 与cypress中的cy.log混淆

bqjvbblv  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(126)

这是我的代码打印总量-长度的元素产品:

cy.fixture('searchProducts').then(function (arr) {
        let arrProducts = [];
        let totals ;
        let totalGetJson;
       
        arr.forEach(($product) => {
            if ($product.nameProduct == "dress") {
                arrProducts = $product;
                totalGetJson= $product.total
                productsPage.getProductList.as('listProduct')
            }
        });

        totals = cy.get('@listProduct').then(($elements) => {
            expect(totalGetJson).to.eq($elements.length)
            return $elements.length  
        })
        //print [object Object]aaaaaaaaaaaaaaa
        cy.log(totals +"aaaaaaaaaaaaaaa")
        return totals
    })
    .then((totals) => {
        // print null
        cy.log(totals) 
        
    });

当我把cy.log(totals +“aaaaaaaaaaaaaaaaa”)放在return totals之前,然后把cy.log(totals)放在块中时,则()为空
如果我删除代码块中cy.log(totals +“aaaaaaaaaaaaaaa”)行,那么cy.log(totals)()就是$个元素,长度是9
我不明白在Cypress中使用Javascript的方式
请给我解释一下,我真的懂了,谢谢

pbpqsu0x

pbpqsu0x1#

回调的内容中包含一些异步命令,因此也需要异步处理返回值。
下面是使用Cypress example.json和公共站点example.com的三个版本的类似代码。

同步then()回调

cy.visit('http://example.com');
cy.fixture('example')
  .then(exampleData => {
    const name = exampleData.name  
    return name
  })
  .then(name => {
    expect(name).to.eq('Using fixtures to represent data')    // passes
  })

异步then()回调

cy.visit('http://example.com');
cy.fixture('example')
  .then(exampleData => {

    let name

    // Dummy async call where result is set internally
    cy.get('h1').then(() => {
      name = exampleData.name  
    })
    
    return name     // returns too soon!!
  })
  .then(name => {
    expect(name).to.eq('Using fixtures to represent data')   // fails
  })

带异步结果处理的异步then()回调

cy.visit('http://example.com');
cy.fixture('example')
  .then(exampleData => {
    let name

    return cy.get('h1').then(() => {     // return this line so that test waits 
      return name = exampleData.name     // return internal data result
    })

  })
  .then(name => {
    expect(name).to.eq('Using fixtures to represent data')   // passes
  })
kjthegm6

kjthegm62#

将一个cypress链调用分配到一个变量中是一个糟糕的做法。Cypress似乎不支持多个“active”命令。因此,当您在其间添加一个log命令时,Cypress可能会使您的totals命令无效,因此您以后无法使用它。您可以使用别名来保存命令的结果:

cy.fixture('searchProducts').then(function (arr) {
        let arrProducts = [];
        let totals ;
        let totalGetJson;
       
        arr.forEach(($product) => {
            if ($product.nameProduct == "dress") {
                arrProducts = $product;
                totalGetJson= $product.total
                productsPage.getProductList.as('listProduct')
            }
        });

        totals = cy.get('@listProduct').then(($elements) => {
            expect(totalGetJson).to.eq($elements.length)
            return $elements.length  
        }).as('totals')
        //print [object Object]aaaaaaaaaaaaaaa
        cy.log(totals +"aaaaaaaaaaaaaaa")
    })
    cy.get('@totals').then((totals) => {
        cy.log(totals) 
    });

我还发现原来的例子似乎在Cypress 9中工作,在Cypress 11中不工作。您使用的是哪个版本?

相关问题