Cypress安装与使用教程(2)—— 软测大玩家

在这里插入图片描述

 
 

在这里插入图片描述
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。
📡主页地址:【Austin_zhai】
🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。
💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家私信,有空必回。

在这里插入图片描述

 
 

阅读目录

  • 1. 接上回
  • 2. 钩子函数
    • 2.1 before() 与 beforeEach()
    • 2.2 after() 与 afterEach()
  • 3. 元素定位
    • 3.1 contains
    • 3.2 get
  • 4. 遍历元素
    • 4.1 遍历列表中的元素
    • 4.2 遍历一组元素并执行操作
    • 4.3 过滤元素并遍历
    • 4.4 在特定的父元素中进行遍历
    • 4.5 逐级遍历
  • 5. 后话

1. 接上回

在这里插入图片描述
  在上一篇 《Cypress安装与使用教程(1)—— 软测大玩家》,我们熟悉了Cypress的一些基本安装与使用的方法。对于一些E2E的测试场景,该软件的业务落地表现还是比较让人满意的。接下来我们将在之前的基础上来认识一些日常高频的Cypress使用技巧。

 
 

2. 钩子函数

在这里插入图片描述
  在Cypress中,钩子函数(Hooks)的作用是可以让我们在不同的测试生命周期阶段执行特定的代码,以便进行全局的设置、准备工作或清理工作。如果要确保测试用例在不同阶段的执行过程中能保证其目的正确性、可维护性和可靠性的话,钩子函数则是我们的不二之选。

 

2.1 before() 与 beforeEach()

  使用before()和beforeEach()钩子函数可以在测试运行之前执行一些全局的设置和准备工作。包括创建测试数据、启动应用程序、设置测试环境等。

before()

before(() => {// 在所有测试运行之前执行的代码
});

beforeEach()

beforeEach(() => {// 在每个测试运行之前执行的代码
});

 

2.2 after() 与 afterEach()

  使用这两个函数可以在测试运行之后执行一些全局的清理工作。比如测试完成后进行清理测试数据、关闭应用程序、还原测试环境。

after()

after(() => {// 在所有测试运行之后执行的代码
});

afterEach()

afterEach(() => {// 在每个测试运行之后执行的代码
});

 

  另外,我们在使用钩子函数时可以允许你在测试生命周期中共享状态。只需要在before()中设置一些全局变量,然后在各个测试用例中使用。这样我们就可以达到即使在不同的测试之间传递信息,确保测试的一致性;

 

接下来我们来看一段代码,其中包含了相关的钩子函数的使用方法。

