Cypress端到端测试实战:从原理到CI/CD集成全解析
1. 项目概述为什么是Cypress如果你是一名前端开发者或者正在向全栈测试工程师转型那么你一定对Web应用的自动化测试感到头疼。传统的Selenium框架虽然强大但配置复杂、运行不稳定、调试困难常常让测试脚本的编写和维护变成一场噩梦。我自己在团队里推动自动化测试时就深受其苦一个简单的元素定位失败就可能需要花费大量时间在环境、驱动和异步等待上。直到我遇到了Cypress。它彻底改变了我的测试工作流。Cypress不是一个简单的测试库它是一个完整的端到端测试框架运行在真实的浏览器中却提供了前所未有的开发体验。它内置了测试运行器、断言库、模拟请求、时间旅行调试等一系列开箱即用的功能。最吸引我的一点是它的测试脚本是用JavaScript或TypeScript写的和你开发应用用的是同一种语言这意味着前后端开发者都能快速上手真正实现了“测试即开发”。这个系列教程我将以一个“软测大玩家”的实战视角带你从零开始深入掌握Cypress。我们不只讲“怎么安装”更要讲清楚“为什么这么装”以及安装后如何高效地用它解决真实的测试难题。本篇作为第三部分我们将聚焦于Cypress的核心使用模式、高级特性以及如何将其集成到你的CI/CD流水线中让你从“会用”进阶到“玩转”。2. 核心架构与运行原理深度解析在开始写测试用例之前理解Cypress的底层工作原理至关重要。这能帮助你在遇到诡异问题时快速定位是脚本逻辑问题还是Cypress运行机制导致的。2.1 Cypress的独特架构为什么它这么快、这么稳与Selenium的“远程控制”模式不同Cypress采用了一种同源架构。当你运行npx cypress open时Cypress会启动一个本地服务器。你的测试代码和被测应用运行在同一个浏览器循环browser loop中而Cypress的Node.js后端进程则运行在另一个独立的进程中。这两个进程通过WebSocket进行实时、双向通信。这种架构带来了几个革命性的优势无网络延迟因为测试代码和应用程序代码在同一个上下文中执行所以命令执行是同步的你不需要写await或.then()来等待命令完成尽管Cypress命令本身是异步的但它帮你处理了。完全控制Cypress可以拦截和修改进出浏览器的每一个网络请求和响应也能直接访问DOM、window、document等对象这使得模拟和存根Stub变得极其简单。时间旅行Cypress Test Runner可以记录每一个命令执行时的快照。当测试失败时你可以像使用调试器一样回溯到之前的任意一个命令查看当时的页面状态、网络请求和Console日志。注意正因为这种同源架构Cypress无法在一个测试套件中测试跨域Cross-Origin的页面。这是它的一个设计限制。不过Cypress提供了cy.origin()命令来专门处理有限的跨域场景但这需要额外的配置和理解。2.2 命令队列与异步执行告别“回调地狱”这是新手最容易困惑的地方。看这段代码cy.get(.search-input).type(Cypress) cy.get(.search-button).click() cy.contains(h3, Cypress Documentation).should(be.visible)从写法上看这些命令是同步的、顺序执行的。但实际上Cypress的命令是异步的。它们不会立即执行而是被放入一个命令队列。Cypress会一个接一个地执行队列中的命令并且每个命令都会自动等待前一个命令成功完成同时也会等待应用程序达到某个“稳定”状态例如没有未完成的网络请求、定时器或动画。这意味着你几乎不需要手动添加cy.wait()。例如cy.get()命令会不断重试查找元素直到元素出现在DOM中或者超时。cy.type()会等待输入框变为可交互状态。这种“自动等待”机制是Cypress稳定性的基石。实操心得虽然Cypress帮你处理了等待但并不意味着你可以完全忽视异步问题。如果你的应用在某个操作后会触发一个长时间运行的setTimeout或者一个不通过XHR/Fetch发出的请求如WebSocketCypress可能无法自动检测到。这时你需要使用cy.intercept()来监听特定的网络请求或者使用cy.wait()配合别名来显式等待。3. 编写你的第一个健壮测试用例理解了原理我们动手写一个完整的测试。假设我们有一个简单的待办事项Todo应用。3.1 测试文件结构与基本语法Cypress的测试文件默认放在cypress/e2e目录下支持.js,.ts,.jsx,.tsx后缀。我们创建一个todo.cy.js文件。一个典型的测试用例结构如下// cypress/e2e/todo.cy.js describe(Todo App, () { // 测试套件描述一组相关测试 beforeEach(() { // 每个测试用例运行前的钩子用于准备测试环境 cy.visit(http://localhost:3000) // 访问被测应用 }) it(should add a new todo item, () { // 单个测试用例 // 测试步骤和断言 }) it(should mark a todo as completed, () { // 另一个测试用例 }) })3.2 一个完整的增删改查测试示例让我们实现一个包含添加、完成、筛选、删除操作的完整流程测试。describe(Todo App E2E Tests, () { beforeEach(() { // 假设我们的开发服务器运行在3000端口 cy.visit(http://localhost:3000) // 可选每次测试前清空本地存储或重置后端数据如果有点赞 // cy.request(POST, /api/test/reset) }) it(成功添加一个新的待办事项, () { const newItem 学习Cypress高级特性 // 1. 定位输入框并输入文本 cy.get([data-testidtodo-input]) // 最佳实践使用>it(拦截添加待办事项的API请求并验证载荷, () { const newItem 通过拦截添加的任务 const mockResponse { id: 999, text: newItem, completed: false } // 1. 拦截 POST 请求到 /api/todos cy.intercept(POST, /api/todos, (req) { // 可以在这里对请求进行断言或修改 expect(req.body).to.deep.equal({ text: newItem }) // 断言请求体 // 请求继续发送到真实服务器 // 如果想存根Stub则使用req.reply(mockResponse) }).as(addTodoRequest) // 给这个拦截起个别名 // 2. 执行UI操作触发请求 cy.get([data-testidtodo-input]).type(newItem {enter}) // 3. 等待特定的拦截完成并获取其响应 cy.wait(addTodoRequest).then((interception) { // interception 对象包含了请求和响应的所有信息 expect(interception.response.statusCode).to.eq(201) // 可以在这里对真实响应进行断言 }) // 4. 断言UI已根据响应更新 cy.get([data-testidtodo-list] li) .should(contain.text, newItem) })4.2 存根StubAPI响应更常见的情况是我们希望完全控制服务器的响应用于测试前端在各种情况下的表现。it(当添加待办事项API失败时前端显示错误信息, () { const newItem 会失败的任务 // 拦截并立即返回一个模拟的错误响应不发送真实请求 cy.intercept(POST, /api/todos, { statusCode: 500, body: { message: Internal Server Error }, delay: 1000 // 模拟网络延迟 }).as(failedRequest) cy.get([data-testidtodo-input]).type(newItem {enter}) // 断言加载状态或禁用状态如果UI有的话 cy.get([data-testidadd-button]).should(be.disabled) cy.wait(failedRequest) // 断言错误信息被显示在UI上 cy.get([data-testiderror-message]) .should(be.visible) .and(contain.text, 添加失败请重试) })4.3 使用夹具Fixtures管理测试数据当测试需要复杂或重复的数据时可以将数据放在cypress/fixtures目录下的JSON文件中。cypress/fixtures/todos.json:[ { id: 1, text: 买牛奶, completed: false }, { id: 2, text: 学习Cypress, completed: true }, { id: 3, text: 写博客, completed: false } ]在测试中加载和使用beforeEach(() { // 拦截GET请求并返回fixture数据 cy.intercept(GET, /api/todos, { fixture: todos.json }).as(loadTodos) cy.visit(http://localhost:3000) cy.wait(loadTodos) // 等待模拟数据加载完成 }) it(页面加载时显示来自fixture的待办事项, () { cy.get([data-testidtodo-list] li).should(have.length, 3) cy.contains(学习Cypress).should(exist) // 断言已完成的任务有特定的样式 cy.contains(学习Cypress) .parents(li) .should(have.class, completed) })实操心得cy.intercept()是一个非常灵活的命令。你可以用它来监听请求而不修改用于cy.wait(alias)。存根请求返回静态响应。动态响应根据请求内容返回不同的数据。修改真实请求或响应例如添加认证头。 合理使用拦截和存根可以让你构建出完全独立、快速且稳定的测试套件。5. 自定义命令与可复用逻辑当你在多个测试文件中重复相同的操作序列时就该考虑自定义命令了。这能极大提升代码的可维护性和可读性。5.1 创建自定义命令在cypress/support/commands.js文件中添加// 添加一个待办事项的通用命令 Cypress.Commands.add(createTodo, (todoText) { cy.get([data-testidtodo-input]).type(${todoText}{enter}) // 可选添加一个隐式断言确保项目被添加 cy.get([data-testidtodo-list] li).should(contain.text, todoText) }) // 登录命令假设你的应用有登录功能 Cypress.Commands.add(login, (username testuser, password testpass) { cy.session([username, password], () { // 使用cy.session缓存登录状态加速测试 cy.visit(/login) cy.get([data-testidusername]).type(username) cy.get([data-testidpassword]).type(password {enter}) cy.url().should(include, /dashboard) // 断言登录成功 }) })5.2 在测试中使用自定义命令describe(使用自定义命令, () { beforeEach(() { cy.visit(http://localhost:3000) }) it(通过自定义命令快速添加多个任务, () { cy.createTodo(任务A) cy.createTodo(任务B) cy.createTodo(任务C) cy.get([data-testidtodo-list] li).should(have.length, 3) }) })注意事项自定义命令虽然方便但不要过度使用。简单的、仅在本文件内复用的逻辑更适合提取成普通的JavaScript函数。自定义命令最适合那些具有副作用如访问DOM、发出网络请求且需要在多个测试套件中共享的复杂操作。6. 测试运行策略与CI/CD集成本地开发时我们使用cypress open打开图形化测试运行器。但对于持续集成CI环境我们需要无头Headless运行。6.1 命令行运行与参数配置在package.json中添加脚本{ scripts: { cy:open: cypress open, cy:run: cypress run, cy:run-chrome: cypress run --browser chrome, cy:run-firefox: cypress run --browser firefox, cy:run-record: cypress run --record --key your-record-key // 录制到Cypress Cloud } }运行所有测试npm run cy:run运行特定测试文件npx cypress run --spec \cypress/e2e/todo.cy.js\运行某个测试套件npx cypress run --spec \cypress/e2e/todo.cy.js\ --grep \添加\(需要安装cypress-grep插件)6.2 在GitHub Actions中集成Cypress创建一个.github/workflows/cypress-tests.yml文件name: Cypress E2E Tests on: [push, pull_request] jobs: cypress-run: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkoutv4 - name: Setup Node.js uses: actions/setup-nodev4 with: node-version: 18 cache: npm - name: Install dependencies run: npm ci # 使用ci命令确保依赖锁一致 - name: Start development server (if needed) run: npm start # 后台启动你的应用服务器 env: NODE_ENV: test # 使用测试环境配置 - name: Wait for server to be ready run: npx wait-on http://localhost:3000 # 等待应用可访问 - name: Run Cypress tests uses: cypress-io/github-actionv6 with: browser: chrome headless: true record: false # 如果不需要录制到Cypress Cloud设为false # config-file: cypress.config.js # 指定配置文件 env: # 可以在这里传递环境变量给Cypress CYPRESS_BASE_URL: http://localhost:3000 # 可选上传测试结果或截图如果测试失败 - name: Upload Cypress screenshots (on failure) uses: actions/upload-artifactv4 if: failure() with: name: cypress-screenshots path: cypress/screenshots - name: Upload Cypress videos uses: actions/upload-artifactv4 if: always() with: name: cypress-videos path: cypress/videos关键配置解析wait-on这是一个非常实用的npm包用于等待某个端口、URL或文件就绪。确保在运行测试前你的应用服务器已经启动并可以访问。cypress-io/github-action这是Cypress官方提供的GitHub Action它帮你处理了浏览器安装、依赖缓存等繁琐步骤是最推荐的集成方式。环境变量通过CYPRESS_*前缀的环境变量可以覆盖cypress.config.js中的任何配置项这在CI环境中非常有用可以灵活切换测试环境地址、数据库连接等。6.3 并行测试与测试分组随着测试套件增长运行时间会变长。Cypress支持通过--parallel和--group参数在CI上进行并行测试但这通常需要配合Cypress Cloud服务或第三方工具如cypress-parallel来实现负载均衡。基本思路是将测试文件拆分到多个机器上同时运行。7. 常见问题排查与调试技巧实录即使有了Cypress测试也不会一帆风顺。以下是我在实际项目中踩过的坑和总结的技巧。7.1 元素定位失败最常见的问题问题cy.get(...)超时找不到元素。排查思路检查选择器打开Cypress Test Runner使用左上角的“选择器 playground”工具来验证你的选择器是否能唯一标识目标元素。优先使用>原因表现解决方案未处理的异步操作点击按钮后UI状态因动画或微任务延迟更新。使用.should()断言目标状态而不是cy.wait(毫秒数)。例如cy.get(.success-message).should(be.visible)。依赖第三方服务/API测试因天气API、支付网关不稳定而失败。使用cy.intercept()彻底存根所有外部API调用让测试完全可控。测试间状态污染测试A创建的数据影响了测试B。在beforeEach或afterEach钩子中清理状态。如果是Web应用使用cy.session()隔离登录状态如果是数据库调用重置接口。随机生成的数据测试依赖于随机数或当前时间。使用固定种子seed的随机数生成器或使用cy.clock()来控制和模拟时间。一个处理时间的例子it(测试具有时间敏感性的功能, () { // 1. 设置当前时间为一个固定时间点 const now new Date(2023, 9, 1, 10, 30, 0).getTime() // 2023-10-01 10:30:00 cy.clock(now) // 2. 进行测试操作... cy.visit(/dashboard) // 页面可能会显示“上午好”这个断言在固定时间下是稳定的 cy.contains(上午好).should(be.visible) // 3. 如果需要可以让时间“快进” cy.tick(1000 * 60 * 60) // 快进1小时 cy.contains(上午好).should(not.exist) cy.contains(中午好).should(be.visible) })7.4 调试利器.pause()与.debug()当测试行为不符合预期时不要盲目猜测。cy.pause()在命令链中插入此命令测试运行会暂停。你可以打开浏览器开发者工具自由地检查DOM、Console、Network就像在普通网页上一样。检查完毕后点击Cypress Test Runner中的“继续”按钮。cy.debug()此命令会暂停测试并将上一个命令产生的主体subject打印到Console。例如cy.get(button).debug()会暂停并打印出找到的jQuery对象你可以展开它查看所有属性。我个人最常用的调试组合是cy.get(...).then($el { debugger; })。这会在浏览器中触发一个真正的断点你可以使用所有熟悉的开发者工具功能进行单步调试。8. 从测试到质量守护构建健壮的测试策略掌握了Cypress的所有技巧后如何让它为你的项目创造最大价值关键在于构建一个分层的、高效的测试策略。不要试图用E2E测试覆盖一切。E2E测试运行慢、维护成本高。应该遵循经典的“测试金字塔”底层多、快、便宜单元测试Jest, Vitest。测试独立的函数、组件。中层中集成测试/组件测试Cypress Component Testing, React Testing Library。测试组件间或模块间的交互。顶层少、慢、贵端到端E2E测试Cypress E2E Testing。测试完整的、用户视角的关键业务流程。Cypress同时支持E2E测试和组件测试。对于前端项目我的建议是用组件测试覆盖UI交互逻辑例如一个按钮点击后是否调用了正确的回调函数表单校验是否正常工作。这比E2E测试快得多。用E2E测试覆盖核心用户旅程例如“用户从首页登录搜索商品加入购物车完成结算”。每个主要功能模块只写1-2个覆盖“快乐路径”的E2E测试。将E2E测试集成到CI/CD门禁确保合并到主分支的代码不会破坏核心功能。可以配置在每次Pull Request时自动运行E2E测试套件。定期运行完整的测试套件可以在每天夜间定时运行全部E2E测试生成测试报告监控测试稳定性。最后保持测试代码的质量和产品代码一样重要。及时重构重复的测试逻辑给测试用例和自定义命令起一个清晰的名字编写有意义的失败信息。当测试失败时你或你的同事应该能一眼看出是哪里出了问题以及为什么出了问题。这样Cypress才能真正成为你团队质量保障的“大玩家”而不是一个额外的负担。

