Cypress的那些独特的地方

简介: 大家好,我是阿萨。12月是学习的好时机。大家一起加油。好好学习,天天向上。Cypress的基本用法基本都讲解完了。这一期,总结下Cypress 比其他 Web UI 自动化更好的地方。

一,闭包(Closure)


Cypress 中, 保存一个值或者引用对的最好方式是使用闭包。其中then 就是Cypress的典型应用。


先介绍一个场景: 有个button, 在点击了提交按钮后,这个button的文本会 变化。 然后我们写一个用例来比较下 form 提交后,button 会变化的场景。


代码如下:


it('test then', function() {
 cy.get('btn').then(($btn)=>{const txt=$btn.text()
            cy.get('form').submit()
                cy.get('btn').should(($btn2)=>{          
                expect($btn2.text()).not.to.eq(txt) 
            }) 
            })
    })


二, 变量和别名。


Cypress 可以使用wrap 或者as 变量去给元素赋值或者实现变量共享。


1. wrap

我们先看wrap 的典型使用场景。

通过wrap 传递变量。


const getName =()=>{return 'Sarah'        }
cy.wrap({name:getName}).invoke('name').should('eq','Sarah')


来看看wrap的语法:


cy.wrap(subject)cy.wrap(subject, options)


常见用法,除了上面的例子,还有如下2种;


cy.get('form').within(($form) => {// ... more commands
  cy.wrap($form).should('have.class', 'form-container')})


