美文网首页
Cypress中使用Cypress.Cookies.preser

Cypress中使用Cypress.Cookies.preser

作者: 狄仁杰666 | 来源:发表于2021-10-04 02:18 被阅读0次

    前言

    来啦老铁!

    今天是国庆第3天,再一次祝大家国庆快乐,祝祖国繁荣昌盛~

    这个国庆其实还蛮无聊的,这是因为厦门现在还处于疫情的“扫尾期”,还不能到处玩~
    这样的假期给我的另一个感想是:人的熬夜的潜力其实很大!
    怎么说呢,就是看视频玩手机可以玩到深夜1 ~ 2点,那么咱们是不是可以花点时间来学习呢?
    开个玩笑哈~

    今天有个朋友向我问了个 Cypress 相关的问题,问题是这样的,这位朋友想跨用例保持浏览器会话,即用例1执行完成后,用例2不用再执行登录就能完成脚本运行,并且向我抛出了 Cypress 在这方面的现有API:

    • Cypress.Cookies.preserveOnce("XXX")

    其中 XXX 是指我们要保存的 cookie 名称;

    笔者在许久许久以前有用过,本着乐于助人的想法,帮忙看下吧,没想到,这个问题调查起来竟然没那么容易,而且网上的一些文章也没有提到 Cypress.Cookies.preserveOnce() 最正确的用法是什么样的,因此特地记录一下;

    1. 原代码(伪代码)

    describe('This is a test suite', () => {
        let url = 'xxx 网址';
    
        before(() => {
            cy.log("This is before");
        })
    
        it("This is test case 1", () => {
            // login
    
            // preserveOnce
            Cypress.Cookies.preserveOnce("token");
            
            // cookie 1
        })
    
        it("This is test case 2", () => {
            // cookie 2
        })
    })
    

    结果发现,每次执行到用例2的时候,都会自动调用一下 /logout?redirect_url=xxx 这个 API,导致后续的操作都是在登出的情况下操作的,与我们想要的效果完全不一样~

    自动登出

    经过1个多小时的调查,才终于找到问题所在~

    2. 修改后(伪代码)

    describe('This is a test suite', () => {
        let url = 'xxx 网址';
        let cookies = []
    
        before(() => {
            cy.log("This is before");
    
            // login
        })
    
        beforeEach(() => {
            for(c in cookies){
                Cypress.Cookies.preserveOnce(cookies(c));
            }
        })
    
        it("This is test case 1", () => {
            //  collect cookies' names
            cy.getCookies().each((cookie) => {
                cookies.push(cookie.name);
            })
            
            // cookie 1
        })
    
        it("This is test case 2", () => {
            // cookie 2
        })
    })
    

    这样改完之后,执行到用例2的时候,就不会再登出的情况下执行了,查看浏览器的Network方面的情况,发现 /logout?redirect_url=xxx 这个 API 也没有在用例2执行的时候执行了,与我们的预期一致,问题得到解决~

    3. 结论

    Cypress.Cookies.preserveOnce() 方法正确的使用地方应该是在 beforeEach 这个钩子:

    1. 如果要设置所有的浏览器 cookie,需要在登录后用 cy.getCookies().each ... 这种方式先记录 cookie 名称,然后在 beforeEach 中使用 Cypress.Cookies.preserveOnce() 方法;
    2. 如果 cookie 名已明确,则可以直接在 beforeEach 中使用,如:
    Cypress.Cookies.preserveOnce("token");
    

    好了,写文章到深夜1 ~ 2点了,对得起前几天玩到深夜1 ~ 2点的愧疚感了,加油骚年~

    如果本文对您有帮助,麻烦动动手指点点赞?

    谢谢!

    相关文章

      网友评论

          本文标题:Cypress中使用Cypress.Cookies.preser

          本文链接:https://www.haomeiwen.com/subject/ooisbktx.html