Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Cypress测试中JavaScript异步执行与数据持久化实践_创想鸟

Cypress测试中JavaScript异步执行与数据持久化实践

Cypress测试中JavaScript异步执行与数据持久化实践

本文深入探讨了cypress测试中常见的javascript异步执行顺序问题及其解决方案。当cypress命令与普通javascript代码混合时,可能导致变量值未按预期更新。文章详细阐述了如何利用`cy.then()`命令确保cypress命令的顺序执行,以及如何通过`cypress.env()`在页面刷新后依然持久化数据,从而解决测试中的竞态条件和数据丢失问题,提升测试的稳定性和可靠性。

理解Cypress命令队列与JavaScript异步执行

在Cypress测试中,一个常见的困惑是JavaScript代码的执行顺序与预期不符。Cypress命令(如cy.get()、cy.invoke())并非立即执行,而是被添加到一个内部的命令队列中。这些命令是异步的,它们会按照添加的顺序依次执行,但其结果的获取和后续处理需要通过.then()回调来完成。而普通的JavaScript语句,如变量赋值和console.log(),则是同步执行的。

考虑以下示例代码,其目标是从UI元素中提取一个数字,并在后续操作中使用它:

const MATCHING_MESSAGE = '[data-cy=matchingMessages]';let count = 0; // 初始化变量cy.get(MATCHING_MESSAGE)  .invoke('text')  .then((text) => {    const pattern = /[0-9]+/g;    count = text.match(pattern).pop(); // 在Cypress命令队列中赋值    console.log({count1: count}); // 此时count已被更新  });// 模拟页面跳转或其他异步操作// move to next pageconsole.log({count2: count}); // 这里的count值可能不是期望的if (count > 0) {  // input count} else {  // input a min number like 5}

在上述代码中,cy.get(…).then(…)是一个异步操作,它会被推入Cypress命令队列。而console.log({count2: count});和后续的if判断是同步的JavaScript代码,它们会立即执行,而不会等待Cypress命令队列中的count变量被赋值。这导致count2在count1之前输出,且其值为初始值0,从而引发逻辑错误。

解决方案一:使用cy.then()强制执行顺序

为了确保依赖于Cypress命令结果的代码能够在其结果可用后才执行,我们必须将这些代码也纳入Cypress的命令队列中。cy.then()命令正是为此目的而设计的。它允许你在Cypress命令链的任何位置插入普通的JavaScript代码,并确保这些代码会在前面的Cypress命令完成后执行。

立即学习“Java免费学习笔记(深入)”;

通过将后续逻辑包裹在cy.then()中,我们可以强制Cypress等待count变量被正确赋值后再执行依赖于它的代码:

const MATCHING_MESSAGE = '[data-cy=matchingMessages]';let count = null; // 建议初始化为null,以便区分未赋值和实际值为0的情况cy.get(MATCHING_MESSAGE)  .invoke('text')  .then((text) => {    const pattern = /[0-9]+/g;    count = text.match(pattern).pop();    console.log({count1: count});  });// 模拟页面跳转或其他异步操作// move to next pagecy.then(() => {  // 此处的代码会在Cypress命令队列中,确保在前面的cy.get().then()执行完毕后才运行  console.log({count2: count});  // 注意:从UI提取的数字通常是字符串,进行数值比较前需要转换为数字类型  if (parseInt(count) > 0) {    // input count  } else {    // input a min number like 5  }});

在这个修正后的版本中,cy.then()块内的代码现在也是Cypress命令队列的一部分,因此它会等待前面的cy.get().invoke().then()链执行完毕,count变量被正确赋值后,再进行console.log和条件判断。

解决方案二:使用Cypress.env()持久化数据

上述cy.then()解决了执行顺序问题,但如果// move to next page这个操作导致了页面的完全刷新(例如,通过cy.visit()或点击导致新页面加载),那么之前在JavaScript作用域中定义的count变量将会丢失,因为它属于旧的页面上下文。

为了在页面刷新或测试步骤之间持久化数据,Cypress提供了Cypress.env()API。Cypress.env()允许你在Cypress环境中存储和检索键值对,这些数据会在整个测试运行期间保持不变,即使页面刷新也不会丢失。

以下是如何使用Cypress.env()来持久化count变量的示例:

