前言
来啦老铁!
今天是国庆第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 这个钩子:
- 如果要设置所有的浏览器 cookie,需要在登录后用 cy.getCookies().each ... 这种方式先记录 cookie 名称,然后在 beforeEach 中使用 Cypress.Cookies.preserveOnce() 方法;
- 如果 cookie 名已明确,则可以直接在 beforeEach 中使用,如:
Cypress.Cookies.preserveOnce("token");
好了,写文章到深夜1 ~ 2点了,对得起前几天玩到深夜1 ~ 2点的愧疚感了,加油骚年~
如果本文对您有帮助,麻烦动动手指点点赞?
谢谢!
网友评论