cy.get('button').then(($button) => {// $button is a wrapped jQuery elementif ($button.someMethod() === 'something') {// wrap this element so we can// use cypress commands on it    cy.wrap($button).click()  } else {// do something else  }})


// import application code for logging inimport { userService } from '../../src/_services/user.service'
it('can assert against resolved object using .should', () => {  cy.log('user service login')const username = Cypress.env('username')const password = Cypress.env('password')
// wrap the promise returned by the application code  cy.wrap(userService.login(username, password))// check the yielded object    .should('be.an', 'object')    .and('have.keys', ['firstName', 'lastName', 'username', 'id', 'token'])    .and('contain', {      username: 'test',      firstName: 'Test',      lastName: 'User',    })
// cy.visit command will wait for the promise returned from// the "userService.login" to resolve. Then local storage item is set// and the visit will immediately be authenticated and logged in  cy.visit('/')// we should be logged in  cy.contains('Hi Test!').should('be.visible')})


2.as

as 是用来分配别名供以后使用。

语法:


.as(aliasName)


常见用法:


cy.get('.main-nav').find('li').first().as('firstNav') // Alias element as @firstNavcy.intercept('PUT', '/users').as('putUser') // Alias route as @putUsercy.stub(api, 'onUnauth').as('unauth') // Alias stub as @unauthcy.spy(win, 'fetch').as('winFetch') // Alias spy as @winFetch


给元素加个别名


it('disables on click', () => { 
cy.get('button[type=submit]').as('submitBtn')  
cy.get('@submitBtn').click().should('be.disabled')})


对用cy.intercept()定义的被拦截路由进行别名,然后使用cy.wait()等待别名路由。


cy.intercept('PUT', '/users', { fixture: 'user' }).as('editUser')
// we'll assume submitting `form` triggers a matching request
cy.get('form').submit()
// once a response comes back from the `editUser`// this `wait` will resolve with the subject containing `url`
cy.wait('@editUser').its('url').should('contain', 'users')


说白了, 这2个传递变量的方式就是为了规避Cypress的异步执行的坑。


明天讲解Cypress的那些坑。


今天就到这了。

相关文章
|
5月前
|
算法 Java 开发者
探索代码世界:我的编程之旅
在数字时代的浪潮中,编程已成为一门艺术和科学的结合体。本文将带领读者穿梭于代码的迷宫,分享个人的技术感悟,从初识编程的迷茫到深入其境的喜悦,探讨如何通过编程解决实际问题,以及编程带来的思维转变和生活影响。文章旨在为编程初学者提供一盏指路灯,同时也为资深开发者带来共鸣。
|
4月前
|
Python
揭秘!Python系统编程里那些让代码自由穿梭的神奇代码行
【9月更文挑战第9天】在Python的世界里,一些简洁的代码行却蕴含着强大的功能,如列表推导式让列表生成仅需一行代码:`squares = [x**2 for x in range(10)]`。`with`语句则能自动管理文件和网络连接的关闭,如`with open('example.txt', 'r') as file:`。`lambda`函数和装饰器则允许快速定义函数和增强功能,而上下文管理器更是资源处理的利器。这些特性让Python代码更加优雅高效。
35 4
|
5月前
|
测试技术 Python
解锁Python魔法!装饰器:让你的代码翩翩起舞,简化繁琐逻辑,让编程成为一场戏剧性的华丽变身!
【8月更文挑战第21天】在Python编程中,当需要为函数添加如日志记录、性能测试等功能时,手动重复编写相同代码既冗长又难维护。装饰器提供了解决方案:它是一种特殊函数,包裹目标函数以添加额外功能,而不改变原函数结构。装饰器增强了代码复用性、解耦及灵活性。例如,可通过装饰器轻松记录函数执行时间。更高级用法包括带参数的装饰器、多层装饰器以及使用类作为装饰器。掌握装饰器能显著提升Python代码的质量和效率。
57 5
|
5月前
|
算法 数据处理 数据库
探索代码世界的魔法:我的编程之旅
【8月更文挑战第31天】 在编程的世界里,每一行代码都像是施法的咒语,拥有改变数字世界的力量。本文将带你走进一个初学者眼中的编程世界,一起感受从零开始构建项目的兴奋与挑战。通过分享个人的学习经历和心得,我们将探讨编程基础、项目实践以及持续学习的重要性,同时提供实用的代码示例,旨在激励和指导编程新手开启自己的技术探索之旅。
|
5月前
|
人工智能 算法 安全
代码之诗:我的编程之旅
在数字世界的无限画布上,每一行代码都是一笔精细的勾勒,每一个算法都是深邃的思考。本文是一次个人技术感悟的分享,从初识编程的困惑与好奇到深入掌握后的创造与热情,再到对技术趋势的洞察与适应,我试图将编程比作一首诗,通过个人经历展现编程艺术的魅力和挑战,并探讨如何持续学习以适应不断变化的技术环境。
|
5月前
|
算法 程序员
代码间的诗篇:我的编程之旅
【8月更文挑战第5天】 在数字世界中,编程不仅仅是一项技术活动,它更像是一种艺术。本文将通过个人经历探索编程的美学,从初识编程的困惑到逐渐掌握后的成就感,再到深刻理解代码背后的逻辑美。我们将一起走进编程的世界,感受它在解决问题、创造新事物中的魅力,以及它如何影响我们的生活和思维方式。
43 0
|
8月前
|
测试技术
Cypress哪些独特的地方
Cypress哪些独特的地方
|
存储 JavaScript 前端开发
20个JS精简代码无形装逼集合,最为致命,记得收藏好
20个JS精简代码无形装逼集合,最为致命,记得收藏好
|
JavaScript
JS之用面向对象和传统过程式编程
改写成面向对象时,可先将普通函数变型,再改成面向对象。 普通方法变型 普通方法变型,变型有3个原则 1)尽量不要出现函数嵌套函数 2)可以用全局变量 3)把onload中不是赋值的语句放到单独函数中 如下代码中,完成了普通函数的变型。
106 0
JS之用面向对象和传统过程式编程
|
存储 Web App开发 编解码
对Web设计和开发人员有用的15个Chrome插件
导读:原文作者Brian在freelancefolder.com发表了一篇《15 Useful Google Chrome Extensions for Web Designers and Developers》,由伯乐在线敏捷翻译组编译,文章介绍了非常有用的15个Chrome插件。
1540 0