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的那些坑。


今天就到这了。

相关文章
|
9月前
|
JavaScript 前端开发 程序员
程序员必备技能之JS模块化,改变你的JavaScript开发方式!(一)
程序员必备技能之JS模块化,改变你的JavaScript开发方式!
|
6月前
|
测试技术 Python
解锁Python魔法!装饰器:让你的代码翩翩起舞,简化繁琐逻辑,让编程成为一场戏剧性的华丽变身!
【8月更文挑战第21天】在Python编程中,当需要为函数添加如日志记录、性能测试等功能时,手动重复编写相同代码既冗长又难维护。装饰器提供了解决方案:它是一种特殊函数,包裹目标函数以添加额外功能,而不改变原函数结构。装饰器增强了代码复用性、解耦及灵活性。例如,可通过装饰器轻松记录函数执行时间。更高级用法包括带参数的装饰器、多层装饰器以及使用类作为装饰器。掌握装饰器能显著提升Python代码的质量和效率。
61 5
|
6月前
|
搜索推荐 API 数据库
揭秘!Bottle框架如何以极简之力,解锁高效Web开发新纪元?一行代码,改变你的开发世界!
【8月更文挑战第31天】当你踏入Web开发领域,是否渴望找到一款既高效又简洁的框架?Bottle正是这样一款用Python编写的轻量级WSGI框架,以其紧凑的核心代码、简洁的API和易上手特性脱颖而出,非常适合小型项目和快速原型开发。它通过直观的路由系统、内置HTTP请求/响应封装及多种模板引擎支持高效开发。
60 0
|
6月前
|
Web App开发 前端开发 JavaScript
灵魂拷问-前端的作用--chrome插件篇
本文会从浏览器插件应用场景切入,穿插插件基础能力和常见入口的介绍,核心回答如下三个问题:插件可以被使用在哪些场景?不同的使用场景我们的主要代码实现思路是怎样的?我们可以从哪些角度入手自己开发一款可以落地实用的浏览器插件?
|
9月前
|
Web App开发 JavaScript 前端开发
程序员必备技能之JS模块化,改变你的JavaScript开发方式!(二)
程序员必备技能之JS模块化,改变你的JavaScript开发方式!
|
9月前
|
测试技术
Cypress哪些独特的地方
Cypress哪些独特的地方
|
前端开发 测试技术 API
干掉丑陋的 Swagger,堪称开发者的瑞士军刀
“为什么改了这个没告诉我”,“实际功能和文档上说的不一样啊”。这些话大家做开发的想必耳朵都听出老茧了。真不是故意的,有时候任务比较急,就先改了代码,想着以后再同步文档,然后就给忘了。项目更新又全靠社交软件通知,人一多难免有一两个没及时沟通到的。确实给合作的小伙伴带来麻烦,但说实话开发商也挺委屈的。
|
JavaScript 前端开发 开发工具
简简单单一个vite⚡⚡插件搞定用户的另类需求——自给自足的感觉真好
简简单单一个vite⚡⚡插件搞定用户的另类需求——自给自足的感觉真好
|
存储 JavaScript 前端开发
20个JS精简代码无形装逼集合,最为致命,记得收藏好
20个JS精简代码无形装逼集合,最为致命,记得收藏好
|
Web App开发 JSON JavaScript
仅20+行核心代码的Chrome插件,这不是有手就行吗?(上)
大家好,我是零一,不知道你们有没有开发过Chrome插件,但你们一定用得很多。其实Chrome插件的开发一点都不麻烦,基本就是有手就行,一个功能极简的插件核心代码也就不过30行左右。那你还怕不会插件的开发吗? 本文将手把手(真 · 手把手)介绍Chrome插件的开发,并末尾附带一个插件实战教学
418 0
仅20+行核心代码的Chrome插件,这不是有手就行吗?(上)