before(() => {// 登录操作,确保测试前用户已登录cy.visit('https://www.rubies-fund.com/login');cy.login('your_username', 'your_password');
});// 在每个测试运行之前执行的代码,例如导航到基金购买页面
beforeEach(() => {// 导航到基金购买页面cy.visit('https://example.com/invest/funds');
});// 在每个测试运行之后执行的代码,例如清理购买时的状态
afterEach(() => {// 清理购买操作的状态,确保下一次测试开始前的干净状态cy.clearFundPurchaseState();
});// 在所有测试运行之后执行的代码,例如退出登录
after(() => {// 退出登录,确保测试结束后用户已退出cy.logout();
});// 实际的测试用例
describe('Fund Purchase Demo', () => {it('should allow the user to purchase a fund', () => {// 这里编写测试购买基金的代码cy.purchaseFund('FundABC', 1000); // 示例购买基金 'FundABC',金额为 1000cy.verifyPurchaseSuccess(); // 验证购买是否成功});it('should display correct fund details after purchase', () => {// 这里编写测试购买后基金详情是否正确显示的代码cy.purchaseFund('FundXYZ', 500); // 示例购买基金 'FundXYZ',金额为 500cy.navigateToFundDetails('FundXYZ'); // 导航到购买后的基金详情页面cy.verifyFundDetails('FundXYZ', 500); // 验证基金详情是否正确显示});
});

从以上的代码我们可以看到比较明显的业务流程,其中的每个测试用例都包含了一些关于基金购买的操作,比如购买基金和验证购买结果。通过使用钩子函数,可以确保测试在执行前后的状态的一致。

 
 

3. 元素定位

在这里插入图片描述
  既然涉及到web的E2E测试,那元素定位依然是一个无法回避的问题,它是告诉测试脚本在页面上找到并与之交互的特定元素的方法。这就像在页面中找到你想要点击、输入或验证的那个按钮或文本框一样。定位元素的方式虽然没有selenium与appium那样多样化,但也已经足够我们使用了。

 

3.1 contains

  这个关键字相信大家都不会陌生,我们可以通过contains来进行页面元素的模糊匹配,使用方法如下。

比如在页面上我们需要定位一个名叫"支付"的按钮,可以直接使用contains+关键字的方式来进行定位。

cy.contains('支付'); 

 

3.2 get

  利用元素的一些特定属性(class,id,css_selector)等来进行定位。

例如按钮的类名为fg-button,id名为trade-ned,我们就可以使用以下的方式来进行准确的定位。

cy.get('.fg-button');
cy.get('#trade-ned'); 

除此之外,我们还可以进行属性的自定义组合或索引,来更加快速高效的找到元素。

cy.get('[data-testid="dep-button"]'); 

找列表中的第三个元素

cy.get('ul li:eq(2)'); 

根据父子关系

cy.get('.parent-class').find('.child-class');

 

  接下来我们用一段html代码来具体演示一下各类元素定位的方式

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Element Locators Demo</title>
</head>
<body><h1>Welcome to the Element Locators Demo</h1><div id="container"><button class="my-button" data-testid="submitBtn">Submit</button><ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul></div><form><label for="username">Username:</label><input type="text" id="username" name="username"><label for="password">Password:</label><input type="password" id="password" name="password"><button class="my-button" id="loginBtn">Login</button></form><footer><p>Contact us at: <a href="mailto:info@example.com">info@example.com</a></p></footer>
</body>
</html>
// 通过文本的方式进行定位
it('should locate button by text content', () => {cy.contains('Submit').click();
});// 通过id名的方式来进行定位
it('should locate login button by ID', () => {cy.get('#loginBtn').click();
});// 通过类名的方式进行定位
it('should locate button by class name', () => {cy.get('.my-button').click();
});// 通过自定义属性的方式进行定位
it('should locate button by data-testid attribute', () => {cy.get('[data-testid="submitBtn"]').click();
});// 通过索引定位的方式进行定位
it('should locate list item by index', () => {cy.get('ul li:eq(1)').should('contain', 'Item 2');
});// 通过父子关系的方式来进行定位
it('should locate input field by parent-child relationship', () => {cy.get('form').find('#username').type('myUsername');
});

 
 

4. 遍历元素

在这里插入图片描述
  在E2E测试中,我们有时需要在页面中对于元素进行循环操作或查找,那么元素遍历就像是你在超市里逛逛,检查每个过道的商品一样,以达到在页面上循环查找和交互多个元素的效果。

 

4.1 遍历列表中的元素

使用 .each() 来遍历列表中的元素

cy.get('ul li').each(($item, index) => {cy.log(`Item ${index + 1}: ${$item.text()}`);
});

 

4.2 遍历一组元素并执行操作

同样是使用.each() 来遍历一组元素并进行特定的操作

// 点击每一个元素的商品
cy.get('.product').each(($product) => {cy.wrap($product).click(); 
});

 

4.3 过滤元素并遍历

我们使用.filter() 来进行元素的过滤并进行遍历

cy.get('.product').filter('.vegetables').each(($vegetable) => {cy.log(`Found a vegetable: ${$vegetable.text()}`);
});

 

4.4 在特定的父元素中进行遍历

使用.find() 在指定的父元素中进行遍历与查找

cy.get('.room').find('.person').each(($person) => {cy.log(`Found a person: ${$person.text()}`);
});

 

4.5 逐级遍历

使用.each() 进行逐级遍历,当然这里是需要用到嵌套才能达到这样的效果

cy.get('.building').each(($floor) => {cy.wrap($floor).find('.room').each(($room) => {cy.log(`Found a room: ${$room.text()}`);});
});

 
 

5. 后话

  以上就是一些Cypress的高频使用技巧,另外我们在使用的时候也需要注意一些特定的情况,比如使用钩子函数时可能会出现异步操作,特别是一些比较耗时的网络访问业务操作,可以在我们的脚本中有针对性的等待前置操作完成再执行所需要的操作等步骤。在我们的元素遍历中,如果能提前做好一些异常的处理的话,可以让我们的元素操作更为的健壮,其实无论是何种自动化脚本来说,这些都是必须考虑进去的重要因素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库字段名和sql关键字冲突报错解决方法

1、修改实体类字段映射。注解里加反引号 2、sql字段上加反引号 3、问题解决

ue5材质预览界面ue 变黑

发现在5.2和5.1上都有这个bug 原因是开了ray tracing引起的&#xff0c;这个bug真是长时间存在&#xff0c;类似的bug还包括草地上奇怪的影子和地形上的影子等等 解决方法也很简单&#xff0c;就是关闭光追&#xff08;不是…… 就是关闭预览&#xff0c;在材质界面preview sc…

C# WPF上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;有一种很重要的控件&#xff0c;那就是表格。大家可以想象下&#xff0c;办公软件里面是不是就有一个专门做表格的软件&a…

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…

本地部署语音转文字(whisper,SpeechRecognition)

本地部署语音转文字 1.whisper1.首先安装Chocolatey2.安装3.使用 2.SpeechRecognition1.环境2.中文包3.格式转化4.运行 3.效果 1.whisper 1.首先安装Chocolatey https://github.com/openai/whisper 以管理员身份运行PowerShell Set-ExecutionPolicy Bypass -Scope Process -…

LeetCode刷题--- 二叉树剪枝

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

NFTScan | 12.04~12.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.12.04~ 2023.12.10 NFT Hot News 01/ NFTScan 与 MintCore 联合推出适用于 NFT 的 Layer2 网络 Mint 12 月 5 日&#xff0c;根据官方消息&#xff0c;NFT 基础设施服务商 NFTScan …

NFC物联网解决方案应用实例:基于NFC的通用物流链防伪溯源

NFC物联网系统解决方案已在某局进行推广应用&#xff0c;给出了某省内出口蔬菜水果检验检疫监管的物联网解决方案。 依据相关法规&#xff0c;出口蔬菜必须在质检总局注册种植基地进行种植&#xff0c;出口前按批次向产地检验检疫部门进行申报&#xff0c;按时在集中监管区统一…

Python+selenium自动化生成测试报告

前言 批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导…

SpringBoot系列之基于Jedis实现分布式锁

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境&#xff0c;我们使用最多的是juc包里的单机锁&#xff0c;但是随着微服务分布式项目的普及&#xff0c;juc里的锁是不能控制分布锁环境的线程安全的&#xff0c;因为单机锁只能控制同个进程里的线程安全&…

Java实现选择排序及其动图演示

选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的元素中选出最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放到已排序的序列的末尾。具体步骤如下&#xff1a; 首先&#xff0c;找到未排序序列中的最小&#xff08;或最大&#xff09;元素&a…

PyInstaller 打包 Python 脚本为 .exe 可执行文件闪退、No Model named XXX问题

文章目录 前言.exe 可执行文件闪退No Model named XXXPython 环境问题查看当前python路径查看当前python环境使用的site-package路径 个人简介 前言 在上一篇文章中&#xff0c;我们介绍了如何将 Python 脚本打包为 .exe 可执行文件&#xff0c;但有时候打包生成的 .exe 文件会…

记录hive/spark取最新且不为null的方法

听标题可能听不懂我想表达的意思&#xff0c;我来描述一下我要做的事&#xff1a; 比如采集同学对某一网站进行数据采集&#xff0c;同一个用户每天会有很多条记录&#xff0c;所以我们要取一条这个用户最新的状态&#xff0c;比如用户改了N次昵称&#xff0c;我们只想得到最后…

MATLAB代码:含电热联合系统的微电网运行优化

微♥关注“电击小子程高兴的MATLAB小屋”获取专属优惠 说明书 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网 电热联合系统 优化调度 参考文档&#xff1a;《含电热联合系统的微电网运行优化》完全复现 仿真平台&#xff1a;MATLAB yalmi…

2024年AI云计算专题研究报告:智算带来的变化

今天分享的人工智能系列深度研究报告&#xff1a;《2024年AI云计算专题研究报告&#xff1a;智算带来的变化》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;32页 Al 云计算 2024:关注智算带来的新变化 通过对海内外主要云厂商及其产业链…

C# WPF上位机开发(日志调试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 程序开发的过程中&#xff0c;调试肯定是少不了的。比如说&#xff0c;这个时候&#xff0c;我们可以设置断点、查看变量、检查函数调用堆栈等等。…

目标检测锚框

目标检测锚框 最开始呢&#xff0c;我们需要先介绍一下框&#xff0c;先学会一下怎么画框 导入所需要的包 from PIL import Image import d2lzh_pytorch as d2l import numpy as np import math import torch展示一下本次实验我们用到的图像&#xff0c;猫狗 d2l.set_figsiz…

Uncaught ReferenceError: jQuery is not defined解决方法

当我在写java的Maven项目时&#xff0c;出现了这样的一个报错信息&#xff1a; 我一直找代码&#xff0c;抓包&#xff0c;调试&#xff0c;比对代码 jQuery未定义就是指JS的导包没有导进来&#xff01;&#xff01;&#xff01;&#xff01; 导进来就运行正常啦

SpringBoot集成系列--Kakfa

文章目录 一、代码1、添加依赖2、配置kafka3、创建生产者4、创建消费者5、测试 二、遇到问题1、could not be established. Broker may not be available2、Error while fetching metadata with correlation id xxx 一、代码 1、添加依赖 在pom.xml文件中添加Kafka的依赖 &l…

docker---资源控制

docker的资源控制 对容器使用宿主机的资源进行限制。 三种控制方向&#xff1a;CPU 内存 磁盘I/O docker使用linux自带的功能cgroup&#xff1b;control groups是linux内核系统提供的一种可以限制记录&#xff0c;隔离进程所使用的物理资源机制。 docker借助此…