【发布时间】:2020-04-24 20:11:24
【问题描述】:
我需要从 cypress 场景开始期间发送的电子邮件中检索 url。
等待电子邮件并检索其中的 url 是一个异步任务,所以我创建了一个名为“readMail”的 cypress 插件:它将电子邮件地址作为输入,等待 gmail api 实际有一封电子邮件的收件人是这个地址,然后阅读邮件并返回一个解析包含在电子邮件正文中的 url 的承诺。此过程运行良好,因为来自插件的日志确实正确显示了提取的 url。
我的问题是让这个extractedUrl 可供以后用作参数,例如cy.visit(extractedUrl) :在task(...).then(...) 的主体之外,变量仍未设置。
代码如下:
it('should generate correct email', () => {
const recipientEmail: string = 'some@email.com';
const extractedUrl:string = '';
// ....scenario generating a email to 'some@email.com'.....
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实际上在下一个测试开始时具有正确的值,但这并不理想我想知道为什么。
感谢您的帮助!
【问题讨论】:
-
请注意,在 cypress UI 中,我可以看到 cypress 实际上正在等待任务几秒钟,然后记录“2:”。这就是为什么我无法将我的异步知识与它在 cypress 中的工作方式相匹配。
标签: javascript typescript promise task cypress