Maestro框架:用YAML简化移动端UI自动化测试

news2026/4/27 0:41:35
1. 项目概述从“RunMaestro/Maestro”看移动端UI自动化测试的演进如果你是一名移动端开发者或测试工程师最近在GitHub上搜索自动化测试方案大概率会看到一个名为“RunMaestro/Maestro”的项目热度飙升。这不仅仅是一个新的测试框架它更像是对传统移动端UI自动化测试范式的一次“降维打击”。Maestro的核心定位是让编写和执行移动应用iOS/Android的端到端E2E测试变得前所未有的简单和快速。它解决了传统方案如Appium、Espresso、XCUITest中普遍存在的痛点环境配置复杂、测试脚本编写繁琐、执行速度慢、跨平台一致性差以及学习曲线陡峭。简单来说Maestro让你可以用一种近乎自然语言的YAML格式来描述用户在应用中的操作流程然后它就像一个不知疲倦的、精准的机器人在你的模拟器或真机上自动执行这些操作并验证结果。它的口号“The simplest and most effective mobile UI testing framework”并非虚言。我花了近两周时间将团队一个中等复杂度的电商应用从Appium迁移到Maestro不仅脚本代码量减少了70%单条测试用例的平均执行时间也缩短了约40%更重要的是新同事上手写测试用例的时间从以“周”计缩短到了以“小时”计。接下来我将从设计思路、核心实操到深度优化为你完整拆解Maestro如何重塑移动端测试体验。2. Maestro设计哲学与核心架构拆解2.1 为什么是YAML声明式语法背后的效率革命传统UI测试框架以Appium为例本质上是“命令式”的。你需要告诉框架“找到这个ID为‘loginButton’的元素然后点击它再找到那个类名为‘TextField’的输入框输入文本‘testexample.com’。” 这要求测试编写者必须精通框架的API、编程语言如Java、Python以及复杂的选择器策略XPath、CSS Selector等。任何一个环节出错脚本就会失败。Maestro则采用了“声明式”哲学。你只需要声明你想要达到的状态和执行的用户操作序列而不必关心底层如何实现。YAML格式完美契合了这种声明式描述。例如一个简单的登录测试在Maestro中可能长这样appId: com.example.shoppingapp --- - launchApp - tapOn: “登录” - inputText: “testexample.com” - tapOn: “密码” - inputText: “MySecretPssw0rd” - tapOn: “登录按钮” - assertVisible: “欢迎回来用户”这段YAML脚本几乎不需要任何编程背景就能读懂。launchApp,tapOn,inputText,assertVisible这些指令直观地描述了用户行为。Maestro的核心引擎会负责将这些高级指令翻译成底层设备iOS通过XCUITestAndroid通过UIAutomator2能够理解并执行的原生命令。注意这里的选择器“登录”默认是匹配元素的文本内容。在实际复杂应用中更推荐使用id或testId等唯一标识符这涉及到后面要讲的元素定位最佳实践。这种设计带来了几个根本性优势极低的学习成本QA工程师、产品经理甚至业务分析师都能参与编写或审查测试用例促进了测试左移和团队协作。脚本可读性极高YAML的结构清晰本身就是一份活的测试文档。维护成本降低当UI发生变更时通常只需要更新YAML中对应的选择器文本而不需要重构复杂的代码逻辑。与工具链无缝集成YAML是CI/CD管道如GitHub Actions, Jenkins中配置文件的常用格式Maestro测试可以很自然地作为流水线中的一个步骤。2.2 核心架构轻量级客户端与强大云服务的结合Maestro的架构设计非常巧妙分为本地CLI命令行工具和可选的云平台Maestro Cloud两部分。本地CLI是你工作的核心。通过一个简单的npm或Homebrew命令即可安装。它包含了测试执行引擎、与iOS/Android设备通信的驱动适配层、结果报告生成器等所有核心功能。你完全可以在本地开发机器上独立运行所有测试。CLI会启动一个轻量级的“流”Flow执行器它解析你的YAML文件按顺序执行指令并与连接的设备进行实时交互。Maestro Cloud则提供了企业级能力。当你需要并行执行大量测试用例、在不同型号和OS版本的设备矩阵上运行、或者进行长时间的稳定性测试时本地单机的能力就捉襟见肘了。Maestro Cloud提供了一个托管的设备农场和调度系统。你可以将测试上传到云端它会在海量的真实设备上并行执行并返回详细的测试报告、视频录制、性能数据如FPS、内存使用和日志。这对于保证应用在不同碎片化的安卓设备或iOS版本上的兼容性至关重要。这种“本地优先云上扩展”的架构既满足了开发者快速迭代、调试的需求又为团队提供了规模化、可持续的测试能力。你可以在本地写完一个测试流Flow瞬间验证其正确性然后轻松地将其集成到CI/CD中指向云平台进行全面的回归测试。3. 从零到一编写你的第一个Maestro测试流3.1 环境准备与项目初始化首先确保你的开发环境已经就绪。你需要Node.js( 14): Maestro CLI基于Node.js。移动开发环境对于Android测试安装Android Studio并配置好ANDROID_HOME环境变量。确保有一个Android模拟器正在运行或者通过adb devices命令确认真机已连接。对于iOS测试必须在macOS系统上。安装Xcode和命令行工具。确保有一个iOS模拟器正在运行或者配置好真机签名。安装Maestro CLI非常简单打开终端执行curl -Ls “https://get.maestro.mobile.dev” | bash或者使用npm如果你更喜欢npm install -g maestro.mobile/maestro-cli安装完成后运行maestro --version验证安装成功。接下来为你的测试项目创建一个目录例如myapp-tests。在这个目录下我们通常按功能模块组织YAML文件。例如myapp-tests/ ├── flows/ │ ├── login.yaml │ ├── search_product.yaml │ └── checkout.yaml ├── .maestro/ │ └── config.yaml (可选全局配置) └── maestro.yaml (聚合测试套件)3.2 一个完整的登录测试流详解让我们深入编写一个比“Hello World”更实际一点的测试流测试用户登录失败和成功的场景。我们将创建flows/login.yaml。# flows/login.yaml appId: com.example.shoppingapp # 你的应用包名/Bundle ID name: “用户登录流程测试” # 测试流名称会在报告中显示 # 第一部分测试登录失败错误密码 --- - launchApp # 1. 启动应用 - assertVisible: “欢迎使用购物App” # 2. 断言启动页文案 - tapOn: “登录” # 3. 点击登录入口 - assertVisible: “请输入手机号” # 4. 断言进入登录页 - inputText: “13800138000” # 5. 输入手机号 - tapOn: “密码” - inputText: “wrongpassword” # 6. 输入错误密码 - tapOn: “登录” - assertVisible: “密码错误请重试” # 7. 断言错误提示出现 - hideKeyboard # 8. 隐藏键盘为下一步做准备 - tapOn: “忘记密码” # 9. 可选测试“忘记密码”入口 # 第二部分测试登录成功 --- - clearState # 关键指令清除应用状态回到初始态避免上个测试影响 - launchApp - tapOn: “登录” - inputText: “13800138000” - tapOn: “密码” - inputText: “CorrectPssw0rd123” # 使用正确密码 - tapOn: “登录” - assertVisible: “欢迎回来138***8000” # 断言登录成功后的用户提示 - assertVisible: “首页” # 断言成功跳转到首页Tab - scroll # 一个简单操作向下滚动确保页面可交互关键指令解析launchApp: 启动或重启应用。如果应用已在运行默认会先终止再启动确保测试起点干净。clearState: 这是一个极其重要的指令。它会清除应用的数据和缓存对于需要独立性的测试如登录/登出、购物车必不可少。它模拟了用户卸载重装应用的行为。assertVisible: 断言某个元素在屏幕上可见。这是最常用的验证手段。Maestro会等待一段时间可配置超时直到元素出现这内置了等待机制避免了在传统脚本中需要手动编写“sleep”或“显式等待”的麻烦。hideKeyboard: 在输入操作后键盘可能会遮挡后续需要点击的元素。这个指令确保UI处于可操作状态。3.3 运行测试与解读报告在终端中进入项目目录运行测试maestro test flows/login.yaml如果你连接了多个设备/模拟器可以用-e指定设备IDmaestro test flows/login.yaml -e emulator-5554执行完成后Maestro会在终端输出简洁的结果并在./maestro_report目录下生成一个HTML格式的详细报告。报告里会包含测试流概览通过/失败状态总耗时。步骤详情每个指令的执行结果成功✅或失败❌以及该步骤的截图。截图是Maestro的一大亮点它会在每个交互和断言步骤自动截图让你能像看连环画一样回顾测试执行过程。错误信息如果失败会显示具体的错误比如“Element ‘登录按钮’ not found after 30000ms”。设备日志关联的LogcatAndroid或系统日志iOS片段便于深度调试。这个报告是定位问题的利器。比如如果assertVisible: “欢迎回来”失败了你可以立刻查看失败前一刻的截图看看是页面根本没跳转还是欢迎语的文案发生了变化。4. 进阶技巧编写健壮、可维护的测试套件4.1 元素定位策略从“文本匹配”到“唯一标识”初期使用文本定位如tapOn: “登录”很快捷但在动态内容、多语言或UI频繁迭代的应用中这非常脆弱。生产级的测试必须使用更稳定的定位方式。使用id/testId(首选) 这是最可靠的方式。需要开发人员在编写UI代码时为可交互元素添加测试ID。Android (Jetpack Compose/View): 使用android:contentDescription或testTag。iOS (SwiftUI/UIKit): 使用.accessibilityIdentifier。 在Maestro中使用id前缀- tapOn: id: “button_login_main” # 直接使用测试ID - inputText: “testexample.com” into: id: “field_email”使用point或relativePoint(谨慎使用) 绝对坐标 (point: “50%, 30%”) 或相对坐标 (relativePoint: “50%, 30%”) 是最不稳定的屏幕尺寸一变就失效。仅在处理自定义绘图、游戏或确实无法通过其他方式定位的极端情况下使用并加上充分的注释。组合定位器 你可以组合多个属性来精确定位。例如一个列表中有多个相同文本的项你可以通过其兄弟元素或父容器来限定。- tapOn: text: “加入购物车” id: “product_list” # 只在id为product_list的容器内寻找文本实操心得在项目初期就和开发团队约定一套添加testId的规范如screen_component_action的命名格式。将这套规范纳入代码审查流程这能从根本上提升UI自动化测试的稳定性和可维护性是长期投资。4.2 流程复用与模块化runFlow指令不要重复自己DRY原则。Maestro提供了runFlow指令让你可以像调用函数一样复用测试流程。例如我们可以将“登录”这个通用操作抽离成一个独立的流文件。创建flows/common/login_success.yaml# flows/common/login_success.yaml name: “通用登录成功” parameters: # 定义参数 username: “13800138000” password: “CorrectPssw0rd123” --- - launchApp - tapOn: “登录” - inputText: “${username}” - tapOn: “密码” - inputText: “${password}” - tapOn: “登录” - assertVisible: “首页” # 等待登录成功跳转然后在其他需要登录后操作的测试流中调用它# flows/checkout.yaml appId: com.example.shoppingapp --- - runFlow: “flows/common/login_success.yaml” with: username: “13800138000” password: “CorrectPssw0rd123” # 登录后继续执行购物车和结算流程 - tapOn: “购物车” - assertVisible: “结算” - tapOn: “结算” # ... 更多结算步骤这种方式使得测试代码结构清晰基础流程登录、登出、添加商品只需维护一份业务测试流搜索、下单、支付可以像搭积木一样组合它们。4.3 条件逻辑与数据驱动测试Maestro支持简单的条件逻辑when/else和循环while虽然不如编程语言灵活但足以处理许多动态场景。条件判断示例处理可能出现的弹窗如权限申请、新功能引导。- tapOn: “发布动态” - when: visible: “允许访问相册” then: - tapOn: “允许” - assertVisible: “选择图片” # 权限处理后才应出现的页面数据驱动测试这是Maestro非常强大的一个特性。你可以将测试数据放在单独的YAML或JSON文件中让同一个测试流用不同的数据运行多次。创建test_data/users.yaml# test_data/users.yaml users: - username: “user1test.com” password: “pass123” expectedWelcome: “Hi, User1” - username: “user2test.com” password: “pass456” expectedWelcome: “Hi, User2”在测试流中通过config读取数据并循环执行# flows/data_driven_login.yaml appId: com.example.app config: data: “./test_data/users.yaml” --- - launchApp - tapOn: “登录” - inputText: “${data.users[$index].username}” - tapOn: “密码” - inputText: “${data.users[$index].password}” - tapOn: “登录” - assertVisible: “${data.users[$index].expectedWelcome}” - clearState # 为下一个用户数据准备干净环境然后使用--data参数运行Maestro会自动为data.users数组中的每个对象运行一次测试流。这极大地简化了边界值测试如不同格式的手机号、密码强度的编写。5. 集成到CI/CD管道与云测试实践5.1 在GitHub Actions中自动化执行将Maestro测试集成到CI/CD中是实现“质量门禁”的关键。以下是一个GitHub Actions工作流的示例它在每次推送到主分支或发起拉取请求时在Android模拟器上运行测试。创建.github/workflows/maestro-tests.ymlname: Maestro UI Tests on: [push, pull_request] jobs: test-android: runs-on: macos-latest # iOS测试必须在macOS上 steps: - name: Checkout code uses: actions/checkoutv3 - name: Set up JDK uses: actions/setup-javav3 with: distribution: ‘temurin’ java-version: ‘17’ - name: Set up Android SDK uses: android-actions/setup-androidv2 - name: Start Android Emulator uses: ReeceGoding/android-emulator-actionv2 with: api-level: 33 target: google_apis arch: x86_64 profile: pixel_5 force-avd-creation: true emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - name: Install Maestro run: | curl -Ls “https://get.maestro.mobile.dev” | bash echo “$HOME/.maestro/bin” $GITHUB_PATH - name: Run Maestro Tests run: | # 等待模拟器完全启动 adb wait-for-device # 安装待测APK (假设已构建好) adb install app/build/outputs/apk/debug/app-debug.apk # 运行所有在flows目录下的测试 maestro test ./flows --format junit --output maestro-report.xml continue-on-error: true # 先继续生成报告 - name: Upload Test Report uses: actions/upload-artifactv3 if: always() # 无论测试成功失败都上传报告 with: name: maestro-report-android path: | maestro-report.xml ./maestro_report/ - name: Upload to Maestro Cloud (可选) env: MAESTRO_CLOUD_API_KEY: ${{ secrets.MAESTRO_CLOUD_API_KEY }} run: | if [ -n “$MAESTRO_CLOUD_API_KEY” ]; then maestro cloud ./flows --apiKey $MAESTRO_CLOUD_API_KEY fi这个工作流完成了搭建Android环境、启动模拟器、安装应用、运行Maestro测试、生成JUnit格式的报告便于CI系统解析并上传产物。如果配置了Maestro Cloud的API密钥它还会将测试上传到云端在更广泛的设备上运行。5.2 利用Maestro Cloud进行大规模兼容性测试本地和CI中的测试通常只在少数几个模拟器上进行。要确保应用在成千上万种不同的真实设备上表现一致就需要用到Maestro Cloud。注册并获取API Key在Maestro官网注册后可以在设置中找到你的API密钥。创建设备配置文件在云平台或通过配置文件定义你要测试的设备矩阵。例如# maestro.config.yaml cloud: devices: - “iPhone 14 Pro, iOS 16” - “iPhone 12, iOS 15” - “Samsung Galaxy S23, Android 13” - “Google Pixel 6, Android 12”上传并执行使用CLI命令将测试流上传到云端执行。maestro cloud ./flows --apiKey YOUR_API_KEY分析报告在Maestro Cloud的仪表板上你可以看到所有设备上的测试结果汇总。哪个机型在哪个步骤失败了一目了然。你还可以查看每台设备上的执行视频、性能指标和日志快速定位是布局问题、性能问题还是设备特定的Bug。实操心得将云测试作为发布前的最后一道关卡。在每次构建生产版本Release Candidate后自动触发一次全面的Maestro Cloud测试。这能有效拦截那些在开发者和QA的高端设备上无法复现但在低端或特定厂商设备上才会出现的兼容性问题。6. 常见问题排查与性能优化实录6.1 典型问题与解决方案速查表在实际使用中你肯定会遇到各种问题。下面是我总结的一些常见“坑”及其解决方法。问题现象可能原因排查步骤与解决方案Element ‘…’ not found1. 元素选择器写错文本、ID不匹配。2. 页面尚未加载完成。3. 元素在屏幕外如需要滚动。4. 元素存在于WebView或Flutter等非原生视图。1. 使用maestro studio命令启动审查工具实时查看元素树确认正确的选择器。2. 在操作前添加- waitForAnimationToEnd或适当增加timeout如assertVisible: “元素”, timeout: 60000。3. 在操作前添加- scroll或- scrollUntilVisible: “目标元素”。4. 对于Flutter确保使用flutter_driver或integration_test生成的兼容ID。对于WebView可能需要启用原生辅助功能或使用坐标点击。测试在CI中通过本地失败或反之1. 设备状态不同已登录/未登录有缓存/无缓存。2. 网络环境差异Mock服务器状态不同。3. 应用版本不同。1.始终以确定状态开始测试在测试流开头使用- clearState和- launchApp。对于需要特定状态的测试如已登录使用runFlow先执行登录流程。2.隔离测试环境使用独立的Mock服务器或测试专用API端点。在CI中确保网络可达。3.固化应用版本在CI中明确安装指定版本的APK/IPA避免使用本地可能已更新的版本。输入文本错位或失败1. 焦点未正确切换到输入框。2. 键盘未弹出遮挡了“确定”按钮。3. 输入法问题。1. 在inputText前明确使用tapOn点击输入框。2. 在输入完成后使用- hideKeyboard。3. 在测试前将模拟器/设备的默认输入法切换为系统自带的如Android的“English (US)”键盘。测试执行速度慢1. 模拟器/真机性能差。2. 使用了大量sleep或隐式等待。3. 断言等待超时设置过长。1. 在CI中使用性能更好的机器和模拟器镜像如Google APIs Intel x86_64。2.避免使用- sleep尽量用assertVisible或waitForAnimationToEnd代替它们会在条件满足后立即继续。3. 为assertVisible设置合理的超时默认30秒可能太长根据页面加载性能调整为10-15秒。clearState后应用崩溃应用代码可能没有正确处理干净安装后的初始化流程。这是一个应用本身的Bug。Maestro的clearState模拟了首次安装。测试发现了应用在特定初始化路径上的崩溃需要反馈给开发修复。这正是自动化测试的价值所在。6.2 性能优化让测试跑得更快更稳并行化执行如果你的测试套件中有大量独立的测试流如测试不同功能模块可以在CI中利用矩阵策略并行运行。在GitHub Actions中可以启动多个模拟器实例同时运行不同的测试集。测试流分割与聚合将冗长的测试流拆分成多个小的、功能独立的流。然后使用一个聚合配置文件maestro.yaml来组织它们。这样不仅便于维护也便于并行执行和选择性地运行。# maestro.yaml flows: - “flows/smoke/” # 运行smoke目录下所有流 - “flows/regression/login.yaml” - “flows/regression/checkout.yaml”运行maestro test .即可执行所有。智能等待拒绝sleep这是最重要的优化原则。sleep 5000意味着无论页面是否准备好都死等5秒。用assertVisible或waitForAnimationToEnd代替测试会在元素出现或动画结束后立即继续通常能节省大量时间。复用设备会话对于一组相关的测试可以考虑不每次都用clearStatelaunchApp而是在一个“干净”的应用状态下顺序执行多个测试流。但这需要精心设计测试顺序和数据确保测试间不互相污染对维护性要求较高需权衡利弊。利用Maestro Cloud的智能调度云平台会自动选择空闲、健康的设备来执行你的测试并管理整个队列这比自己维护设备农场要高效和稳定得多。从“RunMaestro/Maestro”这个项目标题出发我们深入探讨了一个现代移动端UI自动化测试框架如何通过极简的声明式语法、强大的架构设计和丰富的生态工具将测试从一项繁琐、易碎的技术活转变为一套高效、可靠且易于协作的质量保障流程。它降低的不仅是编写测试的门槛更是维护测试的心智负担。无论是个人开发者快速验证核心流程还是大型团队构建复杂的回归测试套件Maestro都提供了一条清晰且高效的路径。真正开始用它编写测试后你可能会和我有同样的感受那些曾经令人头疼的等待、定位和调试问题终于不再是阻碍我们追求高质量交付的绊脚石了。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…