const MATCHING_MESSAGE = '[data-cy=matchingMessages]';cy.get(MATCHING_MESSAGE)  .invoke('text')  .then((text) => {    const pattern = /[0-9]+/g;    const extractedCount = text.match(pattern).pop();    console.log({count1: extractedCount});    Cypress.env('count', extractedCount); // 将数据保存到Cypress环境中  });// 模拟页面跳转或其他异步操作,即使页面刷新,Cypress.env()中的数据也依然存在// move to next pagecy.then(() => {  // 从Cypress环境中恢复数据  const count = Cypress.env('count');  console.log({count2: count});  if (parseInt(count) > 0) {    // input count  } else {    // input a min number like 5  }});

通过Cypress.env(‘count’, extractedCount),我们将提取到的数字存储在Cypress环境中。即使页面刷新,我们也可以在后续的cy.then()块中通过Cypress.env(‘count’)安全地检索到这个值。

总结与注意事项

理解异步性: Cypress命令是异步的,它们被添加到命令队列中。普通JavaScript代码是同步执行的。混合使用时,务必注意执行顺序。利用cy.then(): 当你需要对Cypress命令的结果进行后续的JavaScript处理或逻辑判断时,请将这些代码包裹在cy.then()回调中,以确保正确的执行顺序。数据持久化: 如果你的测试流程涉及页面刷新,且需要在刷新前后共享数据,请使用Cypress.env()来存储和检索这些数据,以避免变量丢失。类型转换: 从UI元素中提取的文本通常是字符串。如果需要进行数值比较或算术运算,请记得使用parseInt()或parseFloat()进行类型转换。初始化变量: 声明变量时,可以将其初始化为null或一个明显无效的值,这样在调试时可以更容易地判断变量是否已被正确赋值。

掌握这些概念和技巧,将有助于你编写更健壮、更可靠的Cypress测试,有效避免因异步执行和数据丢失导致的测试失败。

以上就是Cypress测试中JavaScript异步执行与数据持久化实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1529675.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在VSCode中高效查找并转换未翻译的硬编码文本
上一篇 2025年12月20日 21:20:00
解决 Mongoose 复制文档时 VersionError:理解与实践
下一篇 2025年12月20日 21:20:10

相关推荐

  • Gradle中控制JAR包生成:理解jar.enabled配置

    本文深入探讨Gradle构建脚本中jar.enabled配置项的作用。它用于控制是否生成项目的默认JAR包。当设置为false时,Gradle将跳过标准的JAR包创建任务,这在项目需要生成其他类型的归档文件或作为多模块项目中的非独立组件时非常有用。理解此配置有助于优化构建过程和管理项目输出。 JAR…

    2026年9月22日
    100
  • 在Java中如何格式化输出日期与时间

    推荐使用Java 8的DateTimeFormatter格式化日期时间,配合LocalDateTime或ZonedDateTime实现安全高效输出,如yyyy-MM-dd HH:mm:ss;2. 传统SimpleDateFormat非线程安全,适用于旧版本。 在Java中格式化输出日期与时间,常用的…

    2026年9月22日
    200
  • DALL-E3如何导出生成的AI图片?一步步教你保存高分辨率图像

    DALL-E 3生成图片的默认分辨率为1024×1024像素,获取高清原图的关键是使用平台提供的官方下载按钮,而非右键“图片另存为”,以避免保存低分辨率缩略图;为防止画质损失,应避免二次压缩,并通过建立清晰的文件夹结构、规范命名、本地与云端同步等方式进行有效管理和备份;根据OpenAI政策…

    2026年9月22日
    000
  • Couchbase SDK 3 中 findByN1QL 的替代方案

    本文档旨在帮助开发者将 Couchbase SDK 2 迁移到 SDK 3,并解决 findByN1QL 方法不再适用的问题。我们将探讨如何使用 Cluster 对象直接执行 N1QL 查询,并将结果映射到自定义的 Java 对象,提供代码示例和注意事项,帮助你平滑过渡。 在 Couchbase S…

    2026年9月22日
    000
  • ​​VSCode的隐藏神技大公开!这些操作让你的编程效率突破天际​​

    vscode的真正效率提升源于掌握其核心功能与高级特性。首先要善用命令面板(ctrl/cmd + shift + p),它能快速执行格式化、打开文件、运行任务等操作,避免在菜单中层层查找;其次,多光标编辑(如alt+点击或ctrl/cmd + d)可实现批量修改,极大提升重构效率;通过tasks.j…

    2026年9月22日
    100
  • 如何通过HD Tune和CrystalDiskInfo检测SSD健康度与寿命?

    CrystalDiskInfo和HD Tune可准确评估SSD健康状态与寿命。首先使用CrystalDiskInfo查看健康等级及SMART参数,重点关注重新分配扇区计数、磨损均衡计数和剩余寿命百分比;开启AUTOSAVE功能记录长期状态。再通过HD Tune检查SMART警告项,执行错误扫描排查读…

    2026年9月22日
    300
  • 如何在Linux中杀死进程?

    最常用的方法是使用kill、pkill和killall命令;已知PID时用kill更精确,知道进程名则用pkill或killall更方便,优先尝试SIGTERM信号以避免数据丢失。 在Linux中终止进程有多种方式,主要通过命令行工具实现。最常用的方法是使用 kill、pkill 和 killall…

    2026年9月22日
    100
  • mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    在mysql中执行sql并创建表的步骤如下:1.通过命令行或图形工具连接数据库,使用mysql -u 用户名 -p并输入密码登录;2.选择或创建数据库,用use database_name或create database语句;3.使用create table定义表结构,如字段名、数据类型、约束等,例…

    2026年9月22日 • 用户投稿
    100
  • PHP数组如何定义和使用_PHP数组定义与使用详细教程

    PHP数组是存储和管理多个值的核心工具,支持索引、关联、混合及多维结构;通过方括号定义,可灵活访问、修改、添加或删除元素,并利用foreach高效遍历。 PHP数组是存储一系列值的强大工具,无论这些值是简单的数据项,还是更复杂的结构。它的核心思想就是把一堆相关的数据“打包”在一起,通过一个统一的名字…

    2026年9月22日
    000
  • Java中递归处理列表:排序验证与条件性最大值移除策略

    在处理列表数据时,我们常遇到需要根据特定条件修改列表的需求。本教程将深入探讨一个具体的场景:如何设计一个递归函数,该函数首先判断一个整数列表是否已按升序排序。如果列表已排序,则停止处理;如果未排序,则进一步检查列表中的最大值。仅当最大值位于列表的起始位置或末尾时,才将其移除,并对修改后的列表重复此过…

    2026年9月22日
    000
  • Flyway多数据库与CI/CD测试集成策略

    本文深入探讨了在CI/CD流程中,如何高效地配置Flyway以管理多数据库环境下的迁移,尤其关注集成测试场景。我们将比较使用真实数据库服务、Testcontainers以及Flyway自身多数据库配置的优劣,并提供关于分离生产与测试环境迁移脚本的实用策略,旨在确保开发、测试与生产环境的数据一致性与流…

    2026年9月22日
    100
  • Spring Boot自定义Kafka配置与动态Bean注册最佳实践

    本文探讨了在Spring Boot应用中通过自定义注解简化Kafka配置的挑战与解决方案。重点介绍了如何利用META-INF/spring.factories实现早期自动配置,并详细阐述了使用ImportBeanDefinitionRegistrar在应用上下文初始化早期动态注册Kafka生产者工厂…

    2026年9月22日
    100
  • mysql安装后怎么维护 mysql日常维护操作大全

    mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全mysql安装后怎么维护 mysql日常维护操作大全

    开启并分析慢查询日志以优化 sql 性能;2. 定期使用逻辑或物理方式备份数据并异地存储;3. 监控连接数和服务器资源,防止资源耗尽;4. 定期执行 analyze、optimize 和 check 表操作以维护表健康;5. 合理管理日志配置与清理策略。mysql 安装后的日常维护主要包括慢查询监控…

    2026年9月22日 • 用户投稿
    100
  • 在Java中如何开发简易问答社区

    答案是Java结合Spring Boot可快速构建问答社区,通过设计questions、answers、users三张表实现数据存储,使用JPA进行持久化,前端用HTML+JS调用后端API完成用户提问、回答、查看与互动功能。 开发一个简易问答社区,核心是实现用户提问、回答、查看问题和互动功能。Ja…

    2026年9月22日
    100
  • linux系统下codeblocks控制台打印中文乱码[通俗易懂]

    linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]linux系统下codeblocks控制台打印中文乱码[通俗易懂]

    大家好,很高兴再次和大家见面,我是你们的朋友全栈君。 在Linux系统下使用CodeBlocks时,如果在控制台中打印中文可能会遇到乱码问题。以下是解决这一问题的详细步骤: 首先,我们来看一下在Linux系统下安装CodeBlocks后,运行以下代码时出现的问题: #include #include…

    2026年9月22日 • 用户投稿
    600
  • 解决Android设备管理移除时的SecurityException

    本文将详细介绍如何解决在尝试从Android设备移除设备管理员时遇到的java.lang.SecurityException异常。该异常通常发生在尝试移除一个非测试用途的设备管理员应用时。通过修改应用的配置,将其临时标记为测试应用,可以绕过此安全限制,从而成功移除设备管理员。请务必注意,这种方法仅适…

    2026年9月22日
    100
  • Java类中Jackson @JsonNaming策略的运行时内省

    本文介绍如何在运行时动态内省Java类上通过@JsonNaming注解配置的Jackson PropertyNamingStrategy。通过利用ObjectMapper的SerializationConfig和JacksonAnnotationIntrospector,开发者可以编程方式获取类的命…

    2026年9月22日
    600
  • 高效利用 PriorityQueue 合并并排序多个列表

    本教程详细阐述了如何使用 Java 的 PriorityQueue 高效地合并并排序多个整数列表。文章首先指出将列表作为元素放入 PriorityQueue 的常见误区,进而纠正为应将单个整数元素放入队列。接着,它演示了如何正确声明、填充 PriorityQueue,并强调了通过循环调用 poll(…

    2026年9月22日
    500
  • 如何配置Android开发环境 Android Studio安装与JDK配置方法

    答案:配置Android开发环境需先安装JDK并设置环境变量,再下载安装Android Studio,配置SDK及虚拟设备,最后创建项目测试。具体步骤包括:1. 安装JDK 17并配置JAVA_HOME和Path;2. 从官网下载Android Studio并安装,自动集成SDK;3. 通过SDK …

    2026年9月22日
    200
  • 谷歌浏览器官网直接进入 Chrome浏览器官方登录入口

    谷歌浏览器官网直接进入方式为访问https://www.google.com/chrome/,该网站是Chrome官方登录入口,提供跨平台同步、V8引擎加速、地址栏集成搜索、自动填充表单等核心功能,支持极简界面、深色模式、自定义新标签页及侧边栏服务,具备安全浏览、隐私沙盒、密码检查和无痕模式等安全机…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信