我需要从赛普拉斯场景开始期间发送的电子邮件中检索URL。
等待电子邮件并检索其中的url是一个异步任务,因此我创建了一个名为“ readMail”的赛普拉斯插件:它将电子邮件地址作为输入,等待gmail api实际有一封电子邮件,其收件人是此地址,然后阅读邮件并返回一个承诺,以解决电子邮件正文中包含的网址。由于插件日志确实正确显示了提取的网址,因此此过程可以正常进行。
我的问题是使它extractedUrl
可用作以后的参数,例如cy.visit(extractedUrl)
:在的主体之外task(...).then(...)
,仍未设置变量。
这是代码:
it('should generate correct email', () => {
const recipientEmail: string = '[email protected]';
const extractedUrl:string = '';
// ....scenario generating a email to '[email protected]'.....
cy.task('readMail', recipientEmail) // plugin logs "https://some.url.com" after a few seconds
.then((result:any) => {
extractedUrl= result;
console.log(result); // logs "https://some.url.com" in the terminal
cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
});
cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
console.log(extractedUrl); // logs nothing
cy.visit(extractedUrl);
});
我可能缺少有关cypress如何处理异步的一些信息……我尝试了几种不同的方法:cy.wrap
和该cypress-wait-until
插件,但找不到任何使它们工作的方法。
实际上,我找到了一种extractedUrl
在测试之外进行声明并开始新测试的方法it('...', () => {...})
:然后,extractedUrl
在下一个测试开始时实际上具有正确的值,但这并不理想,我想了解原因。谢谢你的帮助 !
TL; DR; 将整个代码放入then
回调中
it('should generate correct email', () => {
const recipientEmail: string = '[email protected]';
const extractedUrl:string = '';
// ....scenario generating a email to '[email protected]'.....
// plugin logs "https://some.url.com" after a few seconds
cy.task('readMail', recipientEmail).then((result:any) => {
extractedUrl= result;
console.log(result); // logs "https://some.url.com" in the terminal
cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
console.log(extractedUrl); // logs nothing
cy.visit(extractedUrl);
});
});
与看上去相反,赛普拉斯命令不返回承诺,它们返回类似承诺的对象,并且执行队列由赛普拉斯框架处理。这是一些在处理诺言时会合乎逻辑的动作不起作用的主要原因。
更多信息在这里:等待柏树链#1417
您也可以尝试cypress-promise,这是一个将cypress像承诺的对象更改为实际的promise的插件。此处的更多信息:Cypress.io — Nicholas Boll使用异步和等待
您也可以使用别名来访问值:
it('should generate correct email', () => {
const recipientEmail: string = '[email protected]';
const extractedUrl:string = '';
// ....scenario generating a email to '[email protected]'.....
// plugin logs "https://some.url.com" after a few seconds
cy.task('readMail', recipientEmail).then((result:any) => {
extractedUrl= result;
cy.wrap(result).as('extractedUrl');
console.log(result); // logs "https://some.url.com" in the terminal
cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
});
cy.get('@extractedUrl').then((extractedUrl) => {
cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
console.log(extractedUrl); // logs nothing
cy.visit(extractedUrl);
})
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句