Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

如果想从头学起Cypress,可以看下面的系列文章哦

https://www.cnblogs.com/poloyy/category/1768839.html

 

Cypress.Cookies 共有三个命令

Cypress.Cookies.debug(enable, options)

Cypress.Cookies.preserveOnce(names...)

Cypress.Cookies.defaults(options)

 

Cypress.Cookies.debug(enable, options)

作用

  • 是否启用 Cookie 调试功能
  • 更加易于了解 Cypress 是如何操作 Cookie 的

 

参数讲解

enable

  • true:启用,默认,启用后在开发者工具(F12)的 Console 中可以看到详细的 Cookie 操作日志
  • false:不启用,Console 不会显示 Cookie 操作日志

 

options

verbose:是否详细打印 Cookie 操作日志,默认 true

 

栗子一

代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

 

运行结果(Console)

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

能看到设置和清除 Cookie 都有详细的操作日志

  

栗子二

代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

 

运行结果(Console)

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

只显示 Cookie 名称,不会显示 Cookie 对象

 

栗子三

代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

 

运行结果(Console)

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

没有 Cookie 的操作日志

 

Cypress.Cookies.preserveOnce(names...)

前言知识

之前也讲过,Cypress 会在每次测试前自动清除所有 Cookie,以防止在测试用例之间共享状态

 

Cypress 为啥要自动清除 Cookie?

  • 通过在每次测试之前清除 Cookie,可以确保始终从干净状态开始测试
  • 从一个干净的状态开始,可以防止测试用例彼此耦合,也可以防止在一项测试中对应用程序中的某些内容进行更改而影响下游的情况

 

实际场景

如果不保存 Cookie,则每次测试前都需要登录一次,这将大大浪费不必要的测试时间

 

Cypress 如何保存 Cookie

  •  Cypress.Cookies.preserveOnce(names...) 命令可以保存 Cookie,使它在多个测试用例间共享
  • 注意:目前如果使用的是基于 Session 的 Cookie,此命令有效

 

实际使用的模板

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

 

实际栗子

测试用例代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

两个测试用例,主要校验是否 Cookie 是否能共享

 

commands.js 代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

自定义了一个 login 方法,主要就是登录操作 

 

运行结果

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

Cookie 成功在多个测试用例之间共享

 

Cypress.Cookies.defaults(options)

作用

  • 设置全局默认 Cookie
  • 可以修改全局默认值并保留一组 Cookie,这些 Cookie 将始终在测试用例之间保留
  • 只要调用了这个方法,将在其他测试用例中都会生效

 

重点

  • 在 cypress/support/index.js 中配置此命令是绝佳选择
  • 因为它会在所有测试文件之前加载

 

options 讲解

只有一个 preserve 参数,接受下面四种数据类型

  • String
  • Array
  • RegExp
  • Function

 

使用方式

// 所有名为 cypress-session-cookies 将不会被清除
Cypress.Cookies.defaults({
    preserve: 'cypress-session-cookies'
})

// 所有名为 cypress-session-cookies 或 sessions_id 将不会被清除
// 多个 Cookie 可以用数组来存储
Cypress.Cookies.defaults({
  preserve: ['sessions_id', 'cypress-session-cookies']
})

// 满足此正则表达式的 Cookie 将不会被清除
Cypress.Cookies.defaults({
  preserve: /session|cookie/
})

Cypress.Cookies.defaults({
  preserve: (cookie) => {
    // 可以在这里实现自己的逻辑
    // 如果函数返回 true, 那 Cookie 则不会被清除
  }
})

一般用前三个就能满足大部分场景了

 

实际栗子

测试用例代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

 

support/index.js 代码

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

  • 使用正则表达式去匹配
  • 含义:cookie 名称包含 session 或 cookie

 

运行结果

Cypress系列(90)- Cypress.Cookies 命令详解以及如何跨测试用例共享 Cookies

Cookie 也共享成功了

 

总结

  • 这种方式感觉更适合在项目中使用
  • 一般我们都会提前知道需要的 Cookie 是什么,此时就能提前在 support/index.js 中调用此命令去设置 Cookie 了

 

上一篇:查看当前浏览器中的cookies工具---使用chrome插件EditThisCookie


下一篇:游戏隐私政策