相关新闻

围棋AI分析终极指南:LizzieYzy完整使用教程

围棋AI分析终极指南:LizzieYzy完整使用教程

围棋AI分析终极指南:LizzieYzy完整使用教程 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 围棋AI分析工具LizzieYzy是一款功能强大的开源围棋软件,它基于Lizzie开发&#x…

2026/8/7 5:46:11 阅读更多 →
Sunshine游戏串流完整教程:从零开始打造你的专属云游戏平台

Sunshine游戏串流完整教程:从零开始打造你的专属云游戏平台

Sunshine游戏串流完整教程:从零开始打造你的专属云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在客厅的电视上畅玩高性能PC游戏&#xff0c…

2026/8/7 7:16:09 阅读更多 →
Unity虚拟人开发全链路解析:从核心架构到多平台部署实战

Unity虚拟人开发全链路解析:从核心架构到多平台部署实战

1. 项目概述:为什么虚拟人开发是当下的技术焦点? 最近几年,无论是线上发布会、虚拟主播,还是智能客服与数字员工,虚拟人(Virtual Human)的身影越来越频繁地出现在我们的视野中。这背后不仅仅是视…

2026/8/7 5:34:22 阅读更多 →

最新新闻

2026版二升三学霸数学计算大通关 人教版暑假计算专项三件套

