GLM-5.3-FlashX 200 tokens/s 实测:MoE 架构与 API 调用指南
2026/11/4 4:25:37
你提供的这段代码是基于 Appium 框架封装的Android 移动端自动化测试核心操作类,命名为AndroidEncapsulateOperation,它把 Appium 原生的零散操作(如点击、滑动、长按、键盘模拟等)封装成了标准化、可配置的方法,方便在自动化测试脚本中直接调用。下面我会从整体功能、核心模块、关键逻辑、使用场景四个维度帮你完整解析。
这个类的核心目标是:将 Appium 对 Android 元素/页面的原生操作抽象成高内聚、低耦合的工具方法,对外暴露统一的调用入口,支持通过“操作关键字+参数”的方式执行不同的自动化动作,同时内置日志记录和异常提示,提升自动化脚本的可维护性和可读性。
整个类分为 5 个核心方法,每个方法负责一类操作,下面逐一对每个方法解析:
publicstaticStringselectOperation(AndroidElementae,Stringoperation,StringoperationValue)ae:目标下拉框元素(AndroidElement 类型);operation:操作关键字(固定值);operationValue:操作参数(如下拉选项的文本/值/索引)。| 关键字 | 作用 | 示例参数 |
|---|---|---|
| selectbyvisibletext | 通过选项可见文本选择 | “待执行” |
| selectbyvalue | 通过选项 value 属性选择 | “0” |
| selectbyindex | 通过选项索引选择 | “1” |
| isselect | 判断元素是否被选中 | 无(返回布尔值) |
switch-case匹配操作关键字,调用对应 Select 方法,同时记录日志并返回操作结果描述。publicstaticStringgetOperation(AndroidElementae,Stringoperation,Stringvalue)ae:目标元素;operation:属性获取关键字;value:自定义属性名(仅getattribute/getcssvalue需要)。| 关键字 | 作用 | 返回示例 |
|---|---|---|
| gettext | 获取元素显示文本 | “登录按钮” |
| gettagname | 获取元素标签名 | “button” |
| getattribute | 获取元素自定义属性 | 传 “resource-id” 返回 “com.xxx:id/login_btn” |
| getcssvalue | 获取元素 CSS 属性(H5 页面有效) | 传 “color” 返回 “#ffffff” |
switch-case匹配关键字,调用元素的属性获取方法,拼接结果描述并返回,同时记录日志。publicstaticStringobjectOperation(AndroidDriver<AndroidElement>appium,AndroidElementae,Stringoperation,StringoperationValue,Stringproperty,StringpropertyValue)appium:AndroidDriver 实例(驱动核心);ae:目标元素;operation:元素操作关键字;operationValue:操作参数(如输入文本、长按时长);property:元素定位属性(如 “id”/“xpath”);propertyValue:元素定位值(如 “com.xxx:id/input”)。| 关键字 | 作用 | 示例参数 |
|---|---|---|
| click | 点击元素 | 无 |
| sendkeys | 向输入框输入文本 | “13800138000” |
| clear | 清空输入框内容 | 无 |
| isenabled | 判断元素是否可用 | 无(返回 true/false) |
| isdisplayed | 判断元素是否可见 | 无(返回 true/false) |
| exjsob | 对元素执行 JS 脚本 | “arguments[0].click()” |
| longpresselement | 长按元素 | “3”(长按3秒) |
AndroidTouchAction构建长按动作,支持自定义长按时长(默认无时长,传数字则转换为 Duration);LogUtil记录详细日志(包含定位属性+值),方便调试。publicstaticStringalertOperation(AndroidDriver<AndroidElement>appium,Stringoperation)appium:AndroidDriver 实例;operation:弹窗操作关键字。| 关键字 | 作用 |
|---|---|
| alertaccept | 确认弹窗(点击“确定”/“允许”) |
| alertdismiss | 关闭弹窗(点击“取消”/“拒绝”) |
| alertgettext | 获取弹窗文本内容 |
appium.switchTo().alert()切换到弹窗上下文,再执行对应操作,适合处理系统级原生弹窗(注意:自定义弹窗需用元素定位操作)。publicstaticStringdriverOperation(AndroidDriver<AndroidElement>appium,Stringoperation,StringoperationValue)throwsException作用:处理针对整个 Android 页面/驱动的全局操作(滑动、键盘模拟、截图、切换上下文等),是自动化测试中处理“页面交互”的核心方法。
参数说明:
appium:AndroidDriver 实例;operation:全局操作关键字;operationValue:操作参数(如滑动时长+次数、坐标等)。核心子模块拆解:
| 关键字 | 作用 | 示例参数 |
|---|---|---|
| getcontexthandles | 获取所有上下文句柄 | “1”(返回第1个句柄) |
| gotocontext | 切换上下文(原生/H5) | “WEBVIEW_com.xxx” |
| getcontext | 获取当前上下文 | 无 |
支持 8 种滑动关键字(swipeup/swipedown/swipeleft/swiperight+swipepageup/swipepagedown/...),逻辑完全一致,仅滑动方向不同:
时长|次数(如 “2|3” 表示每次滑动持续2秒,滑动3次);AndroidBaseAppium工具类的滑动方法(如swipePageDown),封装了 Appium 原生的滑动逻辑。| 关键字 | 作用 | 示例参数 |
|---|---|---|
| longpressxy | 长按指定坐标 | "100 |
| pressxy | 点击指定坐标 | "100 |
| tapxy | 轻击指定坐标 | "100 |
| moveto | 拖动(多坐标点) | "100,200 |
AndroidTouchAction的press/moveTo/tap方法实现坐标级操作,支持多段拖动(moveto),适配不同滑动场景。| 关键字 | 作用 | 示例参数 |
|---|---|---|
| androidkeycode | 模拟手机键盘 | “ENTER”(回车)/ “BACK”(返回) |
| hidekeyboard | 隐藏手机软键盘 | 无 |
| exAdbShell | 执行 ADB 命令 | “adb shell input text 123456” |
| timeout | 设置全局等待时间 | “30”(元素等待30秒) |
| screenshot | 截取当前屏幕 | 无(自动生成带时间戳的截图名) |
| exjs | 执行全局 JS 脚本 | “window.scrollTo(0,100)” |
LogUtil.APP.info()记录详细日志,包含操作类型、参数、结果,方便自动化脚本调试和问题定位。moveto方法中处理了 Appium API 的“坐标偏移”问题(单段拖动用绝对坐标,多段拖动用相对偏移);longpresselement支持自定义时长(默认无时长),适配不同应用的长按触发逻辑。AndroidBaseAppium:封装了滑动、截图等底层方法;ChangString:提供数字校验等字符串工具;LogUtil:日志工具;cn.hutool.core.util.StrUtil:Hutool 字符串工具(判断参数非空)。下面是一个典型的调用示例,展示如何用这个类执行“登录操作”:
// 1. 初始化 AndroidDriver(省略驱动配置)AndroidDriver<AndroidElement>appium=newAndroidDriver<>(newURL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);// 2. 定位手机号输入框AndroidElementphoneInput=appium.findElement(By.id("com.xxx:id/phone_input"));// 输入手机号AndroidEncapsulateOperation.objectOperation(appium,phoneInput,"sendkeys","13800138000","id","com.xxx:id/phone_input");// 3. 定位密码输入框AndroidElementpwdInput=appium.findElement(By.id("com.xxx:id/pwd_input"));// 输入密码AndroidEncapsulateOperation.objectOperation(appium,pwdInput,"sendkeys","123456","id","com.xxx:id/pwd_input");// 4. 定位登录按钮AndroidElementloginBtn=appium.findElement(By.id("com.xxx:id/login_btn"));// 点击登录AndroidEncapsulateOperation.objectOperation(appium,loginBtn,"click","","id","com.xxx:id/login_btn");// 5. 滑动页面查找“我的”入口AndroidEncapsulateOperation.driverOperation(appium,"swipeup","2|1");// 6. 截图保存AndroidEncapsulateOperation.driverOperation(appium,"screenshot","");