ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

e2e移动引擎架构解析:agent-device如何驱动iOS与Android

e2e移动引擎架构解析:agent-device如何驱动iOS与Android e2e移动引擎架构解析agent-device如何驱动iOS与Android【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2ee2e 的移动引擎e2e-dev/mobile基于agent-device构建让同一套测试代码同时驱动iOS 模拟器、Android 模拟器与真机。它和浏览器引擎共享同一份e2e/engine契约测试只面向agent、screen、expect、device编写核心框架甚至不知道这个包的存在。本文拆解它的分层架构、设备池调度、iOS/Android 角色映射与托管设备扩展点。️ 一张图看懂移动引擎的分层架构整个移动引擎可以分为四层依赖方向自上而下单向流动层职责源码位置测试代码agent/screen/expect/device与 Web 测试完全同形apps/mobile-benchmark/引擎契约defineEngine声明 observe / locate / perform 等能力packages/e2e/src/engine/移动引擎一个 agent-device 会话对应一个 worker翻译契约词汇packages/mobile/src/surface.tsagent-device与模拟器、模拟器/真机通信的底层客户端依赖包关键设计是依赖倒置e2e核心不 import 任何移动端代码移动引擎反过来从核心导入契约并用 defineEngine 自证能力因此它和其他引擎一样接受同一套校验与能力评级engine.ts。⚙️mobile()一行代码背后引擎如何被装配配置里一句mobile({ platform: ios })会创建AgentDeviceSurfacesurface.ts再由 mobile() 包装成引擎句柄。契约各成员在移动端的落点如下契约成员移动端实现observe抓取可访问性树快照投影为通用角色 坐标 视口像素按需附带且密码框全部打码locatescreen全部查询外加 agent-device 选择器device.locator(roleNavigationBar idAbout)performtap、双击、长按、填充、勾选、滑动、拖拽等触摸动作sessionapp.back()/app.restart()/app.clearState()设备没有 URLapp.open()即一次全新启动artifacts打码截图、MP4 录屏可见触摸指示videoTouches: false可隐藏fixturesdevice夹具——浏览器引擎贡献browser移动引擎贡献device 设备池与预热每个 worker 独占一台设备DevicePool 决定哪个 worker 摸哪台设备device选项有四种形态不写自动发现平台下所有已启动设备一个都不在线就帮你在启动一台单个字符串指定一台模拟器/模拟器名称或真机名池大小为 1字符串数组设备池列表第 n 项绑定第 n 个 worker 槽DeviceProvider 对象从设备农场租用托管设备后文详述。运行计时开始前的预热warm逐台串行执行启动设备 → 预热 iOS 自动化 runner预算足够覆盖冷启动的模拟器→ 打开目标应用让会话落位。串行是刻意的——多台设备同时冷启会与宿主和守护进程争抢资源把后面的槽位挤出launchTimeout。每台设备的会话名形如e2e-target-slot保证互不串线。 iOS 与 Android 的角色映射可访问性树如何变成通用词汇移动设备没有 DOM[nodes.ts](https://link.gitcode.com/i/4ed81cc788ac17c78f31b8a85c4dab6c)负责把 agent-device 返回的扁平节点列表重建为树并把平台元素类型投影成与 Web 一致的闭合角色词汇表iOS 类型Android 类型契约角色ButtonButton/MaterialButtonbuttonTextField/SecureTextFieldEditTexttextboxCellRecyclerView项listitemNavigationBar折叠工具栏collapsing_toolbarnavigationTextViewiOS 上是编辑器TextViewtextSwitch/ToggleSwitch/SwitchMaterialswitch投影层还处理了几个易踩坑的细节React Native 特判RN 在 iOS 上把checkbox, checked这类角色描述写进无障碍值引擎会反向解析还原真实角色与状态nodes.ts系统栏过滤Android 状态栏、导航栏属于com.android.systemui时钟和信号图标一变就会让回放缓存锚点失效投影时整条剔除屏幕标题iOS 读导航栏、Android 读折叠工具栏screenTitle用于下文的回放缓存。 动作执行tap、swipe 如何安全落到设备上DEVICE_ACTIONS 声明了设备支持的全部动作tap、doubleTap、longPress、fill、clear、press、check/uncheck、focus、hover、dragTo、swipe。纯坐标层面则支持 tap、双击、长按与swipeToactions.tsselectOption、setInputFiles、scrollIntoView、右键点击等没有触摸等价物的会明确报UNSUPPORTED_CAPABILITY而不是静默失败。两个手感参数值得记住settle默认 150ms动作之后 UI 必须静默多久agent 才会再次观察transition默认 500ms随动作新出现或移动的控制件要滑行到位多久才能被点——iOS 在动画一开始就报最终坐标Android 报的是飞行中的坐标不等的后果就是点到控件身后的东西。另外长按默认1000msDEFAULT_LONG_PRESS_MSagent-device 自身默认不足半秒短于 React NativePressable的 500ms 阈值会被当成普通点击。 device 夹具不花模型调用钱的确定性控制Device 接口 暴露了约 20 个确定性设备方法测试直接调用、不经过模型每次调用在报告中记为device.method步骤分组方法网络与外观setNetwork断网、setAirplaneMode、setAppearance深色模式、setOrientation定位与传感器setLocation/clearLocation、fold折叠屏铰链姿态权限与生物识别setPermission、setBiometrics、enrollBiometrics应用生命周期installApp可reinstall干净装、openApp、closeApp、openLink深链/魔法链接、clearKeychain仅 iOS 模拟器输入辅助home、back、alert接受/忽略系统弹窗、dismissKeyboard、clipboard、setClipboard典型用例测试开始前device.setNetwork(offline)device.setAppearance(dark)先断网再切深色模式然后才让 agent 走流程。 截图打码与回放缓存移动端的两个关键细节安全字段打码截图写盘前所有secure-text-field、密码EditText的边界会被涂黑packages/mobile/src/png.ts打不了码的截图干脆不写盘——凭据永远不会留在测试产物里。回放缓存的位置锚点手机上没有地址栏引擎自己报告一个锚点bundle id / screen title标题来自导航栏/工具栏。在com.apple.Preferences / General录制的步骤只有当同一应用又停在同一屏幕才会重放纯 tap / 输入 / 滚动的流程可以零模型调用完整回放。️ 与 Web 引擎同源一份测试多端运行同一个示例应用Web 端长这样examples/with-next移动端与 Web 的差异只有这几处完整对照见 docs/mobile.mdx在 Web 上在设备上app.open(/path)打开 URL没有应用 URLapp.open()全新启动app.bundleId深链走device.openLink会话快照可保存/恢复模拟器没有可移植会话需每测试登录或预置数据Playwright trace无 trace截图自动打码缓存锚定页面路径缓存锚定bundle id / 屏幕标题跨端测试里若某个断言点名平台专属文案如 iOS 叫General、Android 叫Network internet给该测试加platforms: [ios]即可其余测试双端原样运行。☁️ 托管设备DeviceProvider 让设备农场即插即用不需要把真机插在工位上。DeviceProvider 是一个厂商无关的扩展点只需实现三个方法acquire开跑时为每个 worker 槽租一台设备返回含守护进程地址的租约LeasedDevices 并行租用因为托管会话从开通就开始计费release运行结束含失败、中断时归还保证不白烧机器record可选设备服务自带录屏时用它替代本地 agent-device 录屏。框架不认识任何厂商EAS 云模拟器有现成的easSimulators()其他服务照着 device-provider.ts典型会话 API建会话 → 轮询守护进程 → 停会话或 device-cloud-provider.ts 几十行代码即可接入。 快速上手三步跑通 iOS 与 Android准备工具链macOS 装 Xcode含 iOS 模拟器运行时其他平台装 Android SDK 与模拟器真机需 iOS 开发者模式 签名配置或 Android USB 调试授权。运行npx agent-device doctor自检安装引擎npm install --save-dev e2e e2e-dev/mobile或npx e2e init选择Mobile (iOS/Android)模板macOS 默认 iOS其他平台默认 Android声明 target每个平台一个 targetengine: mobile({ platform })app: { bundleId }或appPath指向.app/.apk构建产物装构建产物的动作由测试套件调用device.installApp()完成引擎自己不装。更多细节见 移动端官方文档 与 移动引擎参考仓库里的 apps/mobile-benchmark 是一个覆盖手势、虚拟列表、权限弹窗等 20 场景的基准测试应用配 packages/mobile 的完整说明是阅读源码前最好的活例子。总结e2e 移动引擎的精髓在于同契约、不同身体——契约层保证测试代码一字不改地跨端复用而设备池调度、角色投影、settle/transition 手感参数与安全打码这些移动端特有的脏活累活全部被封装在e2e-dev/mobile里由 agent-device 落到真实的 iOS 与 Android 上。【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表