2026版二升三学霸数学计算大通关 人教版暑假计算专项三件套

二升三是小学数学衔接中年级的关键节点,计算从单一运算升级为加减乘除混合运算,竖式、脱式计算要求逐步提高,假期放松练习很容易出现计算速度下降、步骤出错等问题。这套人教版计算大通关专项资料,聚焦暑假计算强化训练&#xff0…

2026/8/8 7:08:57 阅读更多 →
网络安全副业接单实战指南:风险规避与高效盈利

网络安全副业接单实战指南:风险规避与高效盈利

1. 网络安全副业接单的现状与风险全景作为一名在网络安全行业摸爬滚打十年的老兵,我见过太多同行在接私活时踩坑的血泪史。2023年OWASP发布的报告显示,全球43%的网络安全从业者曾通过副业接单,但其中68%遭遇过项目纠纷。这个看似遍地黄金的领…

2026/8/8 7:08:57 阅读更多 →
移动应用金额安全显示与加密实践指南

移动应用金额安全显示与加密实践指南

1. 项目背景与核心需求在移动应用开发领域,用户账户信息安全一直是重中之重。最近我在开发一款金融类APP时,遇到了一个看似简单却值得深究的问题:如何在界面上合理展示用户账户金额信息?这不仅仅是UI设计问题,更涉及到…

