Cypress系列(24)- wait()、then()、and()命令详解

587 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

wait作用

等待数毫秒或等待别名资源解析,然后再继续执行下一个命令

 

语法格式

cy.wait(time)
cy.wait(alias)
cy.wait(aliases)
cy.wait(time, options)
cy.wait(alias, options)
cy.wait(aliases, options)

 

参数讲解

 

正确格式

cy.wait(500)
cy.wait('@getProfile')

 

wait() 命令返回的对象

当传了 time 时

cy.wait() 产生与上一个命令相同的主题

 

当传了 alias 时

cy.wait() 产生一个对象,其中包含 XHR 的 HTTP 请求和响应属性

 

等待一个别名的栗子

it.skip('栗子1', function () {
    cy.server()
    cy.route({
        url: '**/login',
        status: 503,
        response: {
            success: false,
            data: 'Not success'
        },
    }).as("login")
    cy.get("input[name=username]").type(username)
    cy.get("input[name=password]").type(`${password}{enter}`)

    // 等待请求的响应
    cy.wait('@login').then((res) => {
        // 针对响应进行断言
        expect(res.status).to.eq(503)
        expect(res.responseBody.data).to.eq('Not success')
        expect(res.responseHeaders).to.have.property('x-token', 'abc-123-foo-bar')
    })
});

 

等待别名数组的栗子

当将别名数组传递给 cy.wait() 时,Cypress 将等待所有请求在给定的 requestTimeout 和 responseTimeout 内完成

cy.server()
cy.route('users/*').as('getUsers')
cy.route('activities/*').as('getActivities')
cy.route('comments/*').as('getComments')
cy.visit('/dashboard')

cy.wait(['@getUsers', '@getActivities', '@getComments']).then((xhrs) => {
  // xhrs现在将是匹配的XHR的数组
  // xhrs[0] <-- getUsers 的响应
  // xhrs[1] <-- getActivities 的响应
  // xhrs[2] <-- getComments 的响应
})

then作用

  • 在 Cypress 中,保存一个值或者引用的最好方式是使用闭包
  • then() 就是 Cypress 对闭包的一个典型应用
  • then() 返回的是上一个命令的结果,并将其注入到下一个命令中

 

语法格式

.then(callbackFn)
.then(options, callbackFn)

 

参数说明

  • options: 只有 timeout,4000ms
  • callbackFn: 回调函数,需要将上一个命令的结果作为参数进行传递

 

实际栗子

then 回调函数最简单的两种写法

第一种是箭头函数,第二种就是普通声明函数的方式

 

通过 then 和 should 比较文本是否相等

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

www.cnblogs.com/poloyy/cate…

 

and作用

  • 创建一个断言,断言将自动重试,直到它们通过或超时
  • 和 should() 一个用法

 

语法格式

.and(chainers)
.and(chainers, value)
.and(chainers, method, value)
.and(callbackFn)

 

参数说明

  • chainers: 断言器
  • value: 需要断言的值
  • method: 需要调用到的方法
  • callbackFn: 回调方法,可以满足自己想要断言的内容;且总是返回前一个 cy 命令返回的结果,方法内的 return 是无效的;会一直运行直到里面没有断言

 

and() 返回的结果

在大多数情况下,.and() 返回与上一个命令相同的结果

cy
  .get('nav')                       // 返回 <nav>
  .should('be.visible')             // 返回 <nav>
  .and('have.class', 'open')        // 返回 <nav>

 

但是,某些 chainer 会改变返回的结果

cy
  .get('nav')                       // 返回 <nav>
  .should('be.visible')             // 返回 <nav>
  .and('have.css', 'font-family')   // 返回 'sans-serif'
  .and('match', /serif/)            // 返回 'sans-serif'

 

简单的栗子

对同一结果操作的栗子(button 元素)

cy.get('button').should('have.class', 'active').and('not.be.disabled')

 

chainer 改变返回结果的栗子

html 代码

  <li>
    <a href="users/123/edit">Edit User</a>
  </li>

 

cypress 代码

cy
  .get('a')
  .should('contain', 'Edit User') // 返回的是 <a>
  .and('have.attr', 'href')       // 返回的是 href 的值
  .and('match', /users/)          // 返回的是 href 的值
  .and('not.include', '#')        // 返回的是 href 的值

 

method + value 参数的栗子

断言 href 属性值是否等于 /users

cy
  .get('a')
  .should('have.class', 'active')
  .and('have.attr', 'href', '/users')