赛普拉斯:如何从自定义命令获取返回值? (柏树承诺)

时间:2019-04-25 10:52:58

标签: javascript promise cypress

我正在寻找一种方法来取回由赛普拉斯自定义命令返回的返回值。

我目前正在使用Cypress和Cypress-promise lib(https://www.npmjs.com/package/cypress-promise

当前,结果是: log1 =汽车1 log2 = null

我的错误在哪里?

测试文件:

it('Test 1', async function() {
     const carName = await promisify(cy.set_typeCarName());
     cy.log("log2 = " + carName );
});

模块:

set_typeCarName() {
     let carName = "CAR 1";
     cy.get('#newSiteCityInput').type(carName);
     cy.log("log1 = " + carName);
     return carName;
};

Cypress.Commands.add('set_typeCarName',() => {
    webnewsite.set_typeCarName();
});

7 个答案:

答案 0 :(得分:3)

使用您的代码回答

Cypress.Commands.add('set_typeCarName',() => {
    return cy.wrap(webnewsite.set_typeCarName()); //return the wrap and use in chain
});

function set_typeCarName() {
 let carName = "CAR 1";
 cy.get('#newSiteCityInput').type(carName);
 cy.log("log1 = " + carName);
 return carName;
};

测试

it('Test 1', async function() {
     cy.set_typeCarName().then(carName => {
         cy.log("log2 = " + carName );
     }
);
     

答案 1 :(得分:1)

Cypress引入了一种编写代码而不是返回值的新方法,即使用别名。 https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Closures

正常的代码编写方式

async function compute(){
const value = await (asynchronous function);
return value;
}

const x = await compute(); // #a
console.log(x);            // #b

此操作在赛普拉斯中进行,因为我们无法在赛普拉斯中使用async / await

function() compute{
  cy.get('p#text').then(p => {
    const text = p.textContent;
    cy.wrap(text).as('pText');
    //even if we return text from here, it will not be accessible anywhere

  });
}

compute();    // #a
cy.get('@pText').then(text => {
  console.log(text);  // #b
}

问题的关键在于别名值,然后在下一个命令中使用它

,因为

Cypress首先运行整个代码并将命令放入队列中< br />代码进入队列后,队列中的下一条命令仅在当前命令的所有回调完成后才能运行,因此我们可以使用上述代码模式。

答案 2 :(得分:1)

如何使用返回值的一个示例
注意:此方法采用一个数字值,例如3445.55并将其设为3445.55

Commands.js

中的方法
Cypress.Commands.add('getValueWithComma', (num) => {
      const n = String(num),
        p = n.indexOf('.');
      return n.replace(/\d(?=(?:\d{3})+(?:\.|$))/g, (m, i) =>
        p < 0 || i < p ? `${m},` : m,
      );
    });

如何在.spec文件中调用

 cy.getValueWithComma(pass_value).then((returned_value) => {
              cy.log(' Returned value is   = ', returned_value);
            });

答案 3 :(得分:0)

命令是否缺少return语句?

Cypress.Commands.add('set_typeCarName',() => {
  return webnewsite.set_typeCarName(); // I added the initial `return`
});

答案 4 :(得分:0)

我想这就是你想要的:

测试文件

            cy.set_typeCarName()
                .then((returned_value) => {
                    cy.log("log2 = " + returned_value)
                })
            });

模块

    Cypress.Commands.add('set_typeCarName',() => {
            let carName = "CAR 1";
            cy.get('#newSiteCityInput').type(carName);
            cy.log("log1 = " + carName);
            return carName;
    });

答案 5 :(得分:0)

为此,我使用wrap()返回包含要返回的值的Chainable

模块

function foo() {
  return cy.wrap('foo');
}

Cypress.Commands.add('foo', foo);

<强>测试文件

cy.foo().then(value => console.log(value)); // foo

由于wrap()返回Cypress.Chainable,因此我们可以在命令中调用.then()。传递给wrap()的所有内容将交给下一个命令。

另请参阅:Cypress wrap() documentation

答案 6 :(得分:0)

请记住 cy 命令不是 Promise。您不能自信地使用 async/await 并期望它们与 cy 命令一起正常工作。您可以将 Promiseawait 关键字一起使用。并在 w3schools 上查找更多信息:https://www.w3schools.com/js/js_promise.asp,这对我很有帮助

  • 下面最终在柏树中为我工作
// {bidderCreationRequest} was declared earlier

function createBidderObject() {
  const bidderJson = {};
  await new Promise((generateBidderObject) => {
    cy.request(bidderCreationRequest).then((bidderCreationResp) => {
      bidderJson.id = bidderDMCreationResp.body.id;

      generateBidderObject(bidderJson);
    });
  });

  return bidderJson.id
}

createBidderObject(); // returns the id of the recently created bidder instead of undefined/null

您也可以使用 https://github.com/NicholasBoll/cypress-promise#readme,因为 cy 命令又不是 Promise。因此,如果您将 async/await 与使用本机 Promise 函数或提到的插件一起使用,您会很幸运