Cypress系列(39)- spread()、cloest()、getCookie() 命令详解

169 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

spread 作用

  • 将数组拆分为多个参数
  • 有点像 py 里面的 *array

语法格式

.spread(callbackFn)
.spread(options, callbackFn)

callbackFn

  • 回调函数
  • 将数组拆分后作为函数的多个参数

options 参数

timeout: 命令超时时间

正确用法

cy.getCookies().spread(() => {})

错误用法

// 不能直接他通过 cy 调用
cy.spread(() => {})

// locations() 返回的不是一个数组
cy.location().spread(() => {})

 

命令返回结果

返回回调函数的返回值

实际栗子

代码

运行结果

可以看到

  • spread 命令不会出现在命令日志中
  • spread 命令的回调函数的参数个数无论是多了还是少了都不会报错,少了不会获取后面的值,多了则是一个空值

cloest作用

获取匹配到的第一个DOM元素(无论是它本身还是它的祖先之一)

语法格式

.closest(selector)
.closest(selector, options)

options 参数

  • log: 是否将命令显示到命令日志中,默认 true
  • timeout: 命令超时时间

正确用法

// 找到离 td 标签元素最近的 .filled 元素
cy.get('td').closest('.filled') 

上一条命令返回的必须是一个 DOM 元素

错误用法

// 不能通过 cy 直接调用
cy.closest('.active')

// url() 返回的并不是 DOM 元素
cy.url().closest() 

命令返回结果

匹配成功的 DOM 元素

实际栗子

代码

测试结果

 cy.get()  找到的是一个 span 标签

作用

获取指定名称的 Cookie

语法格式

cy.getCookie(name)
cy.getCookie(name, options)

name 必传 

 

options 参数

  • log: 是否将命令显示到命令日志中,默认 true
  • timeout: 命令超时时间

正确用法

// 获取 token 这个 Cookie
cy.getCookie('token')

命令返回结果

返回一个 Cookie 对象,并且包含以下属性

  • domain
  • expiry (如果有)
  • httpOnly
  • name
  • path
  • sameSite (如果有)
  • secure
  • value

注意: 当找不到指定 Cookie 时,该命令会返回 null 

实际栗子

栗子一:直接访问网站

代码

  • 可以用 .should(exist) 判断 cookie 对象是否存在
  • 也可以用 .should('have.property') 判断这个 cookie 对象的某个属性是否包含指定的值
  • 最后用 .then() 暂存 cookie 对象,以便后续扩展使用

运行结果

getCookie 返回结果

一个 cookie 对象一定会包含上面的六个属性

栗子二:简单登录页面

代码

//<reference types="cypress" /R>

describe('getCookie 登录页面', function () {

    const username = 'jane.lane'
    const password = 'password123'

    before(function () {
        // 登录操作
        cy.visit("http://localhost:7079/login")
        cy.get("input[name=username]").type(username)
        cy.get("input[name=password]").type(password)
        cy.get("form").submit()
    })

    it('获取登录后的 cookie', function () {
        cy.getCookie("cypress-session-cookie")
            .should('exist')
            .should('have.property', 'domain', "localhost")
            .then((cookies) => {
                cy.log(cookies)
            })
    })
})

运行结果