赛普拉斯:根据任务结果设置变量

bu

我需要从赛普拉斯场景开始期间发送的电子邮件中检索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在下一个测试开始时实际上具有正确的值,但这并不理想,我想了解原因。谢谢你的帮助 !

JDCL32

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使用异步和等待

更新#1:

您也可以使用别名来访问值:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

赛普拉斯中的路径变量

来自分类Dev

如何在赛普拉斯中使用变量

来自分类Dev

赛普拉斯在挂钩之间共享变量/别名?

来自分类Dev

不能引用赛普拉斯全局变量

来自分类Dev

赛普拉斯移动滑块

来自分类Dev

赛普拉斯录音的秘密掩盖

来自分类Dev

赛普拉斯模块安装失败

来自分类Dev

上传图像[赛普拉斯]

来自分类Dev

赛普拉斯导入规格文件

来自分类Dev

赛普拉斯不重试断言

来自分类Dev

赛普拉斯劈弦测试

来自分类Dev

赛普拉斯移动滑块

来自分类Dev

赛普拉斯断言颜色

来自分类Dev

赛普拉斯布尔声明

来自分类Dev

赛普拉斯请求重试

来自分类Dev

赛普拉斯命令日志截断

来自分类Dev

赛普拉斯-排除之前的测试

来自分类Dev

赛普拉斯如果比较对象

来自分类Dev

赛普拉斯请求默认等待?

来自分类Dev

在赛普拉斯中何时使用自定义命令与任务?

来自分类Dev

赛普拉斯-如何在赛普拉斯中进行轮询?

来自分类Dev

赛普拉斯-如何在赛普拉斯中进行轮询?

来自分类Dev

如何在赛普拉斯中重复动作并获得每个动作的结果

来自分类Dev

赛普拉斯graphql apollo调用没有结果并自动重试

来自分类Dev

设置赛普拉斯IO以在Quasar Framework上使用dotenv

来自分类Dev

设置值与UI交互。赛普拉斯应用程序动作

来自分类Dev

如何保存变量/文本以供以后在赛普拉斯测试中使用?

来自分类Dev

如何在赛普拉斯的某些变量中存储日期

来自分类Dev

赛普拉斯 不能在每个循环内更改变量