2026/8/8 7:08:56 阅读更多 →
TLS协议深度解析:从加密原理到HTTPS/MQTTS实战配置与错误排查

TLS协议深度解析:从加密原理到HTTPS/MQTTS实战配置与错误排查

1. 从“明文裸奔”到“加密铠甲”:TLS的诞生与使命如果你在2000年初上过网,可能还记得浏览器地址栏旁边那个小小的黄色锁头图标,或者更早的时候,连这个锁头都没有。那时候,你在论坛输入的账号密码、在购物网站填写的地…

2026/8/8 7:08:56 阅读更多 →
构建可中断恢复的AI Agent系统:人机协作架构与实战指南

构建可中断恢复的AI Agent系统:人机协作架构与实战指南

1. 从“单打独斗”到“团队协作”:AI Agent的范式转变 最近在折腾AI应用开发的朋友,可能都绕不开一个词: Agent 。从年初的AutoGPT爆火,到后来各种“自主智能体”框架层出不穷,大家似乎都在追求一个目标——让AI自己…

2026/8/8 7:08:56 阅读更多 →
Java Selenium自动化破解滑动验证码:从图像识别到轨迹模拟实战

Java Selenium自动化破解滑动验证码:从图像识别到轨迹模拟实战

1. 项目概述与核心价值最近在折腾一些自动化工具时,发现很多网站的登录环节都加上了滑动验证码,比如1688、一些电商后台或者社区论坛。手动操作不仅效率低,在需要批量处理任务时更是让人头疼。用Java配合WebDriver(比如Selenium&a…

2026/8/8 7:07:56 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →