我正在寻找一种方法来取回由赛普拉斯自定义命令返回的返回值。
我目前正在使用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();
});
答案 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()
的所有内容将交给下一个命令。
答案 6 :(得分:0)
请记住 cy 命令不是 Promise。您不能自信地使用 async/await
并期望它们与 cy
命令一起正常工作。您可以将 Promise
与 await
关键字一起使用。并在 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
函数或提到的插件一起使用,